AWS - Lambda Persistence

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

Lambda

Weitere Informationen:

AWS - Lambda Enum

Lambda Layer Persistence

Es ist möglich, introduce/backdoor a layer to execute arbitrary code die beim Aufruf der Lambda heimlich Code ausführt:

AWS - Lambda Layers Persistence

Lambda Extension Persistence

Durch Missbrauch von Lambda Layers ist es außerdem möglich, extensions zu missbrauchen und in der Lambda persistent zu bleiben sowie Anfragen zu stehlen und zu verändern.

AWS - Abusing Lambda Extensions

Via resource policies

Es ist möglich, externen Accounts Zugriff auf verschiedene Lambda-Aktionen (z. B. invoke oder update code) zu gewähren:

Versions, Aliases & Weights

Eine Lambda kann unterschiedliche Versionen haben (mit für jede Version unterschiedlichem Code).
Anschließend kann man unterschiedliche Aliases mit unterschiedlichen Versionen der Lambda erstellen und jedem verschiedene Gewichte zuweisen.
Auf diese Weise könnte ein Angreifer eine backdoored version 1 und eine version 2 with only the legit code erstellen und only execute the version 1 in 1% der Requests ausführen, um unauffällig zu bleiben.

Version Backdoor + API Gateway

  1. Kopiere den Originalcode der Lambda
  2. Create a new version backdooring den Originalcode (oder nur mit bösartigem Code). Veröffentliche und deploy that version zu $LATEST
  3. Rufe das API Gateway, das mit der Lambda verbunden ist, auf, um den Code auszuführen
  4. Create a new version with the original code, Veröffentliche und deploy that version zu $LATEST.
  5. Dies wird den backdoored Code in einer vorherigen Version verbergen
  6. Gehe zum API Gateway und create a new POST method (oder wähle eine andere Methode), die die backdoored Version der Lambda ausführt: arn:aws:lambda:us-east-1:<acc_id>:function:<func_name>:1
  7. Beachte das abschließende :1 der arn indicating the version of the function (Version 1 wird in diesem Szenario die backdoored sein).
  8. Wähle die erstellte POST-Methode aus und wähle unter Actions Deploy API
  9. Nun, wenn du die Funktion via POST aufrufst, wird dein Backdoor ausgeführt

Cron/Event actuator

Die Tatsache, dass man lambda functions run when something happen or when some time pass kann, macht Lambda zu einer beliebten Methode, um Persistenz zu erreichen und Erkennung zu vermeiden.
Hier einige Ideen, um deine presence in AWS more stealth by creating lambdas zu erhöhen:

  • Jedes Mal, wenn ein neuer Benutzer erstellt wird, generiert Lambda einen neuen Benutzerkey und sendet ihn an den Angreifer.
  • Jedes Mal, wenn eine neue Rolle erstellt wird, gewährt Lambda kompromittierten Benutzern assume role-Berechtigungen.
  • Jedes Mal, wenn neue cloudtrail logs erzeugt werden, lösche/ändere sie

RCE abusing AWS_LAMBDA_EXEC_WRAPPER + Lambda Layers

Missbrauche die Umgebungsvariable AWS_LAMBDA_EXEC_WRAPPER, um ein vom Angreifer kontrolliertes Wrapper-Skript auszuführen, bevor runtime/handler startet. Liefere den Wrapper über eine Lambda Layer unter /opt/bin/htwrap, setze AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap und rufe dann die Funktion auf. Der Wrapper läuft im Prozess des Function-Runtimes, erbt die Function Execution Rolle und macht schließlich ein exec des echten Runtimes, sodass der originale Handler normal ausgeführt wird.

AWS - Lambda Exec Wrapper Persistence

AWS - Lambda Function URL Public Exposure

Missbrauche Lambda asynchronous destinations zusammen mit der Recursion-Konfiguration, um eine Funktion kontinuierlich selbst erneut aufzurufen, ohne externen Scheduler (kein EventBridge, cron, etc.). Standardmäßig beendet Lambda rekursive Schleifen, aber durch Setzen der Recursion-Konfiguration auf Allow werden diese wieder aktiviert. Destinations liefern auf Service-Seite für async invokes, daher erzeugt ein einzelner Seed invoke einen unauffälligen, codefreien Heartbeat/Backdoor-Kanal. Optional kannst du mit reserved concurrency drosseln, um das Rauschen gering zu halten.

AWS - Lambda Async Self Loop Persistence

AWS - Lambda Alias-Scoped Resource Policy Backdoor

Erstelle eine versteckte Lambda-Version mit Angreifer-Logic und scope eine resource-based policy auf diese spezifische Version (oder Alias) mit dem Parameter --qualifier in lambda add-permission. Gewähre nur lambda:InvokeFunction auf arn:aws:lambda:REGION:ACCT:function:FN:VERSION an ein Angreifer-Principal. Normale Aufrufe über den Funktionsnamen oder den primären Alias bleiben unbeeinträchtigt, während der Angreifer die backdoored Version-ARN direkt aufrufen kann.

Das ist unauffälliger als das Offenlegen einer Function URL und ändert nicht den primären Traffic-Alias.

AWS - Lambda Alias Version Policy Backdoor

Freezing AWS Lambda Runtimes

Ein Angreifer, der über die Berechtigungen lambda:InvokeFunction, logs:FilterLogEvents, lambda:PutRuntimeManagementConfig und lambda:GetRuntimeManagementConfig verfügt, kann die Runtime-Management-Konfiguration einer Funktion ändern. Dieser Angriff ist besonders effektiv, wenn das Ziel darin besteht, eine Lambda-Funktion auf einer verwundbaren Runtime-Version zu belassen oder die Kompatibilität mit bösartigen Layers zu erhalten, die mit neueren Runtimes inkompatibel sein könnten.

Der Angreifer ändert die runtime management configuration, um die Runtime-Version zu fixieren:

# Invoke the function to generate runtime logs
aws lambda invoke \
--function-name $TARGET_FN \
--payload '{}' \
--region us-east-1 /tmp/ping.json

sleep 5

# Freeze automatic runtime updates on function update
aws lambda put-runtime-management-config \
--function-name $TARGET_FN \
--update-runtime-on FunctionUpdate \
--region us-east-1

Überprüfen Sie die angewendete Konfiguration:

aws lambda get-runtime-management-config \
--function-name $TARGET_FN \
--region us-east-1

Optional: Auf eine bestimmte Runtime-Version festlegen

# Extract Runtime Version ARN from INIT_START logs
RUNTIME_ARN=$(aws logs filter-log-events \
--log-group-name /aws/lambda/$TARGET_FN \
--filter-pattern "INIT_START" \
--query 'events[0].message' \
--output text | grep -o 'Runtime Version ARN: [^,]*' | cut -d' ' -f4)

An eine bestimmte Runtime-Version binden:

aws lambda put-runtime-management-config \
--function-name $TARGET_FN \
--update-runtime-on Manual \
--runtime-version-arn $RUNTIME_ARN \
--region us-east-1

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