Files
hacktricks-cloud/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md
T

8.5 KiB

AWS - Lambda Persistence

{{#include ../../../../banners/hacktricks-training.md}}

Lambda

Για περισσότερες πληροφορίες δείτε:

{{#ref}} ../../aws-services/aws-lambda-enum.md {{#endref}}

Lambda Layer Persistence

Είναι δυνατόν να introduce/backdoor a layer to execute arbitrary code όταν το Lambda εκτελείται με διακριτικό τρόπο:

{{#ref}} aws-lambda-layers-persistence.md {{#endref}}

Lambda Extension Persistence

Καταχρώμενοι τα Lambda Layers, είναι επίσης δυνατό να εκμεταλλευτείτε extensions και να επιτύχετε persistence στο Lambda, αλλά και να κλέψετε και να τροποποιήσετε requests.

{{#ref}} aws-abusing-lambda-extensions.md {{#endref}}

Via resource policies

Είναι δυνατόν να χορηγήσετε πρόσβαση σε διάφορες ενέργειες του Lambda (όπως invoke ή update code) σε εξωτερικούς λογαριασμούς:

Versions, Aliases & Weights

Ένα Lambda μπορεί να έχει different versions (με διαφορετικό code σε κάθε version).
Στη συνέχεια, μπορείτε να δημιουργήσετε different aliases with different versions του Lambda και να ορίσετε διαφορετικά weights για το καθένα.
Με αυτόν τον τρόπο ένας attacker μπορεί να δημιουργήσει μια backdoored version 1 και μια version 2 with only the legit code και να εκτελεί τη version 1 μόνο στο 1% των requests για να παραμείνει stealth.

Version Backdoor + API Gateway

  1. Αντιγράψτε τον αρχικό κώδικα του Lambda
  2. Create a new version backdooring τον αρχικό κώδικα (ή απλά με malicious code). Publish και deploy that version στο $LATEST
  3. Call the API gateway related to the lambda to execute the code
  4. Create a new version with the original code, Publish and deploy that version to $LATEST.
  5. Αυτό θα αποκρύψει τον backdoored κώδικα σε μια προηγούμενη version
  6. 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:<acc_id>:function:<func_name>:1
  7. Σημειώστε το τελικό :1 του arn που υποδεικνύει την version της function (η version 1 θα είναι η backdoored σε αυτό το σενάριο).
  8. Select the POST method created and in Actions select Deploy API
  9. Τώρα, όταν call the function via POST your Backdoor θα κληθεί

Cron/Event actuator

Το γεγονός ότι μπορείτε να κάνετε lambda functions run when something happen or when some time pass κάνει τα Lambda έναν καλό και κοινό τρόπο για να αποκτήσετε persistence και να αποφύγετε τον εντοπισμό.
Εδώ έχετε μερικές ιδέες για να κάνετε την presence in AWS more stealth by creating lambdas.

  • Κάθε φορά που δημιουργείται νέος user, το Lambda δημιουργεί νέο user key και τον στέλνει στον attacker.
  • Κάθε φορά που δημιουργείται νέο role, το Lambda δίνει assume role permissions σε compromised users.
  • Κάθε φορά που δημιουργούνται νέα cloudtrail logs, διαγράψτε/τροποποιήστε τα

RCE abusing AWS_LAMBDA_EXEC_WRAPPER + Lambda Layers

Καταχραστείτε την environment μεταβλητή AWS_LAMBDA_EXEC_WRAPPER για να εκτελέσετε ένα attacker-controlled wrapper script πριν ξεκινήσει το runtime/handler. Παράδoστε το wrapper μέσω ενός Lambda Layer στο /opt/bin/htwrap, ορίστε AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap, και στη συνέχεια invoke τη function. Το wrapper τρέχει μέσα στη διαδικασία runtime της function, κληρονομεί το function execution role, και τελικά κάνει exec στο πραγματικό runtime ώστε ο αρχικός handler να εκτελείται κανονικά.

{{#ref}} aws-lambda-exec-wrapper-persistence.md {{#endref}}

AWS - Lambda Function URL Public Exposure

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

{{#ref}} aws-lambda-async-self-loop-persistence.md {{#endref}}

AWS - Lambda Alias-Scoped Resource Policy Backdoor

Δημιουργήστε μια κρυφή Lambda version με attacker logic και scope ένα resource-based policy σε εκείνη τη συγκεκριμένη version (ή alias) χρησιμοποιώντας την παράμετρο --qualifier στο lambda add-permission. Χορηγήστε μόνο lambda:InvokeFunction στο arn:aws:lambda:REGION:ACCT:function:FN:VERSION σε έναν attacker principal. Οι κανονικές invocations μέσω του function name ή του primary alias παραμένουν ανεπηρέαστες, ενώ ο attacker μπορεί να καλέσει απευθείας το backdoored version ARN.

Αυτό είναι πιο stealthy από το να εκθέσετε ένα Function URL και δεν αλλάζει το primary traffic alias.

{{#ref}} aws-lambda-alias-version-policy-backdoor.md {{#endref}}

Freezing AWS Lambda Runtimes

Ένας attacker που έχει τα permissions lambda:InvokeFunction, logs:FilterLogEvents, lambda:PutRuntimeManagementConfig, και lambda:GetRuntimeManagementConfig μπορεί να τροποποιήσει τη runtime management configuration μιας function. Αυτή η επίθεση είναι ιδιαίτερα αποτελεσματική όταν ο στόχος είναι να διατηρηθεί μια Lambda function σε μια ευάλωτη runtime version ή να διατηρηθεί η συμβατότητα με malicious layers που μπορεί να είναι ασύμβατες με νεότερα runtimes.

Ο attacker τροποποιεί τη runtime management configuration για να pinάρει τη runtime version:

# Invoke the function to generate runtime logs
aws lambda invoke \
--function-name $TARGET_FN \
--payload '{}' \
--region us-east-1 /tmp/ping.json

sleep 5

# Freeze automatic runtime updates on function update
aws lambda put-runtime-management-config \
--function-name $TARGET_FN \
--update-runtime-on FunctionUpdate \
--region us-east-1

Επαληθεύστε την εφαρμοσμένη διαμόρφωση:

aws lambda get-runtime-management-config \
--function-name $TARGET_FN \
--region us-east-1

Προαιρετικά: Επιλέξτε συγκεκριμένη έκδοση runtime

# Extract Runtime Version ARN from INIT_START logs
RUNTIME_ARN=$(aws logs filter-log-events \
--log-group-name /aws/lambda/$TARGET_FN \
--filter-pattern "INIT_START" \
--query 'events[0].message' \
--output text | grep -o 'Runtime Version ARN: [^,]*' | cut -d' ' -f4)

Κλείδωμα σε συγκεκριμένη έκδοση του runtime:

aws lambda put-runtime-management-config \
--function-name $TARGET_FN \
--update-runtime-on Manual \
--runtime-version-arn $RUNTIME_ARN \
--region us-east-1

{{#include ../../../../banners/hacktricks-training.md}}