# AWS - Lambda Persistence

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

## Lambda

Vir meer inligting, sien:

{{#ref}}
../../aws-services/aws-lambda-enum.md
{{#endref}}

### Lambda Layer Persistence

Dit is moontlik om **introduce/backdoor a layer to execute arbitrary code** wanneer die lambda op 'n stealthy wyse uitgevoer word:

{{#ref}}
aws-lambda-layers-persistence.md
{{#endref}}

### Lambda Extension Persistence

Deur Lambda Layers te abuse is dit ook moontlik om extensions te misbruik en in die lambda te persist, en ook requests te steel en te wysig.

{{#ref}}
aws-abusing-lambda-extensions.md
{{#endref}}

### Via resource policies

Dit is moontlik om toegang tot verskillende lambda-aksies (soos invoke of update code) aan eksterne rekeninge te verleen:

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

### Versions, Aliases & Weights

A Lambda kan **different versions** hê (met verskillende code per version).\
Dan kan jy **different aliases with different versions** van die lambda skep en verskillende weights aan elkeen toewys.\
Op hierdie manier kan 'n aanvaller 'n **backdoored version 1** skep en 'n **version 2 with only the legit code**, en **only execute the version 1 in 1%** van die requests om stealth te bly.

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

### Version Backdoor + API Gateway

1. Copy the original code of the Lambda
2. **Create a new version backdooring** the original code (or just with malicious code). Publish and **deploy that version** to $LATEST
1. Call the API gateway related to the lambda to execute the code
3. **Create a new version with the original code**, Publish and deploy that **version** to $LATEST.
1. This will hide the backdoored code in a previous version
4. Go to the API Gateway and **create a new POST method** (or choose any other method) that will execute the backdoored version of the lambda: `arn:aws:lambda:us-east-1:<acc_id>:function:<func_name>:1`
1. Note the final :1 of the arn **indicating the version of the function** (version 1 will be the backdoored one in this scenario).
5. Select the POST method created and in Actions select **`Deploy API`**
6. Now, when you **call the function via POST your Backdoor** will be invoked

### Cron/Event actuator

Die feit dat jy **lambda functions run when something happen or when some time pass** maak lambda 'n gewilde manier om persistence te verkry en detectie te vermy.\
Hier is 'n paar idees om jou **presence in AWS more stealth by creating lambdas**.

- Elke keer as 'n nuwe user geskep word, genereer die lambda 'n nuwe user key en stuur dit aan die attacker.
- Elke keer as 'n nuwe role geskep word, gee die lambda assume role permissies aan gecompromitteerde users.
- Elke keer as nuwe cloudtrail logs gegenereer word, delete/alter hulle

### RCE abusing AWS_LAMBDA_EXEC_WRAPPER + Lambda Layers

Misbruik die omgewingveranderlike `AWS_LAMBDA_EXEC_WRAPPER` om 'n attacker-controlled wrapper script uit te voer voordat die runtime/handler begin. Plaas die wrapper via 'n Lambda Layer by `/opt/bin/htwrap`, stel `AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap`, en roep dan die funksie aan. Die wrapper hardloop binne die funksie se runtime-proses, erf die function execution role, en uiteindelik `exec`s die werklike runtime sodat die oorspronklike handler steeds normaal uitvoer.

{{#ref}}
aws-lambda-exec-wrapper-persistence.md
{{#endref}}

### AWS - Lambda Function URL Public Exposure

Misbruik Lambda asynchronous destinations saam met die Recursion configuration om 'n funksie aanhoudend weer self te laat invoke sonder 'n eksterne scheduler (geen EventBridge, cron, ens.). By verstek beëindig Lambda recursive loops, maar deur die recursion config op Allow te sit word dit weer geaktiveer. Destinations deliver op die service-side vir async invokes, so 'n enkele seed invoke skep 'n stealthy, code-free heartbeat/backdoor channel. Opsioneel kan jy met reserved concurrency throttle om geraas laag te hou.

{{#ref}}
aws-lambda-async-self-loop-persistence.md
{{#endref}}

### AWS - Lambda Alias-Scoped Resource Policy Backdoor

Skep 'n verborge Lambda version met attacker logic en scope 'n resource-based policy na daardie spesifieke version (of alias) deur die `--qualifier` parameter in `lambda add-permission` te gebruik. Gee slegs `lambda:InvokeFunction` op `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` aan 'n attacker principal. Normale invocations via die function name of primêre alias bly onaangeraak, terwyl die attacker direk die backdoored version ARN kan invoke.

Dit is stealthier as om 'n Function URL bloot te stel en verander nie die primêre traffic alias nie.

{{#ref}}
aws-lambda-alias-version-policy-backdoor.md
{{#endref}}

### Freezing AWS Lambda Runtimes

'n Attacker wat lambda:InvokeFunction, logs:FilterLogEvents, lambda:PutRuntimeManagementConfig, en lambda:GetRuntimeManagementConfig permissies het, kan 'n funksie se runtime management configuration wysig. Hierdie aanval is veral effektief wanneer die doel is om 'n Lambda-funksie op 'n kwetsbare runtime version te hou of om versoenbaarheid met malicious layers te bewaar wat dalk onversoenbaar is met nuwer runtimes.

Die attacker wysig die runtime management configuration om die runtime version te pin:
```bash
# Invoke the function to generate runtime logs
aws lambda invoke \
--function-name $TARGET_FN \
--payload '{}' \
--region us-east-1 /tmp/ping.json

sleep 5

# Freeze automatic runtime updates on function update
aws lambda put-runtime-management-config \
--function-name $TARGET_FN \
--update-runtime-on FunctionUpdate \
--region us-east-1
```
Verifieer die toegepaste konfigurasie:
```bash
aws lambda get-runtime-management-config \
--function-name $TARGET_FN \
--region us-east-1
```
Opsioneel: Speld vas aan 'n spesifieke runtime-weergawe
```bash
# Extract Runtime Version ARN from INIT_START logs
RUNTIME_ARN=$(aws logs filter-log-events \
--log-group-name /aws/lambda/$TARGET_FN \
--filter-pattern "INIT_START" \
--query 'events[0].message' \
--output text | grep -o 'Runtime Version ARN: [^,]*' | cut -d' ' -f4)
```
Vastmaak aan 'n spesifieke runtime-weergawe:
```bash
aws lambda put-runtime-management-config \
--function-name $TARGET_FN \
--update-runtime-on Manual \
--runtime-version-arn $RUNTIME_ARN \
--region us-east-1
```
{{#include ../../../../banners/hacktricks-training.md}}
