AWS - Lambda Enum

Reading time: 8 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Lambda

Amazon Web Services (AWS) Lambda se opisuje kao računarska usluga koja omogućava izvršavanje koda bez potrebe za obezbeđivanjem ili upravljanjem serverima. Karakteriše se sposobnošću da automatski upravlja alokacijom resursa potrebnih za izvršavanje koda, obezbeđujući funkcije kao što su visoka dostupnost, skalabilnost i sigurnost. Značajan aspekt Lamde je njen model cena, gde se naplaćuje isključivo na osnovu vremena korišćenja računarskih resursa, eliminišući potrebu za inicijalnim ulaganjima ili dugoročnim obavezama.

Da biste pozvali lambda, moguće je pozvati je onoliko često koliko želite (sa Cloudwatch), izložiti URL endpoint i pozvati je, pozvati je putem API Gateway ili čak na osnovu događaja kao što su promene u podacima u S3 bucketu ili ažuriranja u DynamoDB tabeli.

Kod lambda je smešten u /var/task.

Lambda Aliases Weights

Lambda može imati several versions.
I može imati više od 1 verzije izložene putem aliases. Težine svake od verzija izloženih unutar aliasa će odlučiti koji alias prima poziv (može biti 90%-10% na primer).
Ako je kod jednog od aliasa ranjiv, možete slati zahteve dok ranjiva verzija ne primi eksploataciju.

Resource Policies

Lambda politike resursa omogućavaju da daju pristup drugim uslugama/računima da pozivaju lambda na primer.
Na primer, ovo je politika koja omogućava bilo kome da pristupi lambda izloženoj putem URL-a:

Ili ovo da dozvoli API Gateway da je pozove:

Lambda Database Proxies

Kada postoji stotine paralelnih lambda zahteva, ako svaki od njih treba da uspostavi i zatvori vezu sa bazom podataka, jednostavno neće funkcionisati (lambdas su bezdržavne, ne mogu održavati otvorene veze).
Tada, ako vaše Lambda funkcije komuniciraju sa RDS Proxy umesto vaše instance baze podataka. Ona upravlja povezivanjem potrebnim za skaliranje mnogih simultanih veza koje kreiraju paralelne Lambda funkcije. Ovo omogućava vašim Lambda aplikacijama da ponovo koriste postojeće veze, umesto da kreiraju nove veze za svaku invokaciju funkcije.

Lambda EFS Filesystems

Da bi sačuvali i čak delili podatke, Lambdas mogu pristupiti EFS i montirati ih, tako da Lambda može čitati i pisati iz njih.

Lambda Layers

Lambda layer je .zip arhiva koja može sadržati dodatni kod ili drugi sadržaj. Layer može sadržati biblioteke, prilagođeno okruženje, podatke ili konfiguracione datoteke.

Moguće je uključiti do pet slojeva po funkciji. Kada uključite layer u funkciju, sadržaj se ekstrahuje u /opt direktorijum u okruženju izvršenja.

Po defaultu, slojevi koje kreirate su privatni za vaš AWS račun. Možete odlučiti da podelite layer sa drugim računima ili da napravite layer javnim. Ako vaše funkcije koriste layer koji je objavio drugi račun, vaše funkcije mogu nastaviti da koriste verziju sloja nakon što je obrisana, ili nakon što je vaša dozvola za pristup sloju opozvana. Međutim, ne možete kreirati novu funkciju ili ažurirati funkcije koristeći obrisanu verziju sloja.

Funkcije koje su implementirane kao slika kontejnera ne koriste slojeve. Umesto toga, pakujete svoje omiljeno okruženje, biblioteke i druge zavisnosti u sliku kontejnera kada gradite sliku.

Lambda Extensions

Lambda ekstenzije poboljšavaju funkcije integracijom sa raznim alatima za praćenje, posmatranje, sigurnost i upravljanje. Ove ekstenzije, dodate putem .zip arhiva koristeći Lambda slojeve ili uključene u implementacije slika kontejnera, rade u dva režima: interni i eksterni.

  • Interni ekstenzije se spajaju sa procesom izvršenja, manipulišući njegovim pokretanjem koristeći specifične varijable okruženja za jezik i wrapper skripte. Ova prilagodba se primenjuje na niz okruženja, uključujući Java Correto 8 i 11, Node.js 10 i 12, i .NET Core 3.1.
  • Eksterni ekstenzije rade kao odvojeni procesi, održavajući usklađenost sa životnim ciklusom Lambda funkcije. Kompatibilni su sa raznim okruženjima kao što su Node.js 10 i 12, Python 3.7 i 3.8, Ruby 2.5 i 2.7, Java Corretto 8 i 11, .NET Core 3.1, i prilagođena okruženja.

Enumeration

bash
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>

Pozivanje lambda

Ručno

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

Putem izložene URL adrese

bash
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

Pozivanje Lambda funkcije putem URL-a

Sada je vreme da otkrijemo moguće lambda funkcije za izvršavanje:

aws --region us-west-2 --profile level6 lambda list-functions

Lambda funkcija pod nazivom "Level6" je dostupna. Hajde da saznamo kako je pozvati:

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

Sada, kada znate ime i ID, možete dobiti Ime:

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

I konačno pozovite funkciju pristupajući (primetite da se ID, Ime i naziv funkcije pojavljuju u URL-u): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

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

Ostali Okidači

Postoji mnogo drugih izvora koji mogu pokrenuti lambda

Privesc

Na sledećoj stranici možete proveriti kako da zloupotrebite Lambda dozvole za eskalaciju privilegija:

AWS - Lambda Privesc

Neautentifikovani Pristup

AWS - Lambda Unauthenticated Access

Post Eksploatacija

AWS - Lambda Post Exploitation

Persistencija

AWS - Lambda Persistence

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks