AWS - Step Functions Enum
Reading time: 11 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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Step Functions
AWS Step Functions - це сервіс робочих процесів, який дозволяє вам координувати та організовувати кілька сервісів AWS у безсерверні робочі процеси. Використовуючи AWS Step Functions, ви можете проектувати та виконувати робочі процеси, які з'єднують різні сервіси AWS, такі як AWS Lambda, Amazon S3, Amazon DynamoDB та багато інших, у послідовності кроків. Цей сервіс оркестрації надає візуальний інтерфейс робочого процесу та пропонує можливості state machine, що дозволяє вам визначати кожен крок робочого процесу декларативним чином, використовуючи JSON-формат Amazon States Language (ASL).
Key concepts
Standard vs. Express Workflows
AWS Step Functions пропонує два типи state machine workflows: Standard та Express.
- Standard Workflow: Цей тип робочого процесу за замовчуванням призначений для тривалих, надійних та аудиторських процесів. Він підтримує exactly-once execution, забезпечуючи виконання завдань лише один раз, якщо не вказані повторні спроби. Ідеально підходить для робочих процесів, які потребують детальної історії виконання, і може працювати до одного року.
- Express Workflow: Цей тип ідеально підходить для завдань з високим обсягом та короткою тривалістю, що тривають до п'яти хвилин. Вони підтримують at-least-once execution, підходять для ідемпотентних завдань, таких як обробка даних. Ці робочі процеси оптимізовані для витрат та продуктивності, стягуючи плату на основі виконань, тривалості та використання пам'яті.
States
States - це основні одиниці state machines. Вони визначають окремі кроки в робочому процесі, здатні виконувати різноманітні функції в залежності від їх типу:
- Task: Виконує завдання, часто використовуючи сервіс AWS, такий як Lambda.
- Choice: Приймає рішення на основі вхідних даних.
- Fail/Succeed: Завершує виконання з помилкою або успіхом.
- Pass: Передає вхідні дані на вихід або вводить дані.
- Wait: Затримує виконання на певний час.
- Parallel: Ініціює паралельні гілки.
- Map: Динамічно ітерує кроки над елементами.
Task
Стан Task представляє собою єдину одиницю роботи, виконувану state machine. Завдання можуть викликати різні ресурси, включаючи активності, функції Lambda, сервіси AWS або сторонні API.
- Activities: Користувацькі працівники, які ви керуєте, підходять для тривалих процесів.
- Resource:
arn:aws:states:region:account:activity:name
. - Lambda Functions: Виконує функції AWS Lambda.
- Resource:
arn:aws:lambda:region:account:function:function-name
. - AWS Services: Інтегрується безпосередньо з іншими сервісами AWS, такими як DynamoDB або S3.
- Resource:
arn:partition:states:region:account:servicename:APIname
. - HTTP Task: Викликає сторонні API.
- Resource field:
arn:aws:states:::http:invoke
. Потім ви повинні надати деталі конфігурації кінцевої точки API, такі як URL API, метод та деталі аутентифікації.
Наступний приклад показує визначення стану Task, який викликає функцію Lambda під назвою HelloWorld:
"HelloWorld": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"Payload.$": "$",
"FunctionName": "arn:aws:lambda:<region>:<account-id>:function:HelloWorld"
},
"End": true
}
Вибір
Стан Choice додає умовну логіку до робочого процесу, що дозволяє приймати рішення на основі вхідних даних. Він оцінює вказані умови та переходить до відповідного стану на основі результатів.
- Порівняння: Кожне правило вибору включає оператор порівняння (наприклад,
NumericEquals
,StringEquals
), який порівнює вхідну змінну з вказаним значенням або іншою змінною. - Поле Next: Стан вибору не підтримує поле
End
, натомість він визначає станNext
для переходу, якщо порівняння є істинним.
Приклад стану Choice:
{
"Variable": "$.timeStamp",
"TimestampEquals": "2000-01-01T00:00:00Z",
"Next": "TimeState"
}
Fail/Succeed
Стан Fail
зупиняє виконання машини станів і позначає його як невдале. Він використовується для вказівки назви помилки та причини, надаючи деталі про невдачу. Цей стан є термінальним, що означає, що він завершує потік виконання.
Стан Succeed
зупиняє виконання успішно. Він зазвичай використовується для завершення робочого процесу, коли він успішно завершується. Цей стан не вимагає поля Next
.
"FailState": {
"Type": "Fail",
"Error": "ErrorName",
"Cause": "Error details"
}
Pass
Стан Pass передає свій вхідний сигнал на вихід або без виконання будь-якої роботи, або перетворюючи вхідний JSON стан за допомогою фільтрів, а потім передаючи перетворені дані до наступного стану. Це корисно для тестування та побудови станів машин, дозволяючи вам вводити статичні дані або перетворювати їх.
"PassState": {
"Type": "Pass",
"Result": {"key": "value"},
"ResultPath": "$.newField",
"Next": "NextState"
}
Wait
Стан Wait затримує виконання машини станів на вказаний проміжок часу. Існує три основні методи для налаштування часу очікування:
- X Seconds: Фіксована кількість секунд для очікування.
"WaitState": {
"Type": "Wait",
"Seconds": 10,
"Next": "NextState"
}
- Absolute Timestamp: Точний час, до якого потрібно чекати.
"WaitState": {
"Type": "Wait",
"Timestamp": "2024-03-14T01:59:00Z",
"Next": "NextState"
}
- Dynamic Wait: На основі вхідних даних, використовуючи
SecondsPath
абоTimestampPath
.
jsonCopiar código
"WaitState": {
"Type": "Wait",
"TimestampPath": "$.expirydate",
"Next": "NextState"
}
Parallel
Стан Parallel дозволяє виконувати кілька гілок завдань одночасно у вашому робочому процесі. Кожна гілка виконується незалежно та обробляє свою власну послідовність станів. Виконання чекає, поки всі гілки завершаться, перш ніж перейти до наступного стану. Його ключові поля:
- Branches: Масив, що визначає паралельні шляхи виконання. Кожна гілка є окремою машиною станів.
- ResultPath: Визначає, де (вхідних даних) розмістити об'єднаний вихід гілок.
- Retry and Catch: Налаштування обробки помилок для паралельного стану.
"ParallelState": {
"Type": "Parallel",
"Branches": [
{
"StartAt": "Task1",
"States": { ... }
},
{
"StartAt": "Task2",
"States": { ... }
}
],
"Next": "NextState"
}
Map
Стан Map дозволяє виконання набору кроків для кожного елемента в наборі даних. Він використовується для паралельної обробки даних. В залежності від того, як ви хочете обробляти елементи набору даних, Step Functions надає наступні режими:
- Inline Mode: Виконує підмножину станів для кожного елемента JSON масиву. Підходить для маломасштабних завдань з менше ніж 40 паралельними ітераціями, виконуючи кожну з них в контексті робочого процесу, що містить стан
Map
.
"MapState": {
"Type": "Map",
"ItemsPath": "$.arrayItems",
"ItemProcessor": {
"ProcessorConfig": {
"Mode": "INLINE"
},
"StartAt": "AddState",
"States": {
"AddState": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"OutputPath": "$.Payload",
"Parameters": {
"FunctionName": "arn:aws:lambda:<region>:<account-id>:function:add-function"
},
"End": true
}
}
},
"End": true
"ResultPath": "$.detail.added",
"ItemsPath": "$.added"
}
- Distributed Mode: Призначений для великомасштабної паралельної обробки з високою конкурентністю. Підтримує обробку великих наборів даних, таких як ті, що зберігаються в Amazon S3, що дозволяє високій конкурентності до 10,000 паралельних виконань дочірніх робочих процесів, виконуючи ці дочірні як окреме дочірнє виконання.
"DistributedMapState": {
"Type": "Map",
"ItemReader": {
"Resource": "arn:aws:states:::s3:getObject",
"Parameters": {
"Bucket": "my-bucket",
"Key": "data.csv"
}
},
"ItemProcessor": {
"ProcessorConfig": {
"Mode": "DISTRIBUTED",
"ExecutionType": "EXPRESS"
},
"StartAt": "ProcessItem",
"States": {
"ProcessItem": {
"Type": "Task",
"Resource": "arn:aws:lambda:region:account-id:function:my-function",
"End": true
}
}
},
"End": true
"ResultWriter": {
"Resource": "arn:aws:states:::s3:putObject",
"Parameters": {
"Bucket": "myOutputBucket",
"Prefix": "csvProcessJobs"
}
}
}
Versions and aliases
Step Functions також дозволяє вам керувати розгортаннями робочих процесів через версії та псевдоніми станів машин. Версія представляє собою знімок стану машини, який може бути виконаний. Псевдоніми служать вказівниками на до двох версій стану машини.
- Versions: Ці незмінні знімки стану машини створюються з найостаннішої ревізії цієї стану машини. Кожна версія ідентифікується унікальним ARN, який поєднує ARN стану машини з номером версії, розділеним двокрапкою (
arn:aws:states:region:account-id:stateMachine:StateMachineName:version-number
). Версії не можуть бути відредаговані, але ви можете оновити стан машини та опублікувати нову версію або використовувати бажану версію стану машини. - Aliases: Ці вказівники можуть посилатися на до двох версій однієї і тієї ж стану машини. Можна створити кілька псевдонімів для однієї стану машини, кожен з яких ідентифікується унікальним ARN, побудованим шляхом поєднання ARN стану машини з ім'ям псевдоніма, розділеним двокрапкою (
arn:aws:states:region:account-id:stateMachine:StateMachineName:aliasName
). Псевдоніми дозволяють маршрутизацію трафіку між однією з двох версій стану машини. Альтернативно, псевдонім може вказувати на одну конкретну версію стану машини, але не на інші псевдоніми. Їх можна оновити, щоб перенаправити на іншу версію стану машини за потреби, що полегшує контрольовані розгортання та управління робочими процесами.
Для отримання більш детальної інформації про ASL перевірте: Amazon States Language.
IAM Roles for State machines
AWS Step Functions використовує ролі AWS Identity and Access Management (IAM) для контролю доступу до ресурсів та дій у станах машин. Ось ключові аспекти, пов'язані з безпекою та ролями IAM в AWS Step Functions:
- Execution Role: Кожна стан машина в AWS Step Functions асоційована з роллю виконання IAM. Ця роль визначає, які дії стан машина може виконувати від вашого імені. Коли стан машина переходить між станами, які взаємодіють з сервісами AWS (наприклад, виклик функцій Lambda, доступ до DynamoDB тощо), вона приймає цю роль виконання для виконання цих дій.
- Permissions: Роль виконання IAM повинна бути налаштована з дозволами, які дозволяють необхідні дії з іншими сервісами AWS. Наприклад, якщо вашій стану машини потрібно викликати функції AWS Lambda, роль IAM повинна мати дозволи
lambda:InvokeFunction
. Аналогічно, якщо їй потрібно записувати в DynamoDB, повинні бути надані відповідні дозволи (dynamodb:PutItem
,dynamodb:UpdateItem
тощо).
Enumeration
Політика ReadOnlyAccess достатня для всіх наступних дій перерахування.
# State machines #
## List state machines
aws stepfunctions list-state-machines
## Retrieve informatio about the specified state machine
aws stepfunctions describe-state-machine --state-machine-arn <value>
## List versions for the specified state machine
aws stepfunctions list-state-machine-versions --state-machine-arn <value>
## List aliases for the specified state machine
aws stepfunctions list-state-machine-aliases --state-machine-arn <value>
## Retrieve information about the specified state machine alias
aws stepfunctions describe-state-machine-alias --state-machine-alias-arn <value>
## List executions of a state machine
aws stepfunctions list-executions --state-machine-arn <value> [--status-filter <RUNNING | SUCCEEDED | FAILED | TIMED_OUT | ABORTED | PENDING_REDRIVE>] [--redrive-filter <REDRIVEN | NOT_REDRIVEN>]
## Retrieve information and relevant metadata about a state machine execution (output included)
aws stepfunctions describe-execution --execution-arn <value>
## Retrieve information about the state machine associated to the specified execution
aws stepfunctions describe-state-machine-for-execution --execution-arn <value>
## Retrieve the history of the specified execution as a list of events
aws stepfunctions get-execution-history --execution-arn <value> [--reverse-order | --no-reverse-order] [--include-execution-data | --no-include-execution-data]
## List tags for the specified step Functions resource
aws stepfunctions list-tags-for-resource --resource-arn <value>
## Validate the definition of a state machine without creating the resource
aws stepfunctions validate-state-machine-definition --definition <value> [--type <STANDARD | EXPRESS>]
# Activities #
## List existing activities
aws stepfunctions list-activities
## Retrieve information about the specified activity
aws stepfunctions describe-activity --activity-arn <value>
# Map Runs #
## List map runs of an execution
aws stepfunctions list-map-runs --execution-arn <value>
## Provide information about the configuration, progress and results of a Map Run
aws stepfunctions describe-map-run --map-run-arn <value>
## Lists executions of a Map Run
aws stepfunctions list-executions --map-run-arn <value> [--status-filter <RUNNING | SUCCEEDED | FAILED | TIMED_OUT | ABORTED | PENDING_REDRIVE>] [--redrive-filter <REDRIVEN | NOT_REDRIVEN>]
Privesc
На наступній сторінці ви можете перевірити, як зловживати дозволами Step Functions для ескалації привілеїв:
Post Exploitation
AWS - Step Functions Post Exploitation
Persistence
AWS - Step Functions Persistence
References
- https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsstepfunctions.html
- https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html
- https://states-language.net/spec.html
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.