AWS - Step Functions Enum

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Step Functions

AWS Step Functions to usługa przepływu pracy, która umożliwia koordynację i orkiestrację wielu usług AWS w bezserwerowych przepływach pracy. Korzystając z AWS Step Functions, możesz projektować i uruchamiać przepływy pracy, które łączą różne usługi AWS, takie jak AWS Lambda, Amazon S3, Amazon DynamoDB i wiele innych, w sekwencji kroków. Ta usługa orkiestracji zapewnia wizualny interfejs przepływu pracy i oferuje możliwości maszyny stanów, pozwalając na definiowanie każdego kroku przepływu pracy w sposób deklaratywny przy użyciu opartego na JSON Amazon States Language (ASL).

Key concepts

Standard vs. Express Workflows

AWS Step Functions oferuje dwa typy przepływów pracy maszyny stanów: Standard i Express.

  • Standard Workflow: Ten domyślny typ przepływu pracy jest zaprojektowany dla długoterminowych, trwałych i audytowalnych procesów. Obsługuje wykonanie dokładnie raz, zapewniając, że zadania są uruchamiane tylko raz, chyba że określono ponowne próby. Jest idealny dla przepływów pracy wymagających szczegółowej historii wykonania i może działać przez okres do jednego roku.

  • Express Workflow: Ten typ jest idealny dla zadań o dużej objętości i krótkim czasie trwania, działających do pięciu minut. Obsługują wykonanie przynajmniej raz, odpowiednie dla zadań idempotentnych, takich jak przetwarzanie danych. Te przepływy pracy są zoptymalizowane pod kątem kosztów i wydajności, naliczając opłaty na podstawie wykonania, czasu trwania i użycia pamięci.

States

Stany są podstawowymi jednostkami maszyn stanów. Definiują poszczególne kroki w przepływie pracy, mogąc wykonywać różnorodne funkcje w zależności od ich typu:

  • Task: Wykonuje zadanie, często korzystając z usługi AWS, takiej jak Lambda.

  • Choice: Podejmuje decyzje na podstawie wejścia.

  • Fail/Succeed: Kończy wykonanie z niepowodzeniem lub sukcesem.

  • Pass: Przekazuje dane wejściowe do wyjścia lub wstrzykuje dane.

  • Wait: Opóźnia wykonanie na określony czas.

  • Parallel: Inicjuje równoległe gałęzie.

  • Map: Dynamicznie iteruje kroki nad elementami.

Task

Stan Task reprezentuje pojedynczą jednostkę pracy wykonywaną przez maszynę stanów. Zadania mogą wywoływać różne zasoby, w tym aktywności, funkcje Lambda, usługi AWS lub interfejsy API stron trzecich.

  • Activities: Niestandardowi pracownicy, którymi zarządzasz, odpowiedni do długoterminowych procesów.

  • Zasób: arn:aws:states:region:account:activity:name.

  • Lambda Functions: Wykonuje funkcje AWS Lambda.

  • Zasób: arn:aws:lambda:region:account:function:function-name.

  • AWS Services: Integruje się bezpośrednio z innymi usługami AWS, takimi jak DynamoDB lub S3.

  • Zasób: arn:partition:states:region:account:servicename:APIname.

  • HTTP Task: Wywołuje interfejsy API stron trzecich.

  • Pole zasobu: arn:aws:states:::http:invoke. Następnie należy podać szczegóły konfiguracji punktu końcowego API, takie jak adres URL API, metoda i szczegóły uwierzytelnienia.

Poniższy przykład pokazuje definicję stanu Task, który wywołuje funkcję Lambda o nazwie HelloWorld:

"HelloWorld": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"Payload.$": "$",
"FunctionName": "arn:aws:lambda:<region>:<account-id>:function:HelloWorld"
},
"End": true
}

Choice

Stan Choice dodaje logikę warunkową do przepływu pracy, umożliwiając podejmowanie decyzji na podstawie danych wejściowych. Ocenia określone warunki i przechodzi do odpowiedniego stanu na podstawie wyników.

  • Porównanie: Każda reguła wyboru zawiera operator porównania (np. NumericEquals, StringEquals), który porównuje zmienną wejściową z określoną wartością lub inną zmienną.

  • Pole Next: Stany Choice nie obsługują pola End, zamiast tego definiują stan Next, do którego należy przejść, jeśli porównanie jest prawdziwe.

Przykład stanu Choice:

{
"Variable": "$.timeStamp",
"TimestampEquals": "2000-01-01T00:00:00Z",
"Next": "TimeState"
}

Fail/Succeed

Stan Fail zatrzymuje wykonanie maszyny stanów i oznacza ją jako błąd. Służy do określenia nazwy błędu i przyczyny, dostarczając szczegóły dotyczące awarii. Ten stan jest terminalny, co oznacza, że kończy przepływ wykonania.

Stan Succeed zatrzymuje wykonanie pomyślnie. Zwykle jest używany do zakończenia przepływu pracy, gdy zakończy się pomyślnie. Ten stan nie wymaga pola Next.

"FailState": {
"Type": "Fail",
"Error": "ErrorName",
"Cause": "Error details"
}

Pass

Stan Pass przekazuje swoje dane wejściowe do wyjścia, albo bez wykonywania jakiejkolwiek pracy, albo przekształcając dane wejściowe JSON za pomocą filtrów, a następnie przekazując przekształcone dane do następnego stanu. Jest przydatny do testowania i konstruowania maszyn stanowych, umożliwiając wstrzykiwanie statycznych danych lub ich przekształcanie.

"PassState": {
"Type": "Pass",
"Result": {"key": "value"},
"ResultPath": "$.newField",
"Next": "NextState"
}

Wait

Stan Wait opóźnia wykonanie maszyny stanów na określony czas. Istnieją trzy główne metody konfigurowania czasu oczekiwania:

  • X Sekund: Stała liczba sekund do oczekiwania.

"WaitState": {
"Type": "Wait",
"Seconds": 10,
"Next": "NextState"
}
  • Absolutny znacznik czasu: Dokładny czas, do którego należy czekać.

"WaitState": {
"Type": "Wait",
"Timestamp": "2024-03-14T01:59:00Z",
"Next": "NextState"
}
  • Dynamiczne oczekiwanie: Oparte na danych wejściowych przy użyciu SecondsPath lub TimestampPath.

"WaitState": {
"Type": "Wait",
"TimestampPath": "$.expirydate",
"Next": "NextState"
}

Parallel

Stan Parallel pozwala na jednoczesne wykonywanie wielu gałęzi zadań w ramach twojego przepływu pracy. Każda gałąź działa niezależnie i przetwarza swoją własną sekwencję stanów. Wykonanie czeka, aż wszystkie gałęzie zakończą się, zanim przejdzie do następnego stanu. Jego kluczowe pola to:

  • Branches: Tablica definiująca równoległe ścieżki wykonania. Każda gałąź to osobna maszyna stanów.

  • ResultPath: Definiuje, gdzie (w danych wejściowych) umieścić połączony wynik gałęzi.

  • Retry and Catch: Konfiguracje obsługi błędów dla stanu równoległego.

"ParallelState": {
"Type": "Parallel",
"Branches": [
{
"StartAt": "Task1",
"States": { ... }
},
{
"StartAt": "Task2",
"States": { ... }
}
],
"Next": "NextState"
}

Map

Stan Map umożliwia wykonanie zestawu kroków dla każdego elementu w zbiorze danych. Jest używany do równoległego przetwarzania danych. W zależności od tego, jak chcesz przetwarzać elementy zbioru danych, Step Functions oferuje następujące tryby:

  • Tryb Inline: Wykonuje podzbiór stanów dla każdego elementu tablicy JSON. Odpowiedni dla małych zadań z mniej niż 40 równoległymi iteracjami, uruchamiając każdą z nich w kontekście przepływu pracy, który zawiera stan 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"
}
  • Tryb Rozproszony: Zaprojektowany do przetwarzania równoległego na dużą skalę z wysoką współbieżnością. Obsługuje przetwarzanie dużych zbiorów danych, takich jak te przechowywane w Amazon S3, umożliwiając wysoką współbieżność do 10 000 równoległych wykonaniach dziecięcych przepływu pracy, uruchamiając te dzieci jako osobne wykonania.

"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 umożliwia również zarządzanie wdrożeniami przepływu pracy za pomocą wersji i aliasów maszyn stanów. Wersja reprezentuje migawkę maszyny stanów, która może być wykonana. Aliasy służą jako wskaźniki do maksymalnie dwóch wersji maszyny stanów.

  • Wersje: Te niezmienne migawki maszyny stanów są tworzone z najnowszej rewizji tej maszyny stanów. Każda wersja jest identyfikowana przez unikalny ARN, który łączy ARN maszyny stanów z numerem wersji, oddzielonym dwukropkiem (arn:aws:states:region:account-id:stateMachine:StateMachineName:version-number). Wersje nie mogą być edytowane, ale możesz zaktualizować maszynę stanów i opublikować nową wersję lub użyć pożądanej wersji maszyny stanów.

  • Aliasy: Te wskaźniki mogą odnosić się do maksymalnie dwóch wersji tej samej maszyny stanów. Można utworzyć wiele aliasów dla jednej maszyny stanów, z których każdy jest identyfikowany przez unikalny ARN skonstruowany przez połączenie ARN maszyny stanów z nazwą aliasu, oddzielonym dwukropkiem (arn:aws:states:region:account-id:stateMachine:StateMachineName:aliasName). Aliasy umożliwiają kierowanie ruchu między jedną z dwóch wersji maszyny stanów. Alternatywnie, alias może wskazywać na jedną konkretną wersję maszyny stanów, ale nie na inne aliasy. Mogą być aktualizowane, aby przekierować do innej wersji maszyny stanów w razie potrzeby, ułatwiając kontrolowane wdrożenia i zarządzanie przepływem pracy.

Aby uzyskać bardziej szczegółowe informacje na temat ASL, sprawdź: Amazon States Language.

IAM Roles for State machines

AWS Step Functions wykorzystuje role AWS Identity and Access Management (IAM) do kontrolowania dostępu do zasobów i działań w ramach maszyn stanów. Oto kluczowe aspekty związane z bezpieczeństwem i rolami IAM w AWS Step Functions:

  • Rola wykonawcza: Każda maszyna stanów w AWS Step Functions jest powiązana z rolą wykonawczą IAM. Ta rola definiuje, jakie działania maszyna stanów może wykonywać w Twoim imieniu. Gdy maszyna stanów przechodzi między stanami, które wchodzą w interakcję z usługami AWS (takimi jak wywoływanie funkcji Lambda, dostęp do DynamoDB itp.), przyjmuje tę rolę wykonawczą, aby wykonać te działania.

  • Uprawnienia: Rola wykonawcza IAM musi być skonfigurowana z uprawnieniami, które pozwalają na niezbędne działania w innych usługach AWS. Na przykład, jeśli Twoja maszyna stanów musi wywołać funkcje AWS Lambda, rola IAM musi mieć uprawnienia lambda:InvokeFunction. Podobnie, jeśli musi zapisać do DynamoDB, odpowiednie uprawnienia (dynamodb:PutItem, dynamodb:UpdateItem, itp.) muszą być przyznane.

Enumeration

Polityka ReadOnlyAccess jest wystarczająca dla wszystkich poniższych działań enumeracyjnych.

# 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

Na poniższej stronie możesz sprawdzić, jak nadużyć uprawnień Step Functions, aby eskalować uprawnienia:

AWS - Step Functions Privesc

Post Exploitation

AWS - Step Functions Post Exploitation

Persistence

AWS - Step Functions Persistence

References

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie dla HackTricks

Last updated