AWS - Lambda Enum
Last updated
Last updated
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Amazon Web Services (AWS) Lambda wird als Compute-Service beschrieben, der die Ausführung von Code ermöglicht, ohne dass Server bereitgestellt oder verwaltet werden müssen. Es zeichnet sich durch die Fähigkeit aus, automatisch die benötigte Ressourcenzuteilung für die Codeausführung zu verwalten, was Funktionen wie hohe Verfügbarkeit, Skalierbarkeit und Sicherheit gewährleistet. Ein wesentlicher Aspekt von Lambda ist sein Preismodell, bei dem die Gebühren ausschließlich auf der genutzten Rechenzeit basieren, wodurch die Notwendigkeit für Anfangsinvestitionen oder langfristige Verpflichtungen entfällt.
Um eine Lambda-Funktion aufzurufen, ist es möglich, sie so oft wie gewünscht (mit Cloudwatch) aufzurufen, einen URL-Endpunkt bereitzustellen und sie aufzurufen, sie über API Gateway aufzurufen oder sogar basierend auf Ereignissen wie Änderungen an Daten in einem S3-Bucket oder Aktualisierungen einer DynamoDB-Tabelle.
Der Code einer Lambda-Funktion wird in /var/task
gespeichert.
Eine Lambda-Funktion kann mehrere Versionen haben. Und sie kann mehr als 1 Version über Aliases bereitstellen. Die Gewichte der jeweiligen Versionen, die innerhalb eines Aliases bereitgestellt werden, entscheiden, welcher Alias den Aufruf erhält (es kann beispielsweise 90%-10% sein). Wenn der Code von einem der Aliases anfällig ist, können Sie Anfragen senden, bis die anfällige Version den Exploit erhält.
Lambda-Ressourcenrichtlinien ermöglichen es, anderen Diensten/Konten den Zugriff auf die Lambda-Funktion zu gewähren, um sie beispielsweise aufzurufen. Zum Beispiel ist dies die Richtlinie, um niemandem den Zugriff auf eine über URL bereitgestellte Lambda-Funktion zu erlauben:
Oder dies, um einem API Gateway zu erlauben, es aufzurufen:
Wenn es Hunderte von gleichzeitigen Lambda-Anfragen gibt, und jede von ihnen eine Verbindung zu einer Datenbank herstellen und schließen muss, wird es einfach nicht funktionieren (Lambdas sind zustandslos und können keine Verbindungen offen halten). Wenn Ihre Lambda-Funktionen stattdessen mit RDS Proxy interagieren, verwaltet es das erforderliche Connection Pooling für die Skalierung vieler gleichzeitiger Verbindungen, die von gleichzeitigen Lambda-Funktionen erstellt werden. Dies ermöglicht es Ihren Lambda-Anwendungen, bestehende Verbindungen wiederzuverwenden, anstatt für jeden Funktionsaufruf neue Verbindungen zu erstellen.
Um Daten zu speichern und sogar zu teilen, können Lambdas auf EFS zugreifen und es einbinden, sodass Lambda in der Lage ist, von ihm zu lesen und zu schreiben.
Ein Lambda Layer ist ein .zip-Dateiarchiv, das zusätzlichen Code oder andere Inhalte enthalten kann. Ein Layer kann Bibliotheken, eine benutzerdefinierte Laufzeit, Daten oder Konfigurationsdateien enthalten.
Es ist möglich, bis zu fünf Layers pro Funktion einzuschließen. Wenn Sie einen Layer in eine Funktion einfügen, werden die Inhalte im Verzeichnis /opt
in der Ausführungsumgebung extrahiert.
Standardmäßig sind die Layers, die Sie erstellen, privat für Ihr AWS-Konto. Sie können wählen, ob Sie einen Layer mit anderen Konten teilen oder den Layer öffentlich machen möchten. Wenn Ihre Funktionen einen Layer verwenden, den ein anderes Konto veröffentlicht hat, können Ihre Funktionen die Layer-Version weiterhin verwenden, nachdem sie gelöscht wurde oder nachdem Ihre Berechtigung zum Zugriff auf den Layer widerrufen wurde. Sie können jedoch keine neue Funktion erstellen oder Funktionen mit einer gelöschten Layer-Version aktualisieren.
Funktionen, die als Container-Image bereitgestellt werden, verwenden keine Layers. Stattdessen verpacken Sie Ihre bevorzugte Laufzeit, Bibliotheken und andere Abhängigkeiten in das Container-Image, wenn Sie das Image erstellen.
Lambda-Extensions verbessern Funktionen, indem sie sich mit verschiedenen Überwachungs-, Beobachtungs-, Sicherheits- und Governance-Tools integrieren. Diese Extensions, die über .zip-Archive mit Lambda-Layers hinzugefügt oder in Container-Image-Bereitstellungen enthalten sind, arbeiten in zwei Modi: intern und extern.
Interne Extensions verschmelzen mit dem Laufzeitprozess und manipulieren dessen Start mit sprachspezifischen Umgebungsvariablen und Wrapper-Skripten. Diese Anpassung gilt für eine Reihe von Laufzeiten, einschließlich Java Correto 8 und 11, Node.js 10 und 12 sowie .NET Core 3.1.
Externe Extensions laufen als separate Prozesse und halten die Betriebsanpassung an den Lebenszyklus der Lambda-Funktion aufrecht. Sie sind mit verschiedenen Laufzeiten wie Node.js 10 und 12, Python 3.7 und 3.8, Ruby 2.5 und 2.7, Java Corretto 8 und 11, .NET Core 3.1 und benutzerdefinierten Laufzeiten kompatibel.
Jetzt ist es an der Zeit, mögliche Lambda-Funktionen zu finden, die ausgeführt werden können:
Eine Lambda-Funktion mit dem Namen "Level6" ist verfügbar. Lassen Sie uns herausfinden, wie man sie aufruft:
Jetzt, da Sie den Namen und die ID kennen, können Sie den Namen abrufen:
Und schließlich rufen Sie die Funktion auf (beachten Sie, dass die ID, der Name und der Funktionsname in der URL erscheinen): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6
URL:
https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>
Es gibt viele andere Quellen, die eine Lambda-Funktion auslösen können.
Auf der folgenden Seite können Sie überprüfen, wie Sie Lambda-Berechtigungen missbrauchen können, um Privilegien zu eskalieren:
AWS - Lambda PrivescLernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)