AWS - Lambda Privesc
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Više informacija o lambda u:
AWS - Lambda Enumiam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)Korisnici sa iam:PassRole
, lambda:CreateFunction
, i lambda:InvokeFunction
dozvolama mogu da eskaliraju svoje privilegije.
Mogu napraviti 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 rev shell-om).
Kada je funkcija postavljena, korisnik može pokrenuti njeno izvršavanje i nameravane akcije pozivajući Lambda funkciju putem AWS API-ja. Ovaj pristup efikasno omogućava korisniku da izvršava zadatke indirektno kroz Lambda funkciju, delujući sa nivoom pristupa koji je dodeljen IAM ulozi povezanoj sa njom.\
Napadač bi mogao da zloupotrebi ovo da dobije rev shell i ukrade token:
Možete takođe zloupotrebiti dozvole lambda uloge iz same lambda funkcije. Ako je lambda uloga imala dovoljno dozvola, mogli biste je iskoristiti da vam dodeli administratorska prava:
Takođe je moguće da se procure kredencijali lambda uloge bez potrebe za spoljnjom konekcijom. Ovo bi bilo korisno za Network isolated Lambdas korišćene za interne zadatke. Ako postoje nepoznate sigurnosne grupe koje filtriraju vaše obrnute ljuske, ovaj deo koda će vam omogućiti da direktno procurete kredencijale kao izlaz lambda.
Potencijalni uticaj: Direktno privesc na proizvoljnu lambda servisnu ulogu koja je navedena.
Imajte na umu da čak i ako izgleda zanimljivo lambda:InvokeAsync
ne omogućava samo po sebi da izvršite aws lambda invoke-async
, takođe vam je potrebna lambda:InvokeFunction
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
Kao u prethodnom scenariju, možete dodeliti sebi dozvolu lambda:InvokeFunction
ako imate dozvolu lambda:AddPermission
Potencijalni uticaj: Direktno privesc na proizvoljnu lambda servisnu ulogu koja je navedena.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
Korisnici sa iam:PassRole
, lambda:CreateFunction
, i lambda:CreateEventSourceMapping
dozvolama (i potencijalno dynamodb:PutItem
i dynamodb:CreateTable
) mogu indirektno escalate privileges čak i bez lambda:InvokeFunction
.
Mogu kreirati Lambda funkciju sa zloćudnim kodom i dodeliti joj postojeću IAM ulogu.
Umesto da direktno pozivaju Lambda, korisnik postavlja ili koristi postojeću DynamoDB tabelu, povezujući je sa Lambdom putem mape izvora događaja. Ova postavka osigurava da se Lambda funkcija automatski aktivira prilikom unosa novog stavke u tabelu, bilo akcijom korisnika ili nekim 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 da uspostavi mapiranje izvora događaja za Lambda funkciju. Međutim, ako se DynamoDB ne koristi, korisnik mora da kreira novu tabelu sa omogućenom striming funkcijom:
Sada je moguće povezati Lambda funkciju sa DynamoDB tabelom tako što ćete napraviti mapiranje izvora događaja:
Sa Lambda funkcijom povezanošću sa DynamoDB strimom, napadač može indirektno aktivirati Lambda funkciju aktiviranjem DynamoDB strima. To se može postići ubacivanjem stavke u DynamoDB tabelu:
Potencijalni Uticaj: Direktno privesc na ulogu lambda servisa koja je navedena.
lambda:AddPermission
Napadač sa ovom dozvolom može dodeliti sebi (ili drugima) bilo kakve dozvole (ovo generiše politike zasnovane na resursima za dodeljivanje pristupa resursu):
Potencijalni uticaj: Direktno privesc na lambda servisnu ulogu korišćenjem dozvole za modifikaciju koda i njegovo pokretanje.
lambda:AddLayerVersionPermission
Napadač sa ovom dozvolom može dati sebi (ili drugima) dozvolu lambda:GetLayerVersion
. Mogao bi pristupiti sloju i tražiti ranjivosti ili osetljive informacije.
Potencijalni uticaj: Potencijalni pristup osetljivim informacijama.
lambda:UpdateFunctionCode
Korisnici koji imaju lambda:UpdateFunctionCode
dozvolu imaju potencijal da modifikuju kod postojeće Lambda funkcije koja je povezana sa IAM rolom.
Napadač može modifikovati kod lambda funkcije da bi eksfiltrirao IAM akreditive.
Iako napadač možda nema direktnu sposobnost da pozove funkciju, ako je Lambda funkcija već postojala i operativna, verovatno će biti pokrenuta kroz postojeće radne tokove ili događaje, čime se indirektno olakšava izvršenje modifikovanog koda.
Potencijalni uticaj: Direktno privesc na ulogu lambda servisa koja se koristi.
lambda:UpdateFunctionConfiguration
Sa ovim dozvolama moguće je dodati varijable okruženja koje će uzrokovati da Lambda izvrši proizvoljan kod. Na primer, u python-u je moguće zloupotrebiti varijable okruženja PYTHONWARNING
i BROWSER
da bi se python proces izvršio proizvoljne komande:
Za druge skriptne jezike postoje druge env promenljive koje možete koristiti. Za više informacija proverite podsekcije skriptnih jezika u:
Lambda Layers omogućava uključivanje koda u vašu lambda funkciju, ali da se čuva 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 python kod učitava pomoću funkcije kao što je sledeća:
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).
Moguće je zloupotrebiti dozvolu lambda:UpdateFunctionConfiguration
da dodate novi sloj funkciji lambda. Da biste izvršili proizvoljan kod, ovaj sloj treba da sadrži neku biblioteku koju će lambda uvesti. Ako možete da pročitate kod lambda, mogli biste to lako pronaći, takođe imajte na umu da može biti moguće da lambda već koristi sloj i da možete preuzeti sloj i dodati svoj kod u njega.
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 kredencijala ili dobijanje reverzibilne ljuske, na primer).
Zatim, zipujte taj ./lambda_layer
direktorijum i otpremite novi lambda sloj na svoj račun (ili na račun žrtve, ali možda nemate dozvole za to).
Napomena: potrebno je da kreirate python folder i stavite biblioteke unutra da biste prepisali /opt/python/boto3. Takođe, sloj mora biti kompatibilan sa verzijom pythona koja se koristi u lambdi, a ako ga otpremite na svoj račun, mora biti u istoј regiji:
Sada, učinite učitani lambda sloj dostupnim za bilo koji nalog:
I prikačite lambda sloj na funkciju lambda žrtve:
The next step would be to either invoke the function ourselves if we can or to wait until it gets invoked by normal means–which is the safer method.
A more stealth way to exploit this vulnerability can be found in:
AWS - Lambda Layers PersistencePotencijalni uticaj: Direktno privesc na lambda servisnu ulogu koja se koristi.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Možda sa tim dozvolama možete kreirati funkciju i izvršiti je pozivajući URL... ali nisam mogao da pronađem način da to testiram, pa javite mi ako uspete!
Neki lambdas će primati osetljive informacije od korisnika u parametrima. Ako dobijete RCE u jednom od njih, možete eksfiltrirati informacije koje drugi korisnici šalju, proverite to u:
AWS - Steal Lambda RequestsLearn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)