AWS - Step Functions Enum
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Step Functions
AWS Step Functions est un service de flux de travail qui vous permet de coordonner et dâorchestrer plusieurs services AWS en flux de travail sans serveur. En utilisant AWS Step Functions, vous pouvez concevoir et exĂ©cuter des flux de travail qui connectent divers services AWS tels quâAWS Lambda, Amazon S3, Amazon DynamoDB, et bien dâautres, dans une sĂ©quence dâĂ©tapes. Ce service dâorchestration fournit une interface de flux de travail visuelle et offre des capacitĂ©s de machine dâĂ©tat, vous permettant de dĂ©finir chaque Ă©tape du flux de travail de maniĂšre dĂ©clarative en utilisant le Amazon States Language (ASL) basĂ© sur JSON.
Concepts clés
Flux de travail Standard vs. Express
AWS Step Functions propose deux types de flux de travail de machine dâĂ©tat : Standard et Express.
- Flux de travail Standard : Ce type de flux de travail par dĂ©faut est conçu pour des processus durables, auditĂ©s et de longue durĂ©e. Il prend en charge lâexĂ©cution exactement une fois, garantissant que les tĂąches sâexĂ©cutent une seule fois, sauf si des rĂ©essais sont spĂ©cifiĂ©s. Il est idĂ©al pour les flux de travail nĂ©cessitant un historique dâexĂ©cution dĂ©taillĂ© et peut fonctionner jusquâĂ un an.
- Flux de travail Express : Ce type est idĂ©al pour des tĂąches de volume Ă©levĂ© et de courte durĂ©e, sâexĂ©cutant jusquâĂ cinq minutes. Ils prennent en charge lâexĂ©cution au moins une fois, adaptĂ©s aux tĂąches idempotentes comme le traitement de donnĂ©es. Ces flux de travail sont optimisĂ©s pour le coĂ»t et la performance, facturant en fonction des exĂ©cutions, de la durĂ©e et de lâutilisation de la mĂ©moire.
Ătats
Les Ă©tats sont les unitĂ©s essentielles des machines dâĂ©tat. Ils dĂ©finissent les Ă©tapes individuelles au sein dâun flux de travail, pouvant effectuer une variĂ©tĂ© de fonctions selon leur type :
- Task : Exécute un travail, souvent en utilisant un service AWS comme Lambda.
- Choice : Prend des dĂ©cisions basĂ©es sur lâentrĂ©e.
- Fail/Succeed : Termine lâexĂ©cution avec un Ă©chec ou un succĂšs.
- Pass : Transmet lâentrĂ©e Ă la sortie ou injecte des donnĂ©es.
- Wait : Retarde lâexĂ©cution pendant un temps dĂ©fini.
- Parallel : Initie des branches parallĂšles.
- Map : ItÚre dynamiquement les étapes sur des éléments.
Task
Un Ă©tat Task reprĂ©sente une unitĂ© de travail unique exĂ©cutĂ©e par une machine dâĂ©tat. Les tĂąches peuvent invoquer diverses ressources, y compris des activitĂ©s, des fonctions Lambda, des services AWS ou des API tierces.
- Activities : Travailleurs personnalisés que vous gérez, adaptés aux processus de longue durée.
- Ressource :
arn:aws:states:region:account:activity:name. - Lambda Functions : Exécute des fonctions AWS Lambda.
- Ressource :
arn:aws:lambda:region:account:function:function-name. - AWS Services : SâintĂšgre directement avec dâautres services AWS, comme DynamoDB ou S3.
- Ressource :
arn:partition:states:region:account:servicename:APIname. - HTTP Task : Appelle des API tierces.
- Champ de ressource :
arn:aws:states:::http:invoke. Ensuite, vous devez fournir les dĂ©tails de configuration de lâendpoint API, tels que lâURL de lâAPI, la mĂ©thode et les dĂ©tails dâauthentification.
Lâexemple suivant montre une dĂ©finition dâĂ©tat Task qui invoque une fonction Lambda appelĂ©e HelloWorld :
"HelloWorld": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"Payload.$": "$",
"FunctionName": "arn:aws:lambda:<region>:<account-id>:function:HelloWorld"
},
"End": true
}
Choix
Un Ă©tat de Choix ajoute une logique conditionnelle Ă un flux de travail, permettant des dĂ©cisions basĂ©es sur des donnĂ©es dâentrĂ©e. Il Ă©value les conditions spĂ©cifiĂ©es et transitionne vers lâĂ©tat correspondant en fonction des rĂ©sultats.
- Comparaison : Chaque rÚgle de choix inclut un opérateur de comparaison (par exemple,
NumericEquals,StringEquals) qui compare une variable dâentrĂ©e Ă une valeur spĂ©cifiĂ©e ou Ă une autre variable. - Champ Suivant : Les Ă©tats de choix ne prennent pas en charge le champ
End, au lieu de cela, ils dĂ©finissent lâĂ©tatNextvers lequel transiter si la comparaison est vraie.
Exemple dâĂ©tat de Choix :
{
"Variable": "$.timeStamp",
"TimestampEquals": "2000-01-01T00:00:00Z",
"Next": "TimeState"
}
Ăchec/RĂ©ussite
Un Ă©tat Fail arrĂȘte lâexĂ©cution dâune machine dâĂ©tat et la marque comme un Ă©chec. Il est utilisĂ© pour spĂ©cifier un nom dâerreur et une cause, fournissant des dĂ©tails sur lâĂ©chec. Cet Ă©tat est terminal, ce qui signifie quâil met fin au flux dâexĂ©cution.
Un Ă©tat Succeed arrĂȘte lâexĂ©cution avec succĂšs. Il est gĂ©nĂ©ralement utilisĂ© pour terminer le flux de travail lorsquâil se termine avec succĂšs. Cet Ă©tat ne nĂ©cessite pas de champ Next.
"FailState": {
"Type": "Fail",
"Error": "ErrorName",
"Cause": "Error details"
}
Pass
Un Ă©tat Pass transmet son entrĂ©e Ă sa sortie soit sans effectuer de travail, soit en transformant lâentrĂ©e dâĂ©tat JSON Ă lâaide de filtres, puis en passant les donnĂ©es transformĂ©es Ă lâĂ©tat suivant. Il est utile pour tester et construire des machines dâĂ©tat, vous permettant dâinjecter des donnĂ©es statiques ou de les transformer.
"PassState": {
"Type": "Pass",
"Result": {"key": "value"},
"ResultPath": "$.newField",
"Next": "NextState"
}
Attendre
Un Ă©tat Wait retarde lâexĂ©cution de la machine dâĂ©tat pendant une durĂ©e spĂ©cifiĂ©e. Il existe trois mĂ©thodes principales pour configurer le temps dâattente :
- X Secondes : Un nombre fixe de secondes Ă attendre.
"WaitState": {
"Type": "Wait",
"Seconds": 10,
"Next": "NextState"
}
- Horodatage Absolu : Un moment exact jusquâauquel attendre.
"WaitState": {
"Type": "Wait",
"Timestamp": "2024-03-14T01:59:00Z",
"Next": "NextState"
}
- Attente Dynamique : BasĂ©e sur lâentrĂ©e utilisant
SecondsPathouTimestampPath.
jsonCopiar cĂłdigo
"WaitState": {
"Type": "Wait",
"TimestampPath": "$.expirydate",
"Next": "NextState"
}
ParallĂšle
Un Ă©tat Parallel vous permet dâexĂ©cuter plusieurs branches de tĂąches simultanĂ©ment dans votre flux de travail. Chaque branche sâexĂ©cute indĂ©pendamment et traite sa propre sĂ©quence dâĂ©tats. LâexĂ©cution attend que toutes les branches soient terminĂ©es avant de passer Ă lâĂ©tat suivant. Ses champs clĂ©s sont :
- Branches : Un tableau dĂ©finissant les chemins dâexĂ©cution parallĂšles. Chaque branche est une machine dâĂ©tat distincte.
- ResultPath : DĂ©finit oĂč (dans lâentrĂ©e) placer la sortie combinĂ©e des branches.
- Retry et Catch : Configurations de gestion des erreurs pour lâĂ©tat parallĂšle.
"ParallelState": {
"Type": "Parallel",
"Branches": [
{
"StartAt": "Task1",
"States": { ... }
},
{
"StartAt": "Task2",
"States": { ... }
}
],
"Next": "NextState"
}
Map
Un Map Ă©tat permet lâexĂ©cution dâun ensemble dâĂ©tapes pour chaque Ă©lĂ©ment dâun ensemble de donnĂ©es. Il est utilisĂ© pour le traitement parallĂšle des donnĂ©es. Selon la maniĂšre dont vous souhaitez traiter les Ă©lĂ©ments de lâensemble de donnĂ©es, Step Functions propose les modes suivants :
- Inline Mode : ExĂ©cute un sous-ensemble dâĂ©tats pour chaque Ă©lĂ©ment du tableau JSON. Convient aux tĂąches Ă petite Ă©chelle avec moins de 40 itĂ©rations parallĂšles, exĂ©cutant chacune dâelles dans le contexte du flux de travail contenant lâĂ©tat
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 : Conçu pour le traitement parallĂšle Ă grande Ă©chelle avec une haute concurrence. Prend en charge le traitement de grands ensembles de donnĂ©es, tels que ceux stockĂ©s dans Amazon S3, permettant une haute concurrence allant jusquâĂ 10 000 exĂ©cutions de flux de travail enfants parallĂšles, exĂ©cutant ces enfants comme une exĂ©cution enfant sĂ©parĂ©e.
"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 et alias
Step Functions vous permet Ă©galement de gĂ©rer les dĂ©ploiements de flux de travail via des versions et des alias de machines dâĂ©tat. Une version reprĂ©sente un instantanĂ© dâune machine dâĂ©tat qui peut ĂȘtre exĂ©cutĂ©. Les alias servent de pointeurs vers jusquâĂ deux versions dâune machine dâĂ©tat.
- Versions : Ces instantanĂ©s immuables dâune machine dâĂ©tat sont créés Ă partir de la rĂ©vision la plus rĂ©cente de cette machine dâĂ©tat. Chaque version est identifiĂ©e par un ARN unique qui combine lâARN de la machine dâĂ©tat avec le numĂ©ro de version, sĂ©parĂ©s par un deux-points (
arn:aws:states:region:account-id:stateMachine:StateMachineName:version-number). Les versions ne peuvent pas ĂȘtre modifiĂ©es, mais vous pouvez mettre Ă jour la machine dâĂ©tat et publier une nouvelle version, ou utiliser la version de machine dâĂ©tat souhaitĂ©e. - Alias : Ces pointeurs peuvent rĂ©fĂ©rencer jusquâĂ deux versions de la mĂȘme machine dâĂ©tat. Plusieurs alias peuvent ĂȘtre créés pour une seule machine dâĂ©tat, chacun identifiĂ© par un ARN unique construit en combinant lâARN de la machine dâĂ©tat avec le nom de lâalias, sĂ©parĂ©s par un deux-points (
arn:aws:states:region:account-id:stateMachine:StateMachineName:aliasName). Les alias permettent de diriger le trafic entre lâune des deux versions dâune machine dâĂ©tat. Alternativement, un alias peut pointer vers une version spĂ©cifique de la machine dâĂ©tat, mais pas vers dâautres alias. Ils peuvent ĂȘtre mis Ă jour pour rediriger vers une version diffĂ©rente de la machine dâĂ©tat si nĂ©cessaire, facilitant les dĂ©ploiements contrĂŽlĂ©s et la gestion des flux de travail.
Pour des informations plus détaillées sur ASL, consultez : Amazon States Language.
RĂŽles IAM pour les machines dâĂ©tat
AWS Step Functions utilise les rĂŽles AWS Identity and Access Management (IAM) pour contrĂŽler lâaccĂšs aux ressources et aux actions au sein des machines dâĂ©tat. Voici les principaux aspects liĂ©s Ă la sĂ©curitĂ© et aux rĂŽles IAM dans AWS Step Functions :
- RĂŽle dâexĂ©cution : Chaque machine dâĂ©tat dans AWS Step Functions est associĂ©e Ă un rĂŽle dâexĂ©cution IAM. Ce rĂŽle dĂ©finit quelles actions la machine dâĂ©tat peut effectuer en votre nom. Lorsquâune machine dâĂ©tat passe dâĂ©tats qui interagissent avec des services AWS (comme invoquer des fonctions Lambda, accĂ©der Ă DynamoDB, etc.), elle assume ce rĂŽle dâexĂ©cution pour rĂ©aliser ces actions.
- Permissions : Le rĂŽle dâexĂ©cution IAM doit ĂȘtre configurĂ© avec des permissions qui permettent les actions nĂ©cessaires sur dâautres services AWS. Par exemple, si votre machine dâĂ©tat doit invoquer des fonctions AWS Lambda, le rĂŽle IAM doit avoir des permissions
lambda:InvokeFunction. De mĂȘme, si elle doit Ă©crire dans DynamoDB, des permissions appropriĂ©es (dynamodb:PutItem,dynamodb:UpdateItem, etc.) doivent ĂȘtre accordĂ©es.
ĂnumĂ©ration
La politique ReadOnlyAccess est suffisante pour toutes les actions dâĂ©numĂ©ration suivantes.
# 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
Dans la page suivante, vous pouvez vérifier comment abuser des permissions des Step Functions pour escalader les privilÚges :
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
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

