AWS - Lambda Privesc
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Περισσότερες πληροφορίες σχετικά με το lambda στο:
AWS - Lambda Enumiam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)Χρήστες με τα δικαιώματα iam:PassRole
, lambda:CreateFunction
, και lambda:InvokeFunction
μπορούν να αναβαθμίσουν τα προνόμιά τους.
Μπορούν να δημιουργήσουν μια νέα Lambda function και να της αναθέσουν έναν υπάρχοντα IAM ρόλο, παρέχοντας στη λειτουργία τα δικαιώματα που σχετίζονται με αυτόν τον ρόλο. Ο χρήστης μπορεί στη συνέχεια να γράψει και να ανεβάσει κώδικα σε αυτή τη Lambda function (με ένα rev shell για παράδειγμα).
Αφού ρυθμιστεί η λειτουργία, ο χρήστης μπορεί να προκαλέσει την εκτέλεσή της και τις προγραμματισμένες ενέργειες καλώντας τη Lambda function μέσω του AWS API. Αυτή η προσέγγιση επιτρέπει στον χρήστη να εκτελεί εργασίες έμμεσα μέσω της Lambda function, λειτουργώντας με το επίπεδο πρόσβασης που παρέχεται από τον IAM ρόλο που σχετίζεται με αυτήν.\
Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό για να αποκτήσει ένα rev shell και να κλέψει το token:
Μπορείτε επίσης να καταχραστείτε τα δικαιώματα ρόλου lambda από τη λειτουργία lambda ίδια. Εάν ο ρόλος lambda είχε αρκετά δικαιώματα, θα μπορούσατε να τον χρησιμοποιήσετε για να σας παραχωρήσει δικαιώματα διαχειριστή:
Είναι επίσης δυνατό να διαρρεύσουν τα διαπιστευτήρια ρόλου της lambda χωρίς να χρειάζεται εξωτερική σύνδεση. Αυτό θα ήταν χρήσιμο για Network isolated Lambdas που χρησιμοποιούνται σε εσωτερικές εργασίες. Εάν υπάρχουν άγνωστες ομάδες ασφαλείας που φιλτράρουν τα αντίστροφα κέλυφά σας, αυτό το κομμάτι κώδικα θα σας επιτρέψει να διαρρεύσετε απευθείας τα διαπιστευτήρια ως έξοδο της lambda.
Πιθανές Επιπτώσεις: Άμεση εκχώρηση δικαιωμάτων στην αυθαίρετη υπηρεσία ρόλου lambda που καθορίζεται.
Σημειώστε ότι ακόμη και αν φαίνεται ενδιαφέρον lambda:InvokeAsync
δεν επιτρέπει από μόνο του να εκτελέσετε aws lambda invoke-async
, χρειάζεστε επίσης lambda:InvokeFunction
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
Όπως στο προηγούμενο σενάριο, μπορείτε να παραχωρήσετε στον εαυτό σας την άδεια lambda:InvokeFunction
αν έχετε την άδεια lambda:AddPermission
Πιθανές Επιπτώσεις: Άμεση εκμετάλλευση των δικαιωμάτων στην αυθαίρετη υπηρεσία ρόλου 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.
Αν το DynamoDB είναι ήδη ενεργό στο περιβάλλον AWS, ο χρήστης μόνο χρειάζεται να καθορίσει την αντιστοίχιση πηγής γεγονότων για τη λειτουργία Lambda. Ωστόσο, αν το DynamoDB δεν χρησιμοποιείται, ο χρήστης πρέπει να δημιουργήσει έναν νέο πίνακα με ενεργοποιημένη τη ροή:
Τώρα είναι δυνατόν να συνδέσετε τη λειτουργία Lambda με τον πίνακα DynamoDB δημιουργώντας μια αντιστοίχιση πηγής γεγονότων:
Με τη λειτουργία Lambda συνδεδεμένη με το ρεύμα DynamoDB, ο επιτιθέμενος μπορεί έμμεσα να ενεργοποιήσει τη Lambda ενεργοποιώντας το ρεύμα DynamoDB. Αυτό μπορεί να επιτευχθεί με την εισαγωγή ενός στοιχείου στον πίνακα DynamoDB:
Πιθανές Επιπτώσεις: Άμεσο privesc στον ρόλο υπηρεσίας lambda που έχει καθοριστεί.
lambda:AddPermission
Ένας επιτιθέμενος με αυτή την άδεια μπορεί να παραχωρήσει στον εαυτό του (ή σε άλλους) οποιεσδήποτε άδειες (αυτό δημιουργεί πολιτικές βάσει πόρων για να παραχωρήσει πρόσβαση στον πόρο):
Πιθανές Επιπτώσεις: Άμεση εκμετάλλευση δικαιωμάτων στην υπηρεσία lambda που χρησιμοποιείται δίνοντας άδεια να τροποποιήσει τον κώδικα και να τον εκτελέσει.
lambda:AddLayerVersionPermission
Ένας επιτιθέμενος με αυτή την άδεια μπορεί να παραχωρήσει στον εαυτό του (ή σε άλλους) την άδεια lambda:GetLayerVersion
. Μπορεί να έχει πρόσβαση στο layer και να αναζητήσει ευπάθειες ή ευαίσθητες πληροφορίες.
Πιθανές Επιπτώσεις: Πιθανή πρόσβαση σε ευαίσθητες πληροφορίες.
lambda:UpdateFunctionCode
Οι χρήστες που κατέχουν την άδεια lambda:UpdateFunctionCode
έχουν τη δυνατότητα να τροποποιήσουν τον κώδικα μιας υπάρχουσας Lambda λειτουργίας που είναι συνδεδεμένη με έναν ρόλο IAM.
Ο επιτιθέμενος μπορεί να τροποποιήσει τον κώδικα της lambda για να εξάγει τα διαπιστευτήρια IAM.
Αν και ο επιτιθέμενος μπορεί να μην έχει την άμεση ικανότητα να καλέσει τη λειτουργία, αν η Lambda λειτουργία είναι προϋπάρχουσα και λειτουργική, είναι πιθανό να ενεργοποιηθεί μέσω υπαρχουσών ροών εργασίας ή γεγονότων, διευκολύνοντας έτσι έμμεσα την εκτέλεση του τροποποιημένου κώδικα.
Πιθανές Επιπτώσεις: Άμεσο privesc στον ρόλο υπηρεσίας lambda που χρησιμοποιείται.
lambda:UpdateFunctionConfiguration
Με αυτές τις άδειες είναι δυνατόν να προστεθούν μεταβλητές περιβάλλοντος που θα προκαλέσουν την εκτέλεση αυθαίρετου κώδικα από το Lambda. Για παράδειγμα, στην python είναι δυνατόν να καταχραστεί κανείς τις μεταβλητές περιβάλλοντος PYTHONWARNING
και BROWSER
για να εκτελέσει μια διαδικασία python αυθαίρετες εντολές:
Για άλλες γλώσσες scripting υπάρχουν άλλες μεταβλητές περιβάλλοντος που μπορείτε να χρησιμοποιήσετε. Για περισσότερες πληροφορίες, ελέγξτε τις υποενότητες των γλωσσών scripting στο:
Lambda Layers επιτρέπει να συμπεριλάβετε κώδικα στη λειτουργία σας lambda αλλά να τον αποθηκεύσετε ξεχωριστά, έτσι ώστε ο κώδικας της λειτουργίας να παραμένει μικρός και πολλές λειτουργίες να μπορούν να μοιράζονται κώδικα.
Μέσα στη lambda μπορείτε να ελέγξετε τις διαδρομές από όπου φορτώνεται ο κώδικας python με μια συνάρτηση όπως η εξής:
Αυτά είναι τα μέρη:
/var/task
/opt/python/lib/python3.7/site-packages
/opt/python
/var/runtime
/var/lang/lib/python37.zip
/var/lang/lib/python3.7
/var/lang/lib/python3.7/lib-dynload
/var/lang/lib/python3.7/site-packages
/opt/python/lib/python3.7/site-packages
/opt/python
Για παράδειγμα, η βιβλιοθήκη boto3 φορτώνεται από το /var/runtime/boto3
(4η θέση).
Είναι δυνατόν να καταχραστεί η άδεια lambda:UpdateFunctionConfiguration
για να προσθέσετε μια νέα στρώση σε μια συνάρτηση lambda. Για να εκτελέσετε αυθαίρετο κώδικα, αυτή η στρώση πρέπει να περιέχει κάποια βιβλιοθήκη που η lambda πρόκειται να εισάγει. Αν μπορείτε να διαβάσετε τον κώδικα της lambda, θα μπορούσατε να το βρείτε εύκολα, σημειώστε επίσης ότι μπορεί να είναι δυνατόν η lambda να χρησιμοποιεί ήδη μια στρώση και θα μπορούσατε να κατεβάσετε τη στρώση και να προσθέσετε τον κώδικά σας εκεί.
Για παράδειγμα, ας υποθέσουμε ότι η lambda χρησιμοποιεί τη βιβλιοθήκη boto3, αυτό θα δημιουργήσει μια τοπική στρώση με την τελευταία έκδοση της βιβλιοθήκης:
Μπορείτε να ανοίξετε ./lambda_layer/boto3/__init__.py
και να προσθέσετε την πίσω πόρτα στον παγκόσμιο κώδικα (μια συνάρτηση για να εξάγετε διαπιστευτήρια ή να αποκτήσετε ένα reverse shell για παράδειγμα).
Στη συνέχεια, συμπιέστε αυτόν τον φάκελο ./lambda_layer
και ανεβάστε τη νέα λωρίδα lambda στον δικό σας λογαριασμό (ή στον λογαριασμό των θυμάτων, αλλά μπορεί να μην έχετε άδειες για αυτό).
Σημειώστε ότι πρέπει να δημιουργήσετε έναν φάκελο python και να βάλετε τις βιβλιοθήκες εκεί για να αντικαταστήσετε το /opt/python/boto3. Επίσης, η λωρίδα πρέπει να είναι συμβατή με την έκδοση python που χρησιμοποιείται από τη lambda και αν την ανεβάσετε στον λογαριασμό σας, πρέπει να είναι στην ίδια περιοχή:
Τώρα, κάντε το ανεβασμένο lambda layer προσβάσιμο από οποιονδήποτε λογαριασμό:
Και επισυνάψτε το lambda layer στη θυματική lambda function:
Το επόμενο βήμα θα ήταν είτε να καλέσουμε τη λειτουργία εμείς οι ίδιοι αν μπορούμε είτε να περιμένουμε μέχρι να καλεστεί με κανονικά μέσα – που είναι η ασφαλέστερη μέθοδος.
Μια πιο διακριτική μέθοδος για να εκμεταλλευτούμε αυτή την ευπάθεια μπορεί να βρεθεί στο:
AWS - Lambda Layers PersistenceΠιθανές Επιπτώσεις: Άμεση privesc στο ρόλο υπηρεσίας lambda που χρησιμοποιείται.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Ίσως με αυτές τις άδειες να είστε σε θέση να δημιουργήσετε μια λειτουργία και να την εκτελέσετε καλώντας τη διεύθυνση URL... αλλά δεν μπόρεσα να βρω έναν τρόπο να το δοκιμάσω, οπότε ενημερώστε με αν το κάνετε!
Ορισμένες lambdas θα λαμβάνουν ευαίσθητες πληροφορίες από τους χρήστες ως παραμέτρους. Αν αποκτήσετε RCE σε μία από αυτές, μπορείτε να εξάγετε τις πληροφορίες που στέλνουν άλλοι χρήστες σε αυτήν, ελέγξτε το στο:
AWS - Steal Lambda RequestsΜάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)