AWS - Lambda Enum

Unterstützen Sie HackTricks

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 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 von Anfangsinvestitionen oder langfristigen Verpflichtungen beseitigt.

Um eine Lambda zu rufen, ist es möglich, sie so oft wie gewünscht (mit Cloudwatch) zu rufen, einen URL-Endpunkt zu exponieren und sie zu rufen, sie über API Gateway zu rufen oder sogar basierend auf Ereignissen wie Änderungen an Daten in einem S3-Bucket oder Aktualisierungen einer DynamoDB-Tabelle.

Der Code einer Lambda wird in /var/task gespeichert.

Lambda Aliase Gewichte

Eine Lambda kann mehrere Versionen haben. Und sie kann mehr als 1 Version haben, die über Aliases exponiert ist. Die Gewichte jeder der Versionen, die innerhalb eines Aliases exponiert sind, entscheiden, welcher Alias die Invocation erhält (es kann zum Beispiel 90%-10% sein). Wenn der Code von einem der Aliase anfällig ist, können Sie Anfragen senden, bis die anfällige Version den Exploit erhält.

Ressourcenrichtlinien

Lambda-Ressourcenrichtlinien ermöglichen es, anderen Diensten/Konten den Zugriff auf die Lambda zu gewähren, um sie beispielsweise aufzurufen. Zum Beispiel ist dies die Richtlinie, um niemandem den Zugriff auf eine über URL exponierte Lambda zu erlauben:

Oder dies, um einem API Gateway zu erlauben, es aufzurufen:

Lambda Datenbank-Proxys

Wenn es Hunderte von gleichzeitigen Lambda-Anfragen gibt, und jede von ihnen muss eine Verbindung zu einer Datenbank herstellen und schließen, wird es einfach nicht funktionieren (Lambdas sind zustandslos und können keine Verbindungen offen halten). Dann, wenn Ihre Lambda-Funktionen mit RDS Proxy anstelle Ihrer Datenbankinstanz interagieren. Es verwaltet das Verbindungspooling, 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 jede Funktionsaufruf neue Verbindungen zu erstellen.

Lambda EFS-Dateisysteme

Um Daten zu speichern und sogar zu teilen, können Lambdas auf EFS zugreifen und diese einbinden, sodass Lambda in der Lage ist, von ihnen zu lesen und zu schreiben.

Lambda Schichten

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 Sie eine Schicht in eine Funktion einfügen, werden die Inhalte im Verzeichnis /opt in der Ausführungsumgebung extrahiert.

Standardmäßig sind die Schichten, die Sie erstellen, privat für Ihr AWS-Konto. Sie können wählen, ob Sie eine Schicht mit anderen Konten teilen oder die Schicht öffentlich machen möchten. Wenn Ihre Funktionen eine Schicht verwenden, die von einem anderen Konto veröffentlicht wurde, können Ihre Funktionen die Schichtversion weiterhin verwenden, nachdem sie gelöscht wurde oder nachdem Ihre Berechtigung zum Zugriff auf die Schicht widerrufen wurde. Sie können jedoch keine neue Funktion erstellen oder Funktionen mit einer gelöschten Schichtversion aktualisieren.

Funktionen, die als Containerbild bereitgestellt werden, verwenden keine Schichten. Stattdessen verpacken Sie Ihre bevorzugte Laufzeit, Bibliotheken und andere Abhängigkeiten in das Containerbild, wenn Sie das Bild erstellen.

Lambda Erweiterungen

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 Containerbildbereitstellungen 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.

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>

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

Call Lambda function via URL

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 Sie den Namen und die ID kennen, können Sie 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.

Privesc

Auf der folgenden Seite können Sie überprüfen, wie man Lambda-Berechtigungen missbrauchen kann, um Privilegien zu eskalieren:

AWS - Lambda Privesc

Unauthentifizierter Zugriff

AWS - Lambda Unauthenticated Access

Post-Exploitation

AWS - Lambda Post Exploitation

Persistenz

AWS - Lambda Persistence

Referenzen

Unterstützen Sie HackTricks

Last updated