
Usa Terraform para crear tu propio campo de juegos de escalada de privilegios de AWS IAM vulnerable por diseño.
Use Terraform para crear tu propio campo de pruebas de escalada de privilegios en AWS IAM vulnerable por diseño.

IAM Vulnerable utiliza el binario de Terraform y tus credenciales de AWS para desplegar más de 250 recursos IAM en la cuenta de AWS que selecciones. En cuestión de minutos, puedes empezar a aprender cómo identificar y explotar configuraciones IAM vulnerables que permiten la escalada de privilegios.
Hola a todos. IAM Vulnerable sigue siendo inmensamente útil para entender los componentes básicos de la escalada de privilegios en AWS IAM. Sin embargo, unos años después de crear IAM vulnerable, creé CloudFoxable, una versión estilo CTF que enseña los fundamentos de la prueba de penetración en la nube de forma más holística. - @sethsec
Únete a nosotros en el servidor de Discord de RedSec
🦊 Rutas de escalada de privilegios actualmente soportadas: 31
Publicación del blog: IAM Vulnerable - Un campo de pruebas de escalada de privilegios en AWS IAM
Este inicio rápido describe un enfoque recomendado para poner en funcionamiento IAM Vulnerable en tu cuenta de AWS lo más rápido posible. Es posible que ya tengas muchos de estos pasos completados, o que quieras ajustar cosas para que funcionen con tu configuración actual. Consulta la sección Otros casos de uso en este repositorio para conocer algunas opciones de configuración adicionales.
aws sts get-caller-identity.git clone https://github.com/BishopFox/iam-vulnerablecd iam-vulnerable/terraform initexport TF_VAR_aws_local_profile=PROFILE_IN_AWS_CREDENTIALS_FILE_IF_OTHER_THAN_DEFAULTexport TF_VAR_aws_local_creds_file=FILE_LOCATION_IF_NON_DEFAULTterraform planLimpieza
Cada vez que quieras eliminar todos los recursos creados por IAM Vulnerable, puedes ejecutar estos comandos:
cd iam-vulnerable/terraform destroyLimpieza alternativa (cuando se pierde el estado de Terraform)
En el caso de que hayas desplegado iam-vulnerable usando Terraform pero ya no tengas acceso al archivo de estado (y terraform destroy no funcione), puedes utilizar los siguientes scripts de limpieza:```bash
./cleanup-scripts/cleanup_iam_vulnerable.py --dry-run
./cleanup-scripts/cleanup_iam_vulnerable.sh --dry-run
Estos scripts:
- Identificarán automáticamente todos los recursos vulnerables de IAM en tu cuenta de AWS
- Te mostrarán exactamente qué se eliminará antes de proceder
- Eliminarán los recursos en el orden adecuado para evitar conflictos de dependencias
- Soportarán perfiles de AWS y proporcionarán registro detallado
**Importante**: Siempre ejecuta con `--dry-run` primero para ver qué se eliminaría. Consulta `cleanup-scripts/CLEANUP_README.md` para instrucciones de uso detalladas.
## ¿Qué recursos se acaban de crear?
El binario de Terraform acaba de usar las credenciales de tu perfil de cuenta de AWS predeterminado para crear:
* **31 usuarios, roles y políticas**, cada uno con una ruta de explotación única hacia el acceso administrativo de la cuenta de pruebas
* Algunos usuarios, grupos, roles y políticas adicionales que son necesarios para materializar completamente ciertas rutas de explotación
* Algunos usuarios, roles y políticas adicionales que prueban las capacidades de detección de otras herramientas
Por defecto, cada rol creado por este módulo de Terraform es asumible por el usuario o rol que usaste para ejecutar Terraform.
* Si deseas que Terraform use un perfil distinto al perfil predeterminado, o deseas codificar el ARN de `assume_role_policy`, consulta [Otros casos de uso](#other-use-cases).
## ¿Cuánto va a costar esto?
Desplegar IAM vulnerable en su **configuración predeterminada no costará nada**. Consulta la siguiente sección para aprender cómo habilitar módulos no predeterminados que sí incurren en costos, y cuánto costará cada módulo por mes si lo despliegas.
# Un enfoque modular
IAM Vulnerable agrupa ciertos recursos en módulos. Algunos módulos están habilitados por defecto (los que no tienen implicaciones de costo), y otros están deshabilitados por defecto (los que incurren en costos si se despliegan). De esta manera, puedes habilitar módulos específicos según sea necesario.
Por ejemplo, cuando estés listo para jugar con las rutas de explotación como `ssm:StartSession` que involucran recursos fuera de IAM, puedes desplegar y desmontar estos recursos a demanda descomentando el módulo en el archivo `iam-vulnerable/main.tf` y volviendo a ejecutar `terraform apply`:```
# Uncomment the next four lines to create an ec2 instance and related resources
#module "ec2" {
# source = "./modules/non-free-resources/ec2"
# aws_assume_role_arn = (var.aws_assume_role_arn != "" ? var.aws_assume_role_arn : data.aws_caller_identity.current.arn)
#}
Después de descomentar el módulo ec2, ejecuta:```
terraform init
terraform apply
Ahora has desplegado los componentes necesarios para probar las rutas de escalada de privilegios de SSM.
## Módulos de Recursos Gratuitos
No hay costo por nada de lo desplegado dentro de `free-resources`:
| Nombre | Estado Predeterminado | Costo Estimado | Descripción |
| --- | --- | --- | --- |
| privesc-paths | Habilitado | Ninguno | Contiene todas las rutas de escalada de privilegios de IAM |
| tool-testing | Habilitado | Ninguno | Contiene casos de prueba que evalúan las capacidades de las diferentes herramientas de escalada de privilegios de IAM |
## Módulos de Recursos No Gratuitos
Desplegar estos módulos adicionales puede generar costo:
| Nombre | Estado Predeterminado | Costo Estimado | Descripción | Requerido para |
| --- | --- | --- | --- | --- |
| EC2 | Deshabilitado | :heavy_dollar_sign:<br>$4.50/mes | Crea una instancia EC2 y un grupo de seguridad que permite SSH desde cualquier lugar | `ssm-SendCommand`<br>`ssm-StartSession`<br>`ec2InstanceConnect-SendSSHPublicKey` |
| Lambda | Deshabilitado | :slightly_smiling_face:<br>El costo mensual depende del uso (el costo debería ser cero) | Crea una función Lambda | `Lambda-EditExistingLambdaFunctionWithRole` |
| Glue | Deshabilitado | :heavy_dollar_sign::heavy_dollar_sign::heavy_dollar_sign::heavy_dollar_sign:<br>$4/hora | Crea un endpoint de desarrollo de Glue | `Glue-UpdateExistingGlueDevEndpoint` |
| SageMaker | Deshabilitado | Aún no seguro | Crea un notebook de SageMaker | `sageMakerCreatePresignedNotebookURL` |
| CloudFormation | Deshabilitado | :slightly_smiling_face:<br>$0.40/mes por el secreto creado a través de CloudFormation. Nada o casi nada por la pila en sí | Crea una pila de CloudFormation que crea un secreto en Secrets Manager | `privesc-cloudFormationUpdateStack` |
# Rutas de Escalada de Privilegios Soportadas
| Nombre de la Ruta | Nombre de Perfil Vulnerable de IAM | Módulos No Predeterminados Requeridos | Referencias de Explotación |
| --- | --- | --- | --- |
| **Categoría: Permisos IAM en Otros Usuarios** | | | |
| IAM-CreateAccessKey | privesc4 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 04](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws)<br>:lock: [s3cur3.it IAMVulnerable - Part 3](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-3) |
| IAM-CreateLoginProfile | privesc5 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 05](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws)<br>:lock: [s3cur3.it IAMVulnerable - Part 3](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-3) |
| IAM-UpdateLoginProfile | privesc6 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 06](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws)<br>:lock: [s3cur3.it IAMVulnerable - Part 3](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-3) |
| **Categoría: PassRole a un Servicio** | | | |
| CloudFormation-PassExistingRoleToCloudFormation | privesc20 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 20](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| CodeBuild-CreateProjectPassRole | privesc-codeBuildProject | Ninguno | |
| DataPipeline-PassExistingRoleToNewDataPipeline | privesc21 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 21](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| EC2-CreateInstanceWithExistingProfile | privesc3 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 03](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws)<br>:lock: [s3cur3.it IAMVulnerable - Part 2](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-2) |
| Glue-PassExistingRoleToNewGlueDevEndpoint | privesc18 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 18](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| Lambda-PassExistingRoleToNewLambdaThenInvoke | privesc15 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 15](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| Lambda-PassRoleToNewLambdaThenTrigger | privesc16 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 16](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| SageMaker-CreateNotebookPassRole | privesc-sageNotebook | Ninguno | :rhinoceros: [AWS IAM Privilege Escalation - Method 2](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) |
| SageMaker-CreateTrainingJobPassRole | privesc-sageTraining | Ninguno | |
| SageMaker-CreateProcessingJobPassRole | privesc-sageProcessing | Ninguno | |
| **Categoría: Permisos en Políticas** | | | |
| IAM-AddUserToGroup | privesc13 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 13](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-AttachGroupPolicy | privesc8 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 08](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-AttachRolePolicy | privesc9 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 09](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-AttachUserPolicy | privesc7 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 07](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-CreateNewPolicyVersion | privesc1 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 01](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws)<br>:lock: [s3cur3.it IAMVulnerable - Part 1](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable) |
| IAM-PutGroupPolicy | privesc11 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 11](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-PutRolePolicy | privesc12 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 12](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-PutUserPolicy | privesc10 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 10](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-SetExistingDefaultPolicyVersion | privesc2 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 02](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws)<br>:lock: [s3cur3.it IAMVulnerable - Part 2](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-2) |
| **Categoría: Escalada de Privilegios usando Servicios AWS** | | | |
| EC2InstanceConnect-SendSSHPublicKey | privesc-instanceConnect | EC2 | 🔑 [AWS IAM privilege escalation paths](https://pswalia2u.medium.com/aws-iam-privilege-escalation-paths-cba36be1aa9e) |
| CloudFormation-UpdateStack | privesc-cfUpdateStack | CloudFormation | 🔑 [AWS IAM privilege escalation paths](https://pswalia2u.medium.com/aws-iam-privilege-escalation-paths-cba36be1aa9e) |
| Glue-UpdateExistingGlueDevEndpoint | privesc19 | Glue | :fox_face: [Well, That Escalated Quickly - Privesc 19](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| Lambda-EditExistingLambdaFunctionWithRole | privesc17 | Lambda | :fox_face: [Well, That Escalated Quickly - Privesc 17](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws)<br>:lock: [s3cur3.it IAMVulnerable - Part 4](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-4) |
| SageMakerCreatePresignedNotebookURL | privesc-sageUpdateURL | Sagemaker | :rhinoceros: [AWS IAM Privilege Escalation - Method 3](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) |
| SSM-SendCommand | privesc-ssm-command | EC2 | 🔑 [AWS IAM privilege escalation paths](https://pswalia2u.medium.com/aws-iam-privilege-escalation-paths-cba36be1aa9e) |
| SSM-StartSession | privesc-ssm-session | EC2 | 🔑 [AWS IAM privilege escalation paths](https://pswalia2u.medium.com/aws-iam-privilege-escalation-paths-cba36be1aa9e) |
| STS-AssumeRole | privesc-assumerole | Ninguno | 🔑 [AWS IAM privilege escalation paths](https://pswalia2u.medium.com/aws-iam-privilege-escalation-paths-cba36be1aa9e) |
| **Categoría: Actualización de una Política AssumeRole** | | | |
| IAM-UpdatingAssumeRolePolicy | privesc14 | Ninguno | :fox_face: [Well, That Escalated Quickly - Privesc 14](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
# Otros Casos de Uso
#### Predeterminado - Sin `terraform.tfvars` configurado
* Desplegar usando tu perfil AWS por defecto (Default)
* Todos los roles creados son asumibles por la entidad principal usada para ejecutar Terraform (especificada en tu perfil por defecto)
#### Usar un perfil diferente al predeterminado para ejecutar Terraform
* Copia `terraform.tfvars.example` a `terraform.tfvars`
* Descomenta la línea `#aws_local_profile = "profile_name"` e ingresa el nombre del perfil que deseas usar
* Si estás usando un perfil no predeterminado y aún quieres usar el archivo `aws_credentials_file_example`, puedes usar este comando para generar un archivo de credenciales AWS que funcione con el nombre de tu perfil no predeterminado (Gracias @scriptingislife)
* Recuerda reemplazar `nondefaultuser` con el nombre del perfil que estás usando):
* `tail -n +7 aws_credentials_file_example | sed -e "s/111111111111/$(aws sts get-caller-identity | grep Account | awk -F\" '{print $4}')/g;s/default/nondefaultuser/g" >> ~/.aws/credentials`
#### Usar un ARN diferente al del llamante como la entidad principal que puede asumir los roles recién creados
* Copia `terraform.tfvars.example` a `terraform.tfvars`
* Descomenta la línea `#aws_assume_role_arn = "arn:aws:iam::112233445566:user/you"` e ingresa el ARN que deseas usar
Una vez creados, cada uno de los roles de escalada de privilegios será asumible por la entidad principal (ARN) que especificaste.
#### Crear el recurso en la cuenta X, pero usar un ARN de la cuenta Y como la entidad principal que puede asumir los roles recién creados
Si has configurado perfiles de AWS CLI que asumen roles en otras cuentas, querrás especificar el nombre del perfil Y especificar manualmente el ARN que deseas usar para asumir los diferentes roles.
En el ejemplo a continuación, los recursos se crearán en la cuenta que está vinculada a `"prod-cross-org-access-role"`, pero cada rol que Terraform crea puede ser accedido por `"arn:aws:iam::112233445566:user/you"`, que pertenece a otra cuenta.```
aws_local_profile = "prod-cross-org-access-role"
aws_assume_role_arn = "arn:aws:iam::112233445566:user/you"
Todas estas herramientas utilizan Terraform para desplegar infraestructura intencionalmente vulnerable en AWS. Sin embargo, el enfoque de IAM Vulnerable es la escalada de privilegios de IAM, mientras que las otras herramientas no cubren la escalada de privilegios de IAM o solo cubren algunos escenarios.
Todas estas herramientas ayudan a identificar malas configuraciones existentes en tu entorno de AWS. Algunas, como Pacu, también te ayudan a explotar malas configuraciones. En contraste, IAM Vulnerable crea infraestructura intencionalmente vulnerable. Si realmente quieres aprender a usar herramientas como Principal Mapper (PMapper), AWSPX, Pacu y Cloudsplaining, IAM Vulnerable es para ti.
Yo también le tenía miedo a Terraform y a los proyectos que crearían recursos en mi cuenta antes de saber cómo funcionaba. Aquí hay algunas cosas que podrían aliviar tu ansiedad:
terraform plan es una simulación. Te muestra exactamente lo que se desplegará si ejecutas terraform apply antes de hacerlo realmente.terraform destroy en todo lo que hayas aplicado con terraform apply para empezar de cero.iam-vulnerable. Esta herramienta ejecuta terraform plan y calcula el costo mensual asociado con el plan tal como está configurado actualmente. Esta es la herramienta que usé para completar la tabla de estimaciones de costos de módulos anterior.Sí. Cada herramienta mantendrá su estado de Terraform por separado, pero todos los recursos serán creados, actualizados y eliminados en la misma cuenta, y pueden coexistir.
terraform applycp ~/.aws/credentials ~/.aws/credentials.backuptail -n +7 aws_credentials_file_example | sed s/111111111111/$(aws sts get-caller-identity | grep Account | awk -F\" '{print $4}')/g >> ~/.aws/credentials