AWS - Step Functions Enum

Support HackTricks

Step Functions

AWS Step Functions es un servicio de flujo de trabajo que te permite coordinar y orquestar múltiples servicios de AWS en flujos de trabajo sin servidor. Al usar AWS Step Functions, puedes diseñar y ejecutar flujos de trabajo que conectan varios servicios de AWS como AWS Lambda, Amazon S3, Amazon DynamoDB y muchos más, en una secuencia de pasos. Este servicio de orquestación proporciona una interfaz visual de flujo de trabajo y ofrece capacidades de máquina de estados, permitiéndote definir cada paso del flujo de trabajo de manera declarativa utilizando Amazon States Language (ASL) basado en JSON.

Key concepts

Standard vs. Express Workflows

AWS Step Functions ofrece dos tipos de flujos de trabajo de máquina de estados: Estándar y Expreso.

  • Flujo de trabajo estándar: Este tipo de flujo de trabajo predeterminado está diseñado para procesos duraderos, auditables y de larga duración. Soporta ejecución exactamente una vez, asegurando que las tareas se ejecuten solo una vez a menos que se especifiquen reintentos. Es ideal para flujos de trabajo que necesitan un historial de ejecución detallado y puede ejecutarse durante hasta un año.

  • Flujo de trabajo expreso: Este tipo es ideal para tareas de alto volumen y corta duración, que se ejecutan hasta cinco minutos. Soportan ejecución al menos una vez, adecuado para tareas idempotentes como el procesamiento de datos. Estos flujos de trabajo están optimizados para costo y rendimiento, cobrando según las ejecuciones, la duración y el uso de memoria.

States

Los estados son las unidades esenciales de las máquinas de estados. Definen los pasos individuales dentro de un flujo de trabajo, pudiendo realizar una variedad de funciones dependiendo de su tipo:

  • Tarea: Ejecuta un trabajo, a menudo utilizando un servicio de AWS como Lambda.

  • Elección: Toma decisiones basadas en la entrada.

  • Fallar/Suceder: Termina la ejecución con un fallo o éxito.

  • Pasar: Pasa la entrada a la salida o inyecta datos.

  • Esperar: Retrasa la ejecución por un tiempo establecido.

  • Paralelo: Inicia ramas paralelas.

  • Mapa: Itera dinámicamente pasos sobre elementos.

Task

Un estado de Tarea representa una unidad de trabajo única ejecutada por una máquina de estados. Las tareas pueden invocar varios recursos, incluyendo actividades, funciones Lambda, servicios de AWS o APIs de terceros.

  • Actividades: Trabajadores personalizados que gestionas, adecuados para procesos de larga duración.

  • Recurso: arn:aws:states:region:account:activity:name.

  • Funciones Lambda: Ejecuta funciones de AWS Lambda.

  • Recurso: arn:aws:lambda:region:account:function:function-name.

  • Servicios de AWS: Se integra directamente con otros servicios de AWS, como DynamoDB o S3.

  • Recurso: arn:partition:states:region:account:servicename:APIname.

  • Tarea HTTP: Llama a APIs de terceros.

  • Campo de recurso: arn:aws:states:::http:invoke. Luego, debes proporcionar los detalles de configuración del endpoint de la API, como la URL de la API, el método y los detalles de autenticación.

El siguiente ejemplo muestra una definición de estado de Tarea que invoca una función Lambda llamada HelloWorld:

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

Choice

Un Choice state añade lógica condicional a un flujo de trabajo, permitiendo decisiones basadas en datos de entrada. Evalúa las condiciones especificadas y transiciona al estado correspondiente según los resultados.

  • Comparison: Cada regla de elección incluye un operador de comparación (por ejemplo, NumericEquals, StringEquals) que compara una variable de entrada con un valor especificado u otra variable.

  • Next Field: Los estados de elección no soportan el campo End, en su lugar, definen el estado Next al que transicionar si la comparación es verdadera.

Ejemplo de Choice state:

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

Fail/Succeed

Un Fail estado detiene la ejecución de una máquina de estados y la marca como un fallo. Se utiliza para especificar un nombre de error y una causa, proporcionando detalles sobre el fallo. Este estado es terminal, lo que significa que finaliza el flujo de ejecución.

Un Succeed estado detiene la ejecución con éxito. Se utiliza típicamente para terminar el flujo de trabajo cuando se completa con éxito. Este estado no requiere un campo Next.

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

Pass

Un estado Pass pasa su entrada a su salida, ya sea sin realizar ningún trabajo o transformando la entrada del estado JSON utilizando filtros, y luego pasando los datos transformados al siguiente estado. Es útil para probar y construir máquinas de estado, permitiéndote inyectar datos estáticos o transformarlos.

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

Wait

Un Wait state retrasa la ejecución de la máquina de estados por una duración especificada. Hay tres métodos principales para configurar el tiempo de espera:

  • X Seconds: Un número fijo de segundos para esperar.

"WaitState": {
"Type": "Wait",
"Seconds": 10,
"Next": "NextState"
}
  • Absolute Timestamp: Un tiempo exacto hasta el cual esperar.

"WaitState": {
"Type": "Wait",
"Timestamp": "2024-03-14T01:59:00Z",
"Next": "NextState"
}
  • Dynamic Wait: Basado en la entrada utilizando SecondsPath o TimestampPath.

jsonCopiar código
"WaitState": {
"Type": "Wait",
"TimestampPath": "$.expirydate",
"Next": "NextState"
}

Parallel

Un Parallel state te permite ejecutar múltiples ramas de tareas de manera concurrente dentro de tu flujo de trabajo. Cada rama se ejecuta de forma independiente y procesa su propia secuencia de estados. La ejecución espera hasta que todas las ramas se completen antes de proceder al siguiente estado. Sus campos clave son:

  • Branches: Un array que define las rutas de ejecución paralela. Cada rama es una máquina de estados separada.

  • ResultPath: Define dónde (en la entrada) colocar la salida combinada de las ramas.

  • Retry and Catch: Configuraciones de manejo de errores para el estado paralelo.

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

Mapa

Un Mapa permite la ejecución de un conjunto de pasos para cada elemento en un conjunto de datos. Se utiliza para el procesamiento paralelo de datos. Dependiendo de cómo desees procesar los elementos del conjunto de datos, Step Functions proporciona los siguientes modos:

  • Modo en línea: Ejecuta un subconjunto de estados para cada elemento del arreglo JSON. Adecuado para tareas a pequeña escala con menos de 40 iteraciones paralelas, ejecutando cada una de ellas en el contexto del flujo de trabajo que contiene el Mapa.

"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"
}
  • Modo distribuido: Diseñado para el procesamiento paralelo a gran escala con alta concurrencia. Soporta el procesamiento de grandes conjuntos de datos, como los almacenados en Amazon S3, permitiendo una alta concurrencia de hasta 10,000 ejecuciones de flujos de trabajo secundarios paralelos, ejecutando estos secundarios como una ejecución secundaria separada.

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

Versiones y alias

Step Functions también te permite gestionar implementaciones de flujos de trabajo a través de versiones y alias de máquinas de estado. Una versión representa una instantánea de una máquina de estado que puede ser ejecutada. Los alias sirven como punteros a hasta dos versiones de una máquina de estado.

  • Versiones: Estas instantáneas inmutables de una máquina de estado se crean a partir de la revisión más reciente de esa máquina de estado. Cada versión se identifica por un ARN único que combina el ARN de la máquina de estado con el número de versión, separado por dos puntos (arn:aws:states:region:account-id:stateMachine:StateMachineName:version-number). Las versiones no pueden ser editadas, pero puedes actualizar la máquina de estado y publicar una nueva versión, o usar la versión de máquina de estado deseada.

  • Alias: Estos punteros pueden referirse a hasta dos versiones de la misma máquina de estado. Se pueden crear múltiples alias para una sola máquina de estado, cada uno identificado por un ARN único construido combinando el ARN de la máquina de estado con el nombre del alias, separado por dos puntos (arn:aws:states:region:account-id:stateMachine:StateMachineName:aliasName). Los alias permiten el enrutamiento de tráfico entre una de las dos versiones de una máquina de estado. Alternativamente, un alias puede apuntar a una versión específica de la máquina de estado, pero no a otros alias. Pueden ser actualizados para redirigir a una versión diferente de la máquina de estado según sea necesario, facilitando implementaciones controladas y gestión de flujos de trabajo.

Para más información detallada sobre ASL, consulta: Amazon States Language.

Roles de IAM para máquinas de estado

AWS Step Functions utiliza roles de AWS Identity and Access Management (IAM) para controlar el acceso a recursos y acciones dentro de las máquinas de estado. Aquí están los aspectos clave relacionados con la seguridad y los roles de IAM en AWS Step Functions:

  • Rol de ejecución: Cada máquina de estado en AWS Step Functions está asociada con un rol de ejecución de IAM. Este rol define qué acciones puede realizar la máquina de estado en tu nombre. Cuando una máquina de estado transita entre estados que interactúan con servicios de AWS (como invocar funciones Lambda, acceder a DynamoDB, etc.), asume este rol de ejecución para llevar a cabo esas acciones.

  • Permisos: El rol de ejecución de IAM debe ser configurado con permisos que permitan las acciones necesarias en otros servicios de AWS. Por ejemplo, si tu máquina de estado necesita invocar funciones de AWS Lambda, el rol de IAM debe tener permisos de lambda:InvokeFunction. De manera similar, si necesita escribir en DynamoDB, se deben otorgar los permisos apropiados (dynamodb:PutItem, dynamodb:UpdateItem, etc.).

Enumeración

La política ReadOnlyAccess es suficiente para todas las siguientes acciones de enumeración.

# 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

En la siguiente página, puedes verificar cómo abusar de los permisos de Step Functions para escalar privilegios:

AWS - Step Functions Privesc

Post Exploitation

AWS - Step Functions Post Exploitation

Persistence

AWS - Step Functions Persistence

References

Apoya a HackTricks

Last updated