AWS - Lambda Layers Persistence
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)
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.
Der Ladepfad, den Python in Lambda verwenden wird, ist der folgende:
Überprüfen Sie, wie die zweite und dritte Position von Verzeichnissen eingenommen werden, in denen Lambda-Schichten ihre Dateien entpacken: /opt/python/lib/python3.9/site-packages
und /opt/python
Wenn es einem Angreifer gelingt, eine verwendete Lambda Schicht zu hintertüren oder eine hinzuzufügen, die beliebigen Code ausführt, wenn eine gängige Bibliothek geladen wird, kann er mit jeder Lambda-Aufruf bösartigen Code ausführen.
Daher sind die Voraussetzungen:
Überprüfen Sie Bibliotheken, die vom Code der Opfer geladen werden
Erstellen Sie eine Proxy-Bibliothek mit Lambda-Schichten, die benutzerdefinierten Code ausführt und die ursprüngliche Bibliothek lädt.
Bei der Ausnutzung dieser Technik stieß ich auf eine Schwierigkeit: Einige Bibliotheken sind bereits geladen im Python-Laufzeit, wenn Ihr Code ausgeführt wird. Ich erwartete, Dinge wie os
oder sys
zu finden, aber sogar die json
-Bibliothek war geladen.
Um diese Persistenztechnik auszunutzen, muss der Code eine neue Bibliothek laden, die nicht geladen ist, wenn der Code ausgeführt wird.
Mit einem Python-Code wie diesem ist es möglich, die Liste der Bibliotheken, die vorab geladen sind, innerhalb der Python-Laufzeit in Lambda zu erhalten:
Und dies ist die Liste (überprüfen Sie, ob Bibliotheken wie os
oder json
bereits vorhanden sind)
Und dies ist die Liste der Bibliotheken, die lambda standardmäßig installiert: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
In diesem Beispiel nehmen wir an, dass der angezielte Code csv
importiert. Wir werden den Import der csv
-Bibliothek backdooren.
Um dies zu tun, werden wir das Verzeichnis csv mit der Datei __init__.py
darin in einem Pfad erstellen, der von lambda geladen wird: /opt/python/lib/python3.9/site-packages
Dann, wenn die lambda ausgeführt wird und versucht, csv zu laden, wird unsere __init__.py
-Datei geladen und ausgeführt.
Diese Datei muss:
Unser Payload ausführen
Die originale csv-Bibliothek laden
Wir können beides mit:
Dann erstellen Sie ein Zip-Archiv mit diesem Code im Pfad python/lib/python3.9/site-packages/__init__.py
und fügen Sie es als Lambda-Schicht hinzu.
Sie finden diesen Code unter https://github.com/carlospolop/LambdaLayerBackdoor
Die integrierte Payload wird die IAM-Credentials an einen Server SENDEN, WENN sie das ERSTE MAL aufgerufen wird oder NACH einem Zurücksetzen des Lambda-Containers (Änderung des Codes oder kaltes Lambda), aber andere Techniken wie die folgenden könnten ebenfalls integriert werden:
Beachten Sie, dass es möglich ist, Lambda-Schichten von externen Konten zu verwenden. Darüber hinaus kann ein Lambda eine Schicht von einem externen Konto verwenden, auch wenn es keine Berechtigungen hat. Beachten Sie auch, dass die maximale Anzahl von Schichten, die ein Lambda haben kann, 5 beträgt.
Daher könnte ein Angreifer, um die Vielseitigkeit dieser Technik zu verbessern:
Eine bestehende Schicht des Benutzers backdooren (nichts ist extern)
Eine Schicht in seinem Konto erstellen, dem Opferkonto Zugriff auf die Verwendung der Schicht gewähren, die Schicht im Lambda des Opfers konfigurieren und die Berechtigung entfernen.
Das Lambda wird weiterhin in der Lage sein, die Schicht zu verwenden, und das Opfer wird keine einfache Möglichkeit haben, den Code der Schichten herunterzuladen (außer durch den Erhalt einer Reverse-Shell innerhalb des Lambdas)
Das Opfer wird keine externen Schichten sehen, die mit aws lambda list-layers
verwendet werden.
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)