AWS - Lambda Privesc
lambda
Ulteriori informazioni su lambda in:
pageAWS - Lambda Enumiam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)
iam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)Gli utenti con le autorizzazioni iam:PassRole
, lambda:CreateFunction
, e lambda:InvokeFunction
possono aumentare i loro privilegi.
Possono creare una nuova funzione Lambda e assegnarle un ruolo IAM esistente, concedendo alla funzione le autorizzazioni associate a quel ruolo. L'utente può quindi scrivere e caricare codice in questa funzione Lambda (ad esempio un reverse shell).
Una volta configurata la funzione, l'utente può attivare la sua esecuzione e le azioni previste invocando la funzione Lambda tramite l'API AWS. Questo approccio consente efficacemente all'utente di eseguire attività in modo indiretto attraverso la funzione Lambda, operando con il livello di accesso concesso dal ruolo IAM associato ad essa.\
Un attaccante potrebbe sfruttare questo per ottenere una reverse shell e rubare il token:
Puoi anche abusare delle autorizzazioni del ruolo lambda dalla stessa funzione lambda. Se il ruolo lambda avesse abbastanza autorizzazioni, potresti usarlo per concederti i diritti di amministratore:
È anche possibile rivelare le credenziali del ruolo della lambda senza necessità di una connessione esterna. Questo sarebbe utile per le Lambdas isolate di rete utilizzate per compiti interni. Se ci sono gruppi di sicurezza sconosciuti che filtrano le tue shell inverse, questo pezzo di codice ti permetterà di rivelare direttamente le credenziali come output della lambda.
Impatto Potenziale: Privesc diretto al ruolo di servizio lambda arbitrario specificato.
Nota che anche se potrebbe sembrare interessante lambda:InvokeAsync
non consente da solo di eseguire aws lambda invoke-async
, è necessario anche lambda:InvokeFunction
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
Come nello scenario precedente, puoi concederti il permesso lambda:InvokeFunction
se hai il permesso lambda:AddPermission
Impatto Potenziale: Privesc diretto al ruolo di servizio lambda arbitrario specificato.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
Gli utenti con le autorizzazioni iam:PassRole
, lambda:CreateFunction
, e lambda:CreateEventSourceMapping
(e potenzialmente dynamodb:PutItem
e dynamodb:CreateTable
) possono escalare privilegi indirettamente anche senza lambda:InvokeFunction
.
Possono creare una funzione Lambda con codice dannoso e assegnarle un ruolo IAM esistente.
Invece di invocare direttamente la Lambda, l'utente configura o utilizza una tabella DynamoDB esistente, collegandola alla Lambda tramite un mapping della sorgente degli eventi. Questa configurazione garantisce che la funzione Lambda venga attivata automaticamente all'ingresso di un nuovo elemento nella tabella, sia per azione dell'utente che di un altro processo, attivando indirettamente la funzione Lambda ed eseguendo il codice con le autorizzazioni del ruolo IAM passato.
Se DynamoDB è già attivo nell'ambiente AWS, l'utente deve solo stabilire il mapping della sorgente degli eventi per la funzione Lambda. Tuttavia, se DynamoDB non è in uso, l'utente deve creare una nuova tabella abilitando lo streaming:
Ora è possibile connettere la funzione Lambda alla tabella DynamoDB creando un mapping della sorgente degli eventi:
Con la funzione Lambda collegata allo stream DynamoDB, l'attaccante può attivare indirettamente la Lambda attivando lo stream DynamoDB. Ciò può essere realizzato inserendo un elemento nella tabella DynamoDB:
Impatto Potenziale: Privesc diretto al ruolo di servizio lambda specificato.
lambda:AddPermission
lambda:AddPermission
Un attaccante con questa autorizzazione può concedersi (o concedere ad altri) qualsiasi permesso (questo genera politiche basate sulle risorse per concedere l'accesso alla risorsa):
Impatto Potenziale: Privesc diretto al ruolo di servizio lambda utilizzato concedendo il permesso di modificare il codice e eseguirlo.
lambda:AddLayerVersionPermission
lambda:AddLayerVersionPermission
Un attaccante con questo permesso può concedersi (o concedere ad altri) il permesso lambda:GetLayerVersion
. Potrebbe accedere al layer e cercare vulnerabilità o informazioni sensibili.
Impatto Potenziale: Potenziale accesso a informazioni sensibili.
lambda:UpdateFunctionCode
lambda:UpdateFunctionCode
Gli utenti che possiedono il permesso lambda:UpdateFunctionCode
hanno il potenziale per modificare il codice di una funzione Lambda esistente collegata a un ruolo IAM.
L'attaccante può modificare il codice della lambda per estrarre le credenziali IAM.
Anche se l'attaccante potrebbe non avere la capacità diretta di invocare la funzione, se la funzione Lambda è preesistente e operativa, è probabile che venga attivata attraverso flussi di lavoro o eventi esistenti, facilitando indirettamente l'esecuzione del codice modificato.
Impatto Potenziale: Privesc diretta al ruolo di servizio lambda utilizzato.
lambda:UpdateFunctionConfiguration
lambda:UpdateFunctionConfiguration
Introduzione
Lambda Layers consente di includere codice nella funzione lambda ma memorizzandolo separatamente, in modo che il codice della funzione possa rimanere piccolo e diverse funzioni possano condividere il codice.
All'interno di lambda è possibile controllare i percorsi da cui il codice Python viene caricato con una funzione come la seguente:
Questi sono i percorsi:
/var/task
/opt/python/lib/python3.7/site-packages
/opt/python
/var/runtime
/var/lang/lib/python37.zip
/var/lang/lib/python3.7
/var/lang/lib/python3.7/lib-dynload
/var/lang/lib/python3.7/site-packages
/opt/python/lib/python3.7/site-packages
/opt/python
Ad esempio, la libreria boto3 viene caricata da /var/runtime/boto3
(4a posizione).
Sfruttamento
È possibile abusare dell'autorizzazione lambda:UpdateFunctionConfiguration
per aggiungere un nuovo layer a una funzione lambda. Per eseguire codice arbitrario, questo layer deve contenere una libreria che la lambda importerà. Se è possibile leggere il codice della lambda, potresti trovarlo facilmente, nota anche che potrebbe essere possibile che la lambda stia già utilizzando un layer e potresti scaricare il layer e aggiungere il tuo codice lì.
Ad esempio, supponiamo che la lambda stia utilizzando la libreria boto3, questo creerà un layer locale con l'ultima versione della libreria:
Puoi aprire ./lambda_layer/boto3/__init__.py
e aggiungere il backdoor nel codice globale (una funzione per esfiltrare credenziali o ottenere una shell inversa per esempio).
Successivamente, comprimi la directory ./lambda_layer
e carica il nuovo strato lambda nel tuo account (o in quello della vittima, ma potresti non avere le autorizzazioni necessarie).
Nota che devi creare una cartella python e mettere le librerie al suo interno per sovrascrivere /opt/python/boto3. Inoltre, lo strato deve essere compatibile con la versione di Python utilizzata dalla lambda e se lo carichi nel tuo account, deve essere nella stessa regione:
Ora, rendi il layer lambda caricato accessibile da qualsiasi account:
E collega il lambda layer alla funzione lambda della vittima:
Il passo successivo sarebbe o invocare la funzione noi stessi se possibile o aspettare che venga invocata tramite mezzi normali, che è il metodo più sicuro.
Un modo più stealth per sfruttare questa vulnerabilità può essere trovato in:
pageAWS - Lambda Layers PersistenceImpatto Potenziale: Privesc diretto al ruolo di servizio lambda utilizzato.
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Forse con quei permessi sei in grado di creare una funzione ed eseguirla chiamando l'URL... ma potrei trovare un modo per testarlo, quindi fammi sapere se ci riesci!
Lambda MitM
Alcune lambda stanno ricevendo informazioni sensibili dagli utenti nei parametri. Se ottieni RCE in una di esse, puoi esfiltrare le informazioni che gli altri utenti stanno inviando ad essa, controlla in:
pageAWS - Steal Lambda RequestsRiferimenti
Last updated