AWS - Lambda Privesc
lambda
Više informacija o lambda funkcijama:
AWS - Lambda Enumiam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)
iam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)Korisnici sa dozvolama iam:PassRole
, lambda:CreateFunction
, i lambda:InvokeFunction
mogu eskalirati svoje privilegije.
Mogu kreirati novu Lambda funkciju i dodeliti joj postojeću IAM ulogu, dajući funkciji dozvole povezane sa tom ulogom. Korisnik može zatim napisati i otpremiti kod u ovu Lambda funkciju (na primer, sa reverzibilnom ljuskom).
Kada je funkcija postavljena, korisnik može pokrenuti njeno izvršavanje i željene akcije pozivanjem Lambda funkcije putem AWS API-ja. Ovaj pristup omogućava korisniku da efikasno obavlja zadatke neizravno putem Lambda funkcije, radeći sa nivoom pristupa koji je odobren IAM ulozi koja je povezana sa njom.\
Napadač bi mogao iskoristiti ovo da dobije reverzibilnu ljusku i ukrade token:
Možete takođe zloupotrebiti dozvole uloge lambda funkcije iz same lambda funkcije. Ako je uloga lambda funkcije imala dovoljno dozvola, mogli biste je koristiti da vam dodeli administratorska prava:
Takođe je moguće procuriti akreditacije uloge lambda bez potrebe za spoljnom konekcijom. Ovo bi bilo korisno za Lambda funkcije izolovane sa mrežom korišćene za interne zadatke. Ako postoje nepoznate sigurnosne grupe koje filtriraju vaše reverzne ljuske, ovaj komad koda će vam omogućiti direktno procurivanje akreditacija kao izlaz lambda funkcije.
Potencijalni uticaj: Direktno privesc na određenu ulogu usluge lambda.
Imajte na umu da čak i ako deluje interesantno lambda:InvokeAsync
ne dozvoljava samostalno izvršavanje komande aws lambda invoke-async
, takođe vam je potrebno lambda:InvokeFunction
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
Kao i u prethodnom scenariju, možete dodeliti sebi dozvolu lambda:InvokeFunction
ako imate dozvolu lambda:AddPermission
Potencijalni uticaj: Direktno privesc na određenu ulogu usluge lambda.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
Korisnici sa dozvolama iam:PassRole
, lambda:CreateFunction
, i lambda:CreateEventSourceMapping
(i potencijalno dynamodb:PutItem
i dynamodb:CreateTable
) mogu indirektno povećati privilegije čak i bez lambda:InvokeFunction
.
Mogu kreirati Lambda funkciju sa zlonamernim kodom i dodeliti joj postojeću IAM ulogu.
Umesto direktnog pozivanja Lambda funkcije, korisnik postavlja ili koristi postojeću DynamoDB tabelu, povezujući je sa Lambdom putem mapiranja izvora događaja. Ovaj setup osigurava da Lambda funkcija bude automatski pokrenuta prilikom unosa novog elementa u tabelu, bilo korisnikovom akcijom ili drugim procesom, čime se indirektno poziva Lambda funkcija i izvršava kod sa dozvolama prosleđene IAM uloge.
Ako je DynamoDB već aktivan u AWS okruženju, korisnik samo treba uspostaviti mapiranje izvora događaja za Lambda funkciju. Međutim, ako se DynamoDB ne koristi, korisnik mora kreirati novu tabelu sa omogućenim strimovanjem:
Sada je moguće povezati Lambda funkciju sa DynamoDB tabelom tako što se kreira mapiranje izvora događaja:
Kada je Lambda funkcija povezana sa DynamoDB stream-om, napadač može indirektno pokrenuti Lambda funkciju aktiviranjem DynamoDB stream-a. To se može postići ubacivanjem stavke u DynamoDB tabelu:
Potencijalni uticaj: Direktno privesc na ulogu usluge lambda navedenu.
lambda:AddPermission
lambda:AddPermission
Napadač sa ovlašćenjem može dodeliti sebi (ili drugima) bilo koja ovlašćenja (ovo generiše politike zasnovane na resursima za dodelu pristupa resursu):
Potencijalni uticaj: Direktno privesc na ulogu usluge lambda korišćenjem dozvole za izmenu koda i pokretanje istog.
lambda:AddLayerVersionPermission
lambda:AddLayerVersionPermission
Napadač sa ovom dozvolom može sebi (ili drugima) dodeliti dozvolu lambda:GetLayerVersion
. Mogao bi pristupiti sloju i tražiti ranjivosti ili osetljive informacije.
Potencijalni uticaj: Potencijalni pristup osetljivim informacijama.
lambda:UpdateFunctionCode
lambda:UpdateFunctionCode
Korisnici koji imaju dozvolu lambda:UpdateFunctionCode
imaju mogućnost da modifikuju kod postojeće Lambda funkcije koja je povezana sa IAM ulogom.
Napadač može modifikovati kod lambda funkcije kako bi izfiltrirao IAM akreditive.
Iako napadač možda nema direktnu sposobnost da pozove funkciju, ako je Lambda funkcija već postojeća i operativna, verovatno je da će biti pokrenuta kroz postojeće tokove rada ili događaje, time indirektno olakšavajući izvršenje modifikovanog koda.
Potencijalni uticaj: Direktno privesc na ulogu usluge lambda koja se koristi.
lambda:UpdateFunctionConfiguration
lambda:UpdateFunctionConfiguration
Uvod
Lambda slojevi omogućavaju uključivanje koda u vašu lambda funkciju, ali ga čuvaju odvojeno, tako da kod funkcije može ostati mali i više funkcija može deliti kod.
Unutar lambda možete proveriti putanje sa kojih se učitava Python kod pomoću funkcije poput sledeće:
Ovo su mesta:
/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
Na primer, biblioteka boto3 se učitava iz /var/runtime/boto3
(4. pozicija).
Eksploatacija
Moguće je zloupotrebiti dozvolu lambda:UpdateFunctionConfiguration
da dodamo novi sloj funkciji lambda. Da bismo izvršili proizvoljni kod, ovaj sloj mora sadržati neku biblioteku koju će lambda uvesti. Ako možete pročitati kod lambde, to možete lako pronaći, takođe imajte na umu da je moguće da lambda već koristi sloj i da možete preuzeti sloj i dodati svoj kod tamo.
Na primer, pretpostavimo da lambda koristi biblioteku boto3, ovo će kreirati lokalni sloj sa poslednjom verzijom biblioteke:
Možete otvoriti ./lambda_layer/boto3/__init__.py
i dodati backdoor u globalni kod (funkciju za eksfiltraciju akreditiva ili dobijanje reverznog šela na primer).
Zatim, zipujte taj ./lambda_layer
direktorijum i učitajte novi lambda sloj na svoj nalog (ili na nalog žrtve, ali možda nemate dozvole za ovo).
Imajte na umu da morate kreirati python folder i staviti biblioteke unutra da prepišete /opt/python/boto3. Takođe, sloj mora biti kompatibilan sa verzijom pythona koju koristi lambda i ako ga učitate na svoj nalog, mora biti u istom regionu:
Sada, omogućite da je postavljeni lambda sloj dostupan svakom nalogu:
I povežite lambda sloj sa ciljnom lambda funkcijom:
Sledeći korak bio bi ili pozvati funkciju sami ako možemo ili sačekati da bude pozvana na uobičajeni način - što je sigurnija metoda.
Još prikriveniji način za iskorišćavanje ove ranjivosti može se pronaći u:
AWS - Lambda Layers PersistencePotencijalni uticaj: Direktno povećanje privilegija na ulogu usluge lambda koja se koristi.
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Možda s tim dozvolama možete kreirati funkciju i izvršiti je pozivajući URL... ali nisam uspeo pronaći način da to testiram, pa mi javite ako vi uspete!
Lambda MitM
Neke lambda funkcije će primali osetljive informacije od korisnika u parametrima. Ako dobijete RCE u jednoj od njih, možete izfiltrirati informacije koje drugi korisnici šalju, proverite u:
AWS - Steal Lambda RequestsReference
Last updated