AWS - Lambda Enum

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

Η Amazon Web Services (AWS) Lambda περιγράφεται ως μια υπηρεσία υπολογισμού που επιτρέπει την εκτέλεση κώδικα χωρίς την ανάγκη παροχής ή διαχείρισης διακομιστή. Χαρακτηρίζεται από την ικανότητά της να διαχειρίζεται αυτόματα την κατανομή πόρων που απαιτούνται για την εκτέλεση του κώδικα, εξασφαλίζοντας χαρακτηριστικά όπως υψηλή διαθεσιμότητα, κλιμάκωση και ασφάλεια. Ένας σημαντικός τομέας της Lambda είναι το μοντέλο τιμολόγησής της, όπου οι χρεώσεις βασίζονται αποκλειστικά στον χρόνο υπολογισμού που χρησιμοποιείται, εξαλείφοντας την ανάγκη για αρχικές επενδύσεις ή μακροχρόνιες υποχρεώσεις.

Για να καλέσετε μια lambda, είναι δυνατόν να την καλέσετε τόσο συχνά όσο θέλετε (με το Cloudwatch), να εκθέσετε ένα URL endpoint και να την καλέσετε, να την καλέσετε μέσω API Gateway ή ακόμη και με βάση γεγονότα όπως αλλαγές στα δεδομένα σε έναν S3 κάδο ή ενημερώσεις σε έναν πίνακα DynamoDB.

Ο κώδικας μιας lambda αποθηκεύεται στο /var/task.

Lambda Aliases Weights

Μια Lambda μπορεί να έχει πολλές εκδόσεις.
Και μπορεί να έχει περισσότερες από 1 έκδοση εκτεθειμένη μέσω aliases. Τα βάρη των καθένα από τις εκδόσεις που εκτίθενται μέσα σε ένα alias θα αποφασίσουν ποιο alias θα λάβει την κλήση (μπορεί να είναι 90%-10% για παράδειγμα).
Εάν ο κώδικας μία από τις aliases είναι ευάλωτος, μπορείτε να στείλετε αιτήματα μέχρι η ευάλωτη έκδοση να λάβει την εκμετάλλευση.

Resource Policies

Οι πολιτικές πόρων Lambda επιτρέπουν να δώσουν πρόσβαση σε άλλες υπηρεσίες/λογαριασμούς για να καλέσουν τη lambda για παράδειγμα.
Για παράδειγμα, αυτή είναι η πολιτική για να επιτρέψει σε οποιονδήποτε να έχει πρόσβαση σε μια lambda που εκτίθεται μέσω URL:

Ή αυτή για να επιτρέψει σε ένα API Gateway να την καλέσει:

Lambda Database Proxies

Όταν υπάρχουν εκατοντάδες ταυτόχρονες αιτήσεις lambda, αν η καθεμία από αυτές χρειάζεται να συνδεθεί και να κλείσει μια σύνδεση σε μια βάση δεδομένων, απλά δεν θα λειτουργήσει (οι lambdas είναι χωρίς κατάσταση, δεν μπορούν να διατηρήσουν ανοιχτές συνδέσεις).
Έτσι, αν οι συναρτήσεις Lambda σας αλληλεπιδρούν με RDS Proxy αντί της βάσης δεδομένων σας. Διαχειρίζεται την πισίνα συνδέσεων που είναι απαραίτητη για την κλιμάκωση πολλών ταυτόχρονων συνδέσεων που δημιουργούνται από ταυτόχρονες συναρτήσεις Lambda. Αυτό επιτρέπει στις εφαρμογές Lambda σας να ξαναχρησιμοποιούν υπάρχουσες συνδέσεις, αντί να δημιουργούν νέες συνδέσεις για κάθε κλήση συνάρτησης.

Lambda EFS Filesystems

Για να διατηρήσουν και να μοιραστούν δεδομένα, οι Lambdas μπορούν να έχουν πρόσβαση σε EFS και να τα τοποθετήσουν, έτσι ώστε η Lambda να μπορεί να διαβάσει και να γράψει από αυτό.

Lambda Layers

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

Είναι δυνατόν να συμπεριλάβετε έως πέντε layers ανά συνάρτηση. Όταν συμπεριλαμβάνετε μια layer σε μια συνάρτηση, το περιεχόμενο εξάγεται στον φάκελο /opt στο περιβάλλον εκτέλεσης.

Από προεπιλογή, οι layers που δημιουργείτε είναι ιδιωτικές για τον λογαριασμό σας AWS. Μπορείτε να επιλέξετε να μοιραστείτε μια layer με άλλους λογαριασμούς ή να κάνετε τη layer δημόσια. Εάν οι συναρτήσεις σας καταναλώνουν μια layer που δημοσίευσε διαφορετικός λογαριασμός, οι συναρτήσεις σας μπορούν να συνεχίσουν να χρησιμοποιούν την έκδοση της layer μετά την διαγραφή της, ή μετά την ανάκληση της άδειας πρόσβασης στη layer. Ωστόσο, δεν μπορείτε να δημιουργήσετε μια νέα συνάρτηση ή να ενημερώσετε συναρτήσεις χρησιμοποιώντας μια διαγραμμένη έκδοση layer.

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

Lambda Extensions

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

  • Οι εσωτερικές επεκτάσεις συγχωνεύονται με τη διαδικασία εκτέλεσης, χειριζόμενες την εκκίνηση της χρησιμοποιώντας μεταβλητές περιβάλλοντος συγκεκριμένες για τη γλώσσα και σενάρια περιτύλιξης. Αυτή η προσαρμογή ισχύει για μια σειρά από εκτελέσεις, συμπεριλαμβανομένων των Java Correto 8 και 11, Node.js 10 και 12, και .NET Core 3.1.
  • Οι εξωτερικές επεκτάσεις εκτελούνται ως ξεχωριστές διαδικασίες, διατηρώντας τη λειτουργική ευθυγράμμιση με τον κύκλο ζωής της συνάρτησης Lambda. Είναι συμβατές με διάφορες εκτελέσεις όπως Node.js 10 και 12, Python 3.7 και 3.8, Ruby 2.5 και 2.7, Java Corretto 8 και 11, .NET Core 3.1, και προσαρμοσμένες εκτελέσεις.

Enumeration

aws lambda get-account-settings

# List functions and get extra config info
aws lambda list-functions
aws lambda get-function --function-name <function_name>
aws lambda get-function-configuration --function-name <function_name>
aws lambda list-function-event-invoke-configs --function-name <function_name>
## Check for creds in env vars
aws lambda list-functions | jq '.Functions[].Environment'
## Download & check the source code
aws lambda get-function --function-name "<func_name>" --query 'Code.Location'
wget -O lambda-function.zip <url-from-previous-query>

# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name <function_name>
aws lambda get-function-url-config --function-name <function_name>

# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name <function_name>

# Versions and Aliases
aws lambda list-versions-by-function --function-name <func_name>
aws lambda list-aliases --function-name <func_name>

# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name <name>
aws lambda get-layer-version --layer-name <name> --version-number <ver>
aws lambda get-layer-version-by-arn --arn <name> #Get external ARNs

# List other metadata
aws lambda list-event-source-mappings
aws lambda list-code-signing-configs
aws lambda list-functions-by-code-signing-config --code-signing-config-arn <arn>

Εκτέλεση ενός lambda

Χειροκίνητα

# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## Some functions will expect parameters, they will access them with something like:
## target_policys = event['policy_names']
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt

Μέσω εκτεθειμένου URL

aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config   --function-name <function_name> #Get lambda URL

Καλέστε τη συνάρτηση Lambda μέσω URL

Τώρα είναι η ώρα να ανακαλύψουμε πιθανές συναρτήσεις lambda για εκτέλεση:

aws --region us-west-2 --profile level6 lambda list-functions

Μια συνάρτηση lambda με το όνομα “Level6” είναι διαθέσιμη. Ας δούμε πώς να την καλέσουμε:

aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6

Τώρα που γνωρίζετε το όνομα και το ID, μπορείτε να αποκτήσετε το Όνομα:

aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"

Και τελικά καλέστε τη συνάρτηση προσβάλλοντας (παρατηρήστε ότι το ID, το Όνομα και το όνομα της συνάρτησης εμφανίζονται στη διεύθυνση URL): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

URL:https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>

Άλλοι Ενεργοποιητές

Υπάρχουν πολλές άλλες πηγές που μπορούν να ενεργοποιήσουν μια lambda

Privesc

Στην επόμενη σελίδα μπορείτε να ελέγξετε πώς να καταχραστείτε τις άδειες Lambda για να κλιμακώσετε τα προνόμια:

AWS - Lambda Privesc

Μη Αυθεντική Πρόσβαση

AWS - Lambda Unauthenticated Access

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

AWS - Lambda Post Exploitation

Επιμονή

AWS - Lambda Persistence

Αναφορές

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