AWS - Lambda Enum
Last updated
Last updated
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe 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 Ressourcenallokation 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, was die Notwendigkeit für Anfangsinvestitionen oder langfristige Verpflichtungen beseitigt.
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 jeder der Versionen, die innerhalb eines Aliases bereitgestellt werden, entscheiden, welcher Alias die Invocation erhält (es kann zum Beispiel 90%-10% sein). Wenn der Code eines der Aliases anfällig ist, kannst du 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 deine Lambda-Funktionen stattdessen mit RDS Proxy interagieren, verwaltet es das Connection Pooling, das für die Skalierung vieler gleichzeitiger Verbindungen erforderlich ist, die von gleichzeitigen Lambda-Funktionen erstellt werden. Dies ermöglicht es deinen Lambda-Anwendungen, bestehende Verbindungen wiederzuverwenden, anstatt für jede 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.
Eine Lambda Schicht ist ein .zip-Dateiarchiv, das zusätzlichen Code oder andere Inhalte enthalten kann. Eine Schicht kann Bibliotheken, eine benutzerdefinierte Laufzeit, Daten oder Konfigurationsdateien enthalten.
Es ist möglich, bis zu fünf Schichten pro Funktion einzuschließen. Wenn du eine Schicht in eine Funktion einfügst, werden die Inhalte im Verzeichnis /opt
in der Ausführungsumgebung extrahiert.
Standardmäßig sind die Schichten, die du erstellst, privat für dein AWS-Konto. Du kannst wählen, ob du eine Schicht mit anderen Konten teilen oder die Schicht öffentlich machen möchtest. Wenn deine Funktionen eine Schicht verwenden, die ein anderes Konto veröffentlicht hat, können deine Funktionen die Schichtversion weiterhin verwenden, nachdem sie gelöscht wurde oder nachdem dir der Zugriff auf die Schicht entzogen wurde. Du kannst jedoch keine neue Funktion erstellen oder Funktionen mit einer gelöschten Schichtversion aktualisieren.
Funktionen, die als Container-Image bereitgestellt werden, verwenden keine Schichten. Stattdessen packst du deine bevorzugte Laufzeit, Bibliotheken und andere Abhängigkeiten in das Container-Image, wenn du das Image erstellst.
Lambda-Erweiterungen verbessern Funktionen, indem sie sich mit verschiedenen Überwachungs-, Beobachtungs-, Sicherheits- und Governance-Tools integrieren. Diese Erweiterungen, die über .zip-Archive mit Lambda-Schichten hinzugefügt oder in Container-Image-Bereitstellungen enthalten sind, arbeiten in zwei Modi: intern und extern.
Interne Erweiterungen 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 Erweiterungen 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 man Lambda-Berechtigungen missbrauchen kann, 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)