# AWS - Lambda Enum

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

## Lambda

Amazon Web Services (AWS) Lambda è descritta come un **servizio di calcolo** che consente l'esecuzione di codice senza la necessità di provisioning o gestione del server. È caratterizzata dalla sua capacità di **gestire automaticamente l'allocazione delle risorse** necessarie per l'esecuzione del codice, garantendo funzionalità come alta disponibilità, scalabilità e sicurezza. Un aspetto significativo di Lambda è il suo modello di pricing, dove **i costi sono basati esclusivamente sul tempo di calcolo utilizzato**, eliminando la necessità di investimenti iniziali o obblighi a lungo termine.

Per chiamare una lambda è possibile farlo **tanto frequentemente quanto si desidera** (con Cloudwatch), **esporre** un **endpoint URL** e chiamarlo, chiamarlo tramite **API Gateway** o anche in base a **eventi** come **cambiamenti** nei dati in un **S3** bucket o aggiornamenti a una tabella **DynamoDB**.

Il **codice** di una lambda è memorizzato in **`/var/task`**.

### Lambda Aliases Weights

Una Lambda può avere **diverse versioni**.\
E può avere **più di 1** versione esposta tramite **alias**. I **pesi** di **ciascuna** delle **versioni** esposte all'interno di un alias decideranno **quale alias riceve l'invocazione** (può essere 90%-10% ad esempio).\
Se il codice di **uno** degli alias è **vulnerabile**, puoi inviare **richieste fino a quando la versione vulnerabile** riceve l'exploit.

![](<../../../images/image (223).png>)

### Resource Policies

Le politiche delle risorse Lambda consentono di **dare accesso ad altri servizi/account per invocare** la lambda, ad esempio.\
Ad esempio, questa è la politica per consentire **a chiunque di accedere a una lambda esposta tramite URL**:

<figure><img src="https://lh4.googleusercontent.com/4PNFKBdzr3nMrPqeKkTslgwWDKxkXMdQ1SNdv7NPHykj3GX8wODrQyXOFbjk4fxHfZ8pDm5ijWgk2Vq2EGXiPRT3TQfZf1fHycvdEKBuDxJDYos1CJeMHXSeg86ZB-Ol7CNtten6xkVFQj6AhDUEWNQJrQ=s2048" alt=""><figcaption></figcaption></figure>

O questa per consentire a un API Gateway di invocarla:

<figure><img src="https://lh3.googleusercontent.com/Su0JlR0wBqb-99Z4N_2-_kMlX0Xzx2n_GpZuOPW5IeXR3FYbm8OHFDM3Ora1BpXiSjHpDVUlq4yEyXwaI3nBuze6DJ-wRf2ATsCuWbq0wuBCd34E9uIpqwheE6Cc_PopviI_93O_j2ZKXc1-AJtsBoLVUw=s2048" alt=""><figcaption></figcaption></figure>

### Lambda Database Proxies

Quando ci sono **centinaia** di **richieste lambda concorrenti**, se ognuna di esse deve **connettersi e chiudere una connessione a un database**, semplicemente non funzionerà (le lambdas sono senza stato, non possono mantenere le connessioni aperte).\
Quindi, se le tue **funzioni Lambda interagiscono con RDS Proxy invece** della tua istanza di database. Gestisce il pooling delle connessioni necessario per scalare molte connessioni simultanee create da funzioni Lambda concorrenti. Questo consente alle tue applicazioni Lambda di **riutilizzare le connessioni esistenti**, piuttosto che creare nuove connessioni per ogni invocazione della funzione.

### Lambda EFS Filesystems

Per preservare e persino condividere i dati, **le Lambdas possono accedere a EFS e montarle**, in modo che Lambda possa leggere e scrivere da esse.

### Lambda Layers

Un layer Lambda è un archivio .zip che **può contenere codice aggiuntivo** o altro contenuto. Un layer può contenere librerie, un [runtime personalizzato](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html), dati o file di configurazione.

È possibile includere fino a **cinque layer per funzione**. Quando includi un layer in una funzione, i **contenuti vengono estratti nella directory `/opt`** nell'ambiente di esecuzione.

Per **definizione**, i **layer** che crei sono **privati** al tuo account AWS. Puoi scegliere di **condividere** un layer con altri account o di **rendere** il layer **pubblico**. Se le tue funzioni consumano un layer pubblicato da un altro account, le tue funzioni possono **continuare a utilizzare la versione del layer dopo che è stata eliminata, o dopo che il tuo permesso di accesso al layer è stato revocato**. Tuttavia, non puoi creare una nuova funzione o aggiornare funzioni utilizzando una versione di layer eliminata.

Le funzioni distribuite come immagine del contenitore non utilizzano layer. Invece, impacchetti il tuo runtime preferito, librerie e altre dipendenze nell'immagine del contenitore quando costruisci l'immagine.

### Lambda Extensions

Le estensioni Lambda migliorano le funzioni integrandosi con vari **strumenti di monitoraggio, osservabilità, sicurezza e governance**. Queste estensioni, aggiunte tramite [.zip archive utilizzando i layer Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) o incluse nelle [distribuzioni di immagini del contenitore](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/), operano in due modalità: **interna** ed **esterna**.

- Le **estensioni interne** si fondono con il processo di runtime, manipolando il suo avvio utilizzando **variabili ambientali specifiche del linguaggio** e **script wrapper**. Questa personalizzazione si applica a una gamma di runtime, inclusi **Java Correto 8 e 11, Node.js 10 e 12, e .NET Core 3.1**.
- Le **estensioni esterne** vengono eseguite come processi separati, mantenendo l'allineamento operativo con il ciclo di vita della funzione Lambda. Sono compatibili con vari runtime come **Node.js 10 e 12, Python 3.7 e 3.8, Ruby 2.5 e 2.7, Java Corretto 8 e 11, .NET Core 3.1**, e **runtime personalizzati**.

### Enumeration
```bash
aws lambda get-account-settings

# List functions and get extra config info
aws lambda list-functions
aws lambda get-function --function-name <function_name>
aws lambda get-function-configuration --function-name <function_name>
aws lambda list-function-event-invoke-configs --function-name <function_name>
## Check for creds in env vars
aws lambda list-functions | jq '.Functions[].Environment'
## Download & check the source code
aws lambda get-function --function-name "<func_name>" --query 'Code.Location'
wget -O lambda-function.zip <url-from-previous-query>

# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name <function_name>
aws lambda get-function-url-config --function-name <function_name>

# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name <function_name>

# Versions and Aliases
aws lambda list-versions-by-function --function-name <func_name>
aws lambda list-aliases --function-name <func_name>

# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name <name>
aws lambda get-layer-version --layer-name <name> --version-number <ver>
aws lambda get-layer-version-by-arn --arn <name> #Get external ARNs

# List other metadata
aws lambda list-event-source-mappings
aws lambda list-code-signing-configs
aws lambda list-functions-by-code-signing-config --code-signing-config-arn <arn>
```
### Invochare una lambda

#### Manuale
```bash
# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## Some functions will expect parameters, they will access them with something like:
## target_policys = event['policy_names']
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt
```
#### Tramite URL esposta
```bash
aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config   --function-name <function_name> #Get lambda URL
```
#### Chiama la funzione Lambda tramite URL

Ora è il momento di scoprire le possibili funzioni lambda da eseguire:
```
aws --region us-west-2 --profile level6 lambda list-functions
```
![](<../../../images/image (262).png>)

Una funzione lambda chiamata "Level6" è disponibile. Scopriamo come chiamarla:
```bash
aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6
```
![](<../../../images/image (102).png>)

Ora che conosci il nome e l'ID, puoi ottenere il Nome:
```bash
aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"
```
![](<../../../images/image (237).png>)

E infine chiama la funzione accedendo (nota che l'ID, il Nome e il nome della funzione appaiono nell'URL): [https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6](https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6)

`URL:`**`https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>`**

#### Altri Trigger

Ci sono molte altre fonti che possono attivare un lambda

<figure><img src="../../../images/image (167).png" alt=""><figcaption></figcaption></figure>

### Privesc

Nella pagina seguente puoi controllare come **abusare dei permessi di Lambda per escalare i privilegi**:

{{#ref}}
../aws-privilege-escalation/aws-lambda-privesc/README.md
{{#endref}}

### Accesso Non Autenticato

{{#ref}}
../aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access/README.md
{{#endref}}

### Post Exploitation

{{#ref}}
../aws-post-exploitation/aws-lambda-post-exploitation/
{{#endref}}

### Persistenza

{{#ref}}
../aws-persistence/aws-lambda-persistence/
{{#endref}}

## Riferimenti

- [https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer)
- [https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/](https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/)

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