AWS - Lambda Enum

Impara l'hacking di AWS da zero a eroe con htARTE (Esperto Red Team di HackTricks AWS)!

Altri modi per supportare HackTricks:

Lambda

Amazon Web Services (AWS) Lambda è descritto come un servizio di calcolo che consente l'esecuzione del codice senza la necessità di fornire o gestire un server. È caratterizzato 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 le tariffe si basano esclusivamente sul tempo di calcolo utilizzato, eliminando la necessità di investimenti iniziali o obblighi a lungo termine.

Per chiamare una lambda è possibile chiamarla frequentemente come si desidera (con Cloudwatch), esporre un endpoint URL e chiamarla, chiamarla tramite API Gateway o anche in base a eventi come modifiche ai dati in un bucket S3 o aggiornamenti di una tabella DynamoDB.

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

Pesi degli Alias di Lambda

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 riceverà l'invocazione (può essere ad esempio 90%-10%). Se il codice di uno degli alias è vulnerabile è possibile inviare richieste fino a quando la versione vulnerabile riceve l'exploit.

Politiche delle Risorse di Lambda

Le politiche delle risorse di Lambda consentono di concedere l'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:

O questa per consentire a un API Gateway di invocarla:

Proxy del Database di Lambda

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

Filesystem EFS di Lambda

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

Strati di Lambda

Uno strato di Lambda è un archivio di file .zip che può contenere codice aggiuntivo o altro contenuto. Uno strato può contenere librerie, un runtime personalizzato, dati o file di configurazione.

È possibile includere fino a cinque strati per funzione. Quando si include uno strato in una funzione, i contenuti vengono estratti nella directory /opt nell'ambiente di esecuzione.

Per default, gli strati che crei sono privati per il tuo account AWS. Puoi scegliere di condividere uno strato con altri account o di renderlo pubblico. Se le tue funzioni consumano uno strato che un account diverso ha pubblicato, le tue funzioni possono continuare a utilizzare la versione dello strato dopo che è stata eliminata, o dopo che il tuo permesso di accesso allo strato è stato revocato. Tuttavia, non puoi creare una nuova funzione o aggiornare funzioni utilizzando una versione dello strato eliminata.

Le funzioni distribuite come immagine del contenitore non utilizzano gli strati. Invece, si impacchetta il runtime preferito, le librerie e altre dipendenze nell'immagine del contenitore durante la creazione dell'immagine.

Estensioni di Lambda

Le estensioni di Lambda migliorano le funzioni integrandosi con vari strumenti di monitoraggio, osservabilità, sicurezza e governance. Queste estensioni, aggiunte tramite .zip archives usando gli strati di Lambda o incluse in implementazioni di immagini del contenitore, operano in due modalità: interna ed esterna.

  • Le estensioni interne si fondono con il processo di runtime, manipolando il suo avvio utilizzando variabili d'ambiente specifiche del linguaggio e script wrapper. Questa personalizzazione si applica a una serie di runtime, tra cui 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.

Enumerazione

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>

Richiama una lambda

Manuale

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

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

Chiamare 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

Una funzione lambda chiamata "Level6" è disponibile. Scopriamo come chiamarla:

aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6

Ora che conosci il nome e l'ID, puoi ottenere il Nome:

aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"

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

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

Altri Trigger

Ci sono molte altre fonti che possono attivare una lambda

Privesc

Nella pagina seguente puoi controllare come abusare delle autorizzazioni Lambda per elevare i privilegi:

pageAWS - Lambda Privesc

Accesso non autenticato

pageAWS - Lambda Unauthenticated Access

Post Esploitation

pageAWS - Lambda Post Exploitation

Persistenza

pageAWS - Lambda Persistence

Riferimenti

Impara l'hacking AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated