# AWS - Lambda Enum
{{#include ../../../banners/hacktricks-training.md}}
## 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.
.png>)
### 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](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html), 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](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) ili uključene u [implementacije slika kontejnera](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/), 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
aws lambda get-function-configuration --function-name
aws lambda list-function-event-invoke-configs --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 "" --query 'Code.Location'
wget -O lambda-function.zip
# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name
aws lambda get-function-url-config --function-name
# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name
# Versions and Aliases
aws lambda list-versions-by-function --function-name
aws lambda list-aliases --function-name
# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name
aws lambda get-layer-version --layer-name --version-number
aws lambda get-layer-version-by-arn --arn #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
```
### 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 --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 #Get lambda URL
aws lambda get-function-url-config --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
```
.png>)
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
```
.png>)
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"
```
.png>)
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](https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6)
`URL:`**`https://.execute-api..amazonaws.com//`**
#### 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**:
{{#ref}}
../aws-privilege-escalation/aws-lambda-privesc/README.md
{{#endref}}
### Neautentifikovani Pristup
{{#ref}}
../aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access/README.md
{{#endref}}
### Post Eksploatacija
{{#ref}}
../aws-post-exploitation/aws-lambda-post-exploitation/
{{#endref}}
### Persistencija
{{#ref}}
../aws-persistence/aws-lambda-persistence/
{{#endref}}
## Reference
- [https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer)
- [https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/](https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/)
{{#include ../../../banners/hacktricks-training.md}}