AWS - Lambda Enum
Reading time: 8 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Lambda
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, und gewährleistet Funktionen wie hohe Verfügbarkeit, Skalierbarkeit und Sicherheit. Ein wesentlicher Aspekt von Lambda ist sein Preismodell, bei dem die Kosten 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 häufig wie gewünscht (mit Cloudwatch) aufzurufen, einen URL-Endpunkt auszusetzen 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.
Lambda Aliases Weights
Eine Lambda-Funktion kann mehrere Versionen haben.
Und sie kann mehr als 1 Version über Aliases exponieren. Die Gewichte der jeweiligen Versionen, die innerhalb eines Aliases exponiert sind, entscheiden, welcher Alias den Aufruf erhält (es kann zum Beispiel 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.
Resource Policies
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 exponierte Lambda-Funktion zu erlauben:
Oder dies, um einem API Gateway zu erlauben, es aufzurufen:
Lambda Database Proxies
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 Connection Pooling, das für die Skalierung vieler gleichzeitiger Verbindungen erforderlich ist, 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.
Lambda EFS Filesystems
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.
Lambda Layers
Ein Lambda Layer ist ein .zip-Dateiarchiv, das zusätzlichen Code oder andere Inhalte enthalten kann. Ein Layer kann Bibliotheken, ein benutzerdefiniertes Runtime, 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 Ihr bevorzugtes Runtime, Bibliotheken und andere Abhängigkeiten in das Container-Image, wenn Sie das Image erstellen.
Lambda Extensions
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 oder in Container-Image-Bereitstellungen hinzugefügt werden, arbeiten in zwei Modi: intern und extern.
- Interne Extensions verschmelzen mit dem Runtime-Prozess und manipulieren dessen Start mit sprachspezifischen Umgebungsvariablen und Wrapper-Skripten. Diese Anpassung gilt für eine Reihe von Runtimes, 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 Runtimes 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 Runtimes kompatibel.
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>
Eine Lambda aufrufen
Manuell
# 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
Über exponierte 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-Funktion über URL aufrufen
Jetzt ist es an der Zeit, mögliche Lambda-Funktionen zu finden, die ausgeführt werden können:
aws --region us-west-2 --profile level6 lambda list-functions
Eine Lambda-Funktion mit dem Namen "Level6" ist verfügbar. Lassen Sie uns herausfinden, wie man sie aufruft:
aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6
Jetzt, da du den Namen und die ID kennst, kannst du den Namen abrufen:
aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"
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>
Andere Trigger
Es gibt viele andere Quellen, die eine Lambda-Funktion auslösen können.
.png)
Privesc
Auf der folgenden Seite können Sie überprüfen, wie Sie Lambda-Berechtigungen missbrauchen können, um Privilegien zu eskalieren:
Unauthentifizierter Zugriff
AWS - Lambda Unauthenticated Access
Post-Exploitation
AWS - Lambda Post Exploitation
Persistenz
Referenzen
- https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer
- https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.