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

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’état Next vers 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 SecondsPath ou TimestampPath.
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 :

AWS - Step Functions Privesc

Post Exploitation

AWS - Step Functions Post Exploitation

Persistence

AWS - Step Functions Persistence

References

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