AWS - Lambda Enum
Lambda
Amazon Web Services (AWS) Lambda è descritto come un servizio di calcolo che consente l'esecuzione di codice senza la necessità di fornire o gestire server. È caratterizzato dalla 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 prezzo, in cui le spese sono basate esclusivamente sul tempo di calcolo utilizzato, eliminando la necessità di investimenti iniziali o obblighi a lungo termine.
Per chiamare una lambda è possibile chiamarla frequentemente quanto si vuole (con Cloudwatch), esporre un endpoint URL e chiamarlo, chiamarlo tramite API Gateway o anche in base a eventi come cambiamenti ai dati in un bucket S3 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% per esempio). Se il codice di uno degli alias è vulnerabile puoi inviare richieste fino a quando la versione vulnerabile riceve l'exploit.
Resource Policies
Le politiche delle risorse Lambda consentono di dare accesso ad altri servizi/account per invocare la lambda, per esempio. Ad esempio, questa è la politica per consentire a chiunque di accedere a una lambda esposta tramite URL:
Oppure questa per consentire a un API Gateway di invocarla:
Lambda Database Proxies
Quando ci sono centinaia di richieste lambda concorrenti, se ciascuna 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 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, anziché creare nuove connessioni per ogni invocazione della funzione.
Lambda EFS Filesystems
Per preservare e persino condividere dati le Lambda possono accedere a EFS e montarli, quindi Lambda sarà in grado di leggere e scrivere da essi.
Lambda Layers
Un layer Lambda è un archivio file .zip che può contenere codice aggiuntivo o altro contenuto. Un layer può contenere librerie, un runtime personalizzato, 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 default, i layer che crei sono privati per il 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 account diverso, 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 del layer eliminata.
Le funzioni distribuite come immagine container non utilizzano layer. Invece, impacchetti il runtime preferito, le librerie e altre dipendenze nell'immagine container 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 archivi .zip utilizzando i layer Lambda o incluse nelle distribuzioni di immagini container, operano in due modalità: interna ed esterna.
Estensioni interne si fondono con il processo runtime, manipolando il suo avvio utilizzando variabili d'ambiente 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.
Estensioni esterne funzionano 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
Invoke a lambda
Manual
Accedi alla console AWS: Vai alla console AWS e accedi con le tue credenziali.
Naviga a Lambda: Nel menu dei servizi, seleziona "Lambda" sotto la sezione "Compute".
Seleziona la funzione Lambda: Trova e seleziona la funzione Lambda che desideri invocare.
Test della funzione: Clicca sul pulsante "Test" per aprire la finestra di configurazione del test.
Configura l'evento di test: Inserisci i dati di input necessari per la tua funzione Lambda nel campo di configurazione dell'evento di test.
Esegui il test: Clicca su "Save" per salvare l'evento di test, poi clicca su "Test" per invocare la funzione Lambda con i dati di input forniti.
Visualizza i risultati: Dopo l'esecuzione, i risultati dell'invocazione saranno mostrati nella console, inclusi eventuali output e log generati dalla funzione Lambda.
Via exposed URL
Se l'URL di un'API Gateway è esposto, possiamo enumerare le funzioni Lambda collegate.
Via IAM permissions
Se abbiamo accesso a un account con permessi IAM, possiamo utilizzare aws-cli
per enumerare le funzioni Lambda.
Via CloudFormation
Se abbiamo accesso a CloudFormation, possiamo enumerare le funzioni Lambda dai template.
Via Serverless Framework
Se l'applicazione è stata distribuita utilizzando Serverless Framework, possiamo enumerare le funzioni Lambda dal file serverless.yml
.
Via Terraform
Se l'infrastruttura è stata distribuita utilizzando Terraform, possiamo enumerare le funzioni Lambda dai file di configurazione.
Via CloudTrail
Se abbiamo accesso ai log di CloudTrail, possiamo cercare eventi relativi a Lambda.
Chiamare la funzione Lambda tramite URL
Ora è il momento di scoprire le possibili funzioni lambda da eseguire:
Una funzione lambda chiamata "Level6" è disponibile. Scopriamo come chiamarla:
Ora, che conosci il nome e l'ID puoi ottenere il Nome:
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 seguente pagina puoi vedere come abusare dei permessi Lambda per scalare i privilegi:
AWS - Lambda PrivescAccesso Non Autenticato
AWS - Lambda Unauthenticated AccessPost Exploitation
AWS - Lambda Post ExploitationPersistenza
AWS - Lambda PersistenceRiferimenti
Last updated