AWS - Lambda Enum
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)
Η υπηρεσία Amazon Web Services (AWS) Lambda περιγράφεται ως μια υπηρεσία υπολογισμού που επιτρέπει την εκτέλεση κώδικα χωρίς την ανάγκη παροχής ή διαχείρισης διακομιστή. Χαρακτηρίζεται από την ικανότητά της να διαχειρίζεται αυτόματα την κατανομή πόρων που απαιτούνται για την εκτέλεση του κώδικα, εξασφαλίζοντας χαρακτηριστικά όπως η υψηλή διαθεσιμότητα, η κλιμάκωση και η ασφάλεια. Ένας σημαντικός τομέας της Lambda είναι το μοντέλο τιμολόγησής της, όπου οι χρεώσεις βασίζονται αποκλειστικά στον χρόνο υπολογισμού που χρησιμοποιείται, εξαλείφοντας την ανάγκη για αρχικές επενδύσεις ή μακροχρόνιες υποχρεώσεις.
Για να καλέσετε μια lambda, είναι δυνατό να την καλέσετε τόσο συχνά όσο θέλετε (με το Cloudwatch), να εκθέσετε ένα URL endpoint και να την καλέσετε, να την καλέσετε μέσω API Gateway ή ακόμη και με βάση γεγονότα όπως αλλαγές στα δεδομένα σε έναν S3 κάδο ή ενημερώσεις σε έναν πίνακα DynamoDB.
Ο κώδικας μιας lambda αποθηκεύεται στο /var/task
.
Μια Lambda μπορεί να έχει πολλές εκδόσεις. Και μπορεί να έχει περισσότερες από 1 έκδοση εκτεθειμένη μέσω aliases. Οι βάρη των καθένα από τις εκδόσεις που εκτίθενται μέσα σε ένα alias θα αποφασίσουν ποιο alias θα λάβει την κλήση (μπορεί να είναι 90%-10% για παράδειγμα). Εάν ο κώδικας μία από τις aliases είναι ευάλωτος, μπορείτε να στείλετε αιτήματα μέχρι η ευάλωτη έκδοση να λάβει την εκμετάλλευση.
Οι πολιτικές πόρων Lambda επιτρέπουν να δώσουν πρόσβαση σε άλλες υπηρεσίες/λογαριασμούς για να καλέσουν τη lambda για παράδειγμα. Για παράδειγμα, αυτή είναι η πολιτική για να επιτρέψει σε οποιονδήποτε να έχει πρόσβαση σε μια lambda που εκτίθεται μέσω URL:
Ή αυτή για να επιτρέψει σε ένα API Gateway να την καλέσει:
Όταν υπάρχουν εκατοντάδες ταυτόχρονες αιτήσεις lambda, αν η καθεμία από αυτές χρειάζεται να συνδεθεί και να κλείσει μια σύνδεση σε μια βάση δεδομένων, απλά δεν θα λειτουργήσει (οι lambdas είναι χωρίς κατάσταση, δεν μπορούν να διατηρήσουν ανοιχτές συνδέσεις). Έτσι, αν οι συναρτήσεις Lambda σας αλληλεπιδρούν με RDS Proxy αντί της βάσης δεδομένων σας. Διαχειρίζεται την πισίνα συνδέσεων που είναι απαραίτητη για την κλιμάκωση πολλών ταυτόχρονων συνδέσεων που δημιουργούνται από ταυτόχρονες συναρτήσεις Lambda. Αυτό επιτρέπει στις εφαρμογές Lambda σας να ξαναχρησιμοποιούν υπάρχουσες συνδέσεις, αντί να δημιουργούν νέες συνδέσεις για κάθε κλήση συνάρτησης.
Για να διατηρήσουν και να μοιραστούν δεδομένα, οι Lambdas μπορούν να έχουν πρόσβαση σε EFS και να τα τοποθετήσουν, έτσι ώστε η Lambda να μπορεί να διαβάσει και να γράψει από αυτό.
Μια layer Lambda είναι ένα αρχείο .zip που μπορεί να περιέχει επιπλέον κώδικα ή άλλο περιεχόμενο. Μια layer μπορεί να περιέχει βιβλιοθήκες, μια προσαρμοσμένη εκτέλεση, δεδομένα ή αρχεία ρυθμίσεων.
Είναι δυνατό να συμπεριλάβετε έως πέντε layers ανά συνάρτηση. Όταν συμπεριλαμβάνετε μια layer σε μια συνάρτηση, το περιεχόμενο εξάγεται στον φάκελο /opt
στο περιβάλλον εκτέλεσης.
Κατά προεπιλογή, οι layers που δημιουργείτε είναι ιδιωτικές για τον λογαριασμό σας AWS. Μπορείτε να επιλέξετε να μοιραστείτε μια layer με άλλους λογαριασμούς ή να κάνετε τη layer δημόσια. Εάν οι συναρτήσεις σας καταναλώνουν μια layer που δημοσίευσε διαφορετικός λογαριασμός, οι συναρτήσεις σας μπορούν να συνεχίσουν να χρησιμοποιούν την έκδοση της layer μετά την διαγραφή της, ή μετά την ανάκληση της άδειας πρόσβασης στη layer. Ωστόσο, δεν μπορείτε να δημιουργήσετε μια νέα συνάρτηση ή να ενημερώσετε συναρτήσεις χρησιμοποιώντας μια διαγραμμένη έκδοση layer.
Οι συναρτήσεις που αναπτύσσονται ως εικόνα κοντέινερ δεν χρησιμοποιούν layers. Αντίθετα, συσκευάζετε την προτιμώμενη εκτέλεση, τις βιβλιοθήκες και άλλες εξαρτήσεις στην εικόνα κοντέινερ όταν δημιουργείτε την εικόνα.
Οι επεκτάσεις 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, και προσαρμοσμένες εκτελέσεις.
Τώρα είναι η ώρα να βρούμε πιθανές λειτουργίες lambda για εκτέλεση:
Μια συνάρτηση lambda με το όνομα "Level6" είναι διαθέσιμη. Ας ανακαλύψουμε πώς να την καλέσουμε:
Τώρα, που γνωρίζετε το όνομα και το ID μπορείτε να αποκτήσετε το Όνομα:
Και τελικά καλέστε τη λειτουργία πρόσβασης (παρατηρήστε ότι το 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
Στην επόμενη σελίδα μπορείτε να ελέγξετε πώς να καταχραστείτε τις άδειες Lambda για να κλιμακώσετε τα προνόμια:
AWS - Lambda PrivescΜάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)