# AWS - Lambda Enum

{{#include ../../../banners/hacktricks-training.md}}

## Lambda

Amazon Web Services (AWS) Lambda word beskryf as 'n **rekenaar diens** wat die uitvoering van kode moontlik maak sonder die noodsaaklikheid van bediener voorsiening of bestuur. Dit word gekenmerk deur sy vermoë om **outomaties hulpbron toewysing** te hanteer wat nodig is vir kode uitvoering, wat funksies soos hoë beskikbaarheid, skaalbaarheid en sekuriteit verseker. 'n Belangrike aspek van Lambda is sy prysmodel, waar **heffings slegs gebaseer is op die rekenaartyd wat gebruik word**, wat die behoefte aan aanvanklike belegging of langtermyn verpligtinge uitskakel.

Om 'n lambda aan te roep, is dit moontlik om dit **so gereeld soos jy wil** aan te roep (met Cloudwatch), **'n URL** eindpunt bloot te stel en dit aan te roep, dit via **API Gateway** aan te roep of selfs gebaseer op **gebeurtenisse** soos **veranderings** aan data in 'n **S3** emmer of opdaterings aan 'n **DynamoDB** tabel.

Die **kode** van 'n lambda word gestoor in **`/var/task`**.

### Lambda Aliases Weights

'n Lambda kan **verskeie weergawes** hê.\
En dit kan **meer as 1** weergawe hê wat blootgestel word via **aliases**. Die **gewigte** van **elke** van die **weergawes** wat binne 'n alias blootgestel word, sal besluit **watter alias die oproep ontvang** (dit kan 90%-10% wees byvoorbeeld).\
As die kode van **een** van die aliases **kwetsbaar** is, kan jy **versoeke stuur totdat die kwesbare** weergawe die ontploffing ontvang.

![](<../../../images/image (223).png>)

### Resource Policies

Lambda hulpbronbeleide laat toe om **toegang aan ander dienste/rekeninge te gee om** die lambda aan te roep byvoorbeeld.\
Byvoorbeeld, dit is die beleid om **enigeen toe te laat om 'n lambda wat via URL blootgestel is, te benader**:

<figure><img src="https://lh4.googleusercontent.com/4PNFKBdzr3nMrPqeKkTslgwWDKxkXMdQ1SNdv7NPHykj3GX8wODrQyXOFbjk4fxHfZ8pDm5ijWgk2Vq2EGXiPRT3TQfZf1fHycvdEKBuDxJDYos1CJeMHXSeg86ZB-Ol7CNtten6xkVFQj6AhDUEWNQJrQ=s2048" alt=""><figcaption></figcaption></figure>

Of dit om 'n API Gateway toe te laat om dit aan te roep:

<figure><img src="https://lh3.googleusercontent.com/Su0JlR0wBqb-99Z4N_2-_kMlX0Xzx2n_GpZuOPW5IeXR3FYbm8OHFDM3Ora1BpXiSjHpDVUlq4yEyXwaI3nBuze6DJ-wRf2ATsCuWbq0wuBCd34E9uIpqwheE6Cc_PopviI_93O_j2ZKXc1-AJtsBoLVUw=s2048" alt=""><figcaption></figcaption></figure>

### Lambda Database Proxies

Wanneer daar **honderde** **gelyktydige lambda versoeke** is, as elkeen daarvan moet **verbinding maak en 'n verbinding met 'n databasis sluit**, gaan dit eenvoudig nie werk nie (lambdas is staatloos, kan nie verbindings oop hou nie).\
Dan, as jou **Lambda funksies met RDS Proxy in plaas van** jou databasis instansie interaksie het. Dit hanteer die verbinding pooling wat nodig is om baie gelyktydige verbindings wat deur gelyktydige Lambda funksies geskep word, te skaal. Dit laat jou Lambda toepassings toe om **bestaande verbindings te hergebruik**, eerder as om nuwe verbindings vir elke funksie oproep te skep.

### Lambda EFS Filesystems

Om data te bewaar en selfs te deel, **kan Lambdas EFS benader en dit monteer**, sodat Lambda in staat sal wees om daarvan te lees en te skryf.

### Lambda Layers

'n Lambda _laag_ is 'n .zip lêer argief wat **addisionele kode** of ander inhoud kan bevat. 'n Laag kan biblioteke, 'n [aangepaste runtime](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html), data, of konfigurasielêers bevat.

Dit is moontlik om tot **vyf lae per funksie** in te sluit. Wanneer jy 'n laag in 'n funksie insluit, word die **inhoud na die `/opt`** gids in die uitvoeringsomgewing onttrek.

Deur **standaard**, is die **lae** wat jy skep **privaat** vir jou AWS rekening. Jy kan kies om 'n laag met ander rekeninge te **deel** of om die laag **publiek** te maak. As jou funksies 'n laag gebruik wat 'n ander rekening gepubliseer het, kan jou funksies **voortgaan om die laag weergawe te gebruik nadat dit verwyder is, of nadat jou toestemming om toegang tot die laag herroep is**. Dit is egter nie moontlik om 'n nuwe funksie te skep of funksies te werk met 'n verwyderde laag weergawe nie.

Funksies wat as 'n houer beeld ontplooi word, gebruik nie lae nie. In plaas daarvan, pak jy jou verkiesde runtime, biblioteke, en ander afhanklikhede in die houer beeld wanneer jy die beeld bou.

### Lambda Extensions

Lambda uitbreidings verbeter funksies deur te integreer met verskeie **monitering, waaksaamheid, sekuriteit, en bestuur gereedskap**. Hierdie uitbreidings, bygevoeg via [.zip argiewe met behulp van Lambda lae](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) of ingesluit in [houer beeld ontplooiings](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/), werk in twee modi: **intern** en **ekstern**.

- **Interne uitbreidings** meng met die runtime proses, wat die opstart manipuleer met behulp van **taalspesifieke omgewing veranderlikes** en **wrapper skripte**. Hierdie aanpassing geld vir 'n reeks runtimes, insluitend **Java Correto 8 en 11, Node.js 10 en 12, en .NET Core 3.1**.
- **Eksterne uitbreidings** loop as aparte prosesse, wat operasionele belyning met die Lambda funksie se lewensiklus handhaaf. Hulle is versoenbaar met verskeie runtimes soos **Node.js 10 en 12, Python 3.7 en 3.8, Ruby 2.5 en 2.7, Java Corretto 8 en 11, .NET Core 3.1**, en **aangepaste runtimes**.

### 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>
```
### Roep 'n lambda aan

#### Handmatig
```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
```
#### Deur blootgestelde URL
```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
```
#### Roep Lambda-funksie aan via URL

Nou is dit tyd om moontlike lambda-funksies te vind om uit te voer:
```
aws --region us-west-2 --profile level6 lambda list-functions
```
![](<../../../images/image (262).png>)

'n Lambda-funksie genaamd "Level6" is beskikbaar. Kom ons vind uit hoe om dit aan te roep:
```bash
aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6
```
![](<../../../images/image (102).png>)

Nou, dat jy die naam en die ID ken, kan jy die Naam kry:
```bash
aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"
```
![](<../../../images/image (237).png>)

En uiteindelik bel die funksie wat toegang verkry (let op dat die ID, Naam en funksie-naam in die URL verskyn): [https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6](https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6)

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

#### Ander Triggers

Daar is baie ander bronne wat 'n lambda kan aktiveer

<figure><img src="../../../images/image (167).png" alt=""><figcaption></figcaption></figure>

### Privesc

Op die volgende bladsy kan jy kyk hoe om **Lambda-toestemmings te misbruik om voorregte te verhoog**:

{{#ref}}
../aws-privilege-escalation/aws-lambda-privesc/README.md
{{#endref}}

### Ongeauthentiseerde Toegang

{{#ref}}
../aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access/README.md
{{#endref}}

### Post Exploitatie

{{#ref}}
../aws-post-exploitation/aws-lambda-post-exploitation/
{{#endref}}

### Volharding

{{#ref}}
../aws-persistence/aws-lambda-persistence/
{{#endref}}

## Verwysings

- [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}}
