
Outil d'énumération de sécurité Active Directory à faible observabilité utilisant les interfaces natives ADSI/COM. Énumère les ACL, la délégation, les approbations, l'ADCS, les cibles Kerberoast et les chemins d'attaque sans .NET ni PowerShell, en produisant une sortie compatible BloodHound.
# Kestrel
[](https://github.com/ssteelfactor-oss/Kestrel/actions/workflows/build.yml)
[](LICENSE)
[](#)
[](#)
> ### BloodHound vous montre le chemin. Kestrel vous montre ce qui s'y trouve déjà.
Tout le monde cartographie la même chose : le chemin d'attaque - *qui peut atteindre Domain Admin.* C'est la bonne question, et les outils qui y répondent sont excellents. Mais un graphe de « qui peut atteindre qui » est aveugle à toute une catégorie de problèmes, car certaines des pires choses présentes dans un Active Directory ne sont pas du tout un chemin.
Elles sont une porte dérobée soudée dans un attribut. Un certificat qui continue de s'authentifier bien après la réinitialisation du mot de passe. Une permission gravée dans le schéma lui-même, si bien que chaque objet créé désormais en hérite silencieusement. Un compte supprimé dont quelqu'un a discrètement conservé le droit de le faire revenir. Un objet masqué à l'énumération par un simple ACE de refus de lecture.
**Rien de tout cela n'est une arête dans un graphe. Tout cela se trouve dans votre annuaire en ce moment même.** Kestrel le lit - avec des appels Windows natifs, les droits ordinaires d'un utilisateur de domaine, sans serveur, sans Python, sans agent, et avec une empreinte sur le contrôleur de domaine si discrète qu'elle est [documentée événement par événement](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md).
Un seul `.exe`. Une seule commande. Tout ce qui suit.
---
## Vous regardiez dans la mauvaise direction
L'écosystème offensif de l'AD - SharpHound, impacket, Certipy, et le graphe qui les sous-tend - est remarquable, et il observe tous la même surface : l'accessibilité. Kestrel examine les trois dimensions que cette surface ne peut exprimer.
- **Le temps.** Un graphe est un instantané. Kestrel lit les métadonnées de réplication - *quand* un attribut Tier-0 a changé et *quel DC* en est à l'origine. Un droit DCSync accordé la nuit dernière n'est pas la même découverte qu'un droit présent depuis des années, et un seul des deux signifie que vous êtes attaqué en ce moment même.
- **La persistance dans un attribut, pas dans une arête.** Identifiants fantômes (shadow credentials), historique de SID, réanimation de pierres tombales (reanimate-tombstones), portes dérobées dans le `defaultSecurityDescriptor` du schéma, objets cachés, ACE de refus `OWNER RIGHTS`, clés DKM AD FS. Les outils de graphe ne collectent pas ces éléments car il n'y a aucune arête à dessiner.
- **La posture défensive, inversée.** Non pas « qui peut attaquer », mais « ce qui n'est pas protégé » - le compte Tier-0 hors de son silo, le compte de synchronisation avec un RID aléatoire que personne n'a étiqueté, la politique de verrouillage qui ne limite jamais un spray.
Ce n'est pas que Kestrel soit plus rapide qu'un graphe. Il répond à des questions que le graphe ne peut pas poser.
---
## Tous les péchés de l'AD, dans un seul exe natif
| Péché | Ce que Kestrel trouve | Option(s) |
|-----|-------------------|---------|
| **Réplication et délégation** | Droits DCSync (qui *peut* répliquer - sans jamais répliquer), délégation non contrainte / contrainte / RBCD / S4U | `--acl` · `--delegation` |
| **Abus de certificats** | AD CS ESC1–5/9, AC pirate dans le magasin NTAuth, persistance par certificat de longue durée, **ACL de la clé DKM AD FS - la condition préalable du Golden SAML** | `--adcs` · `--adfs` |
| **Persistance dans les attributs** | Identifiants fantômes, injection d'historique SID, **droits de réanimation de pierres tombales**, **objets cachés**, **portes dérobées `defaultSecurityDescriptor` du schéma**, `adminCount` orphelin | `--shadowcreds` · `--sidhistory` · `--acl` · `--schema` · `--adminsdholder` |
| **Identifiants en clair et cassables** | `cpassword` GPP, secrets `unattend`/`sysprep` et mots de passe de scripts dans SYSVOL, comptes Kerberoastables et AS-REP-roastables, lacunes de couverture LAPS | `--gpp` · `--roast` · `--laps` |
| **Inter-domaines et hybride** | Principaux étrangers dans des groupes privilégiés, **comptes de synchronisation Entra Connect étiquetés Tier-0**, posture de confiance, **comptes machine créés via MachineAccountQuota** (`mS-DS-CreatorSID`) | `--groups` · `--trust` · `--machines` |
| **Posture et reconnaissance** | Politique de mots de passe / PSO, âge de `krbtgt`, paramètres GPO LLMNR / NBT-NS / WDigest / NTLMv1, lecteurs gMSA, ordinateurs obsolètes, topologie de délégation | `--pwdpolicy` · `--policy` · `--gmsa` · `--stale` |
| **Archéologie** | **ACE dangereuses orphelines** (un droit détenu par un principal supprimé - le SID ne correspond à personne), **comptes privilégiés obsolètes** (oubliés, sur-privilégiés, mot de passe ancien) | `--archaeology` |
| **Durcissement du domaine** | Indicateurs `dSHeuristics` d'exclusion LDAP anonyme / AdminSDHolder, appartenance étendue à Pre-Windows 2000 Compatible Access | `--hardening` |
| **Posture des services** *(lue depuis AD, aucun paquet envoyé au service)* | **Escalade Exchange-vers-DA et EOL**, **prise de contrôle du conteneur SCCM et carte de site**, **empoisonnement de zone ADIDNS** (les Authenticated Users peuvent créer des enregistrements) | `--exchange` · `--sccm` · `--dns` |
Plus de deux douzaines de vérifications habituellement réparties entre une douzaine de scripts et deux langages. Ici, elles forment un seul binaire - et elles aboutissent à un verdict unique, trié par gravité.
---
## Une ligne
```
Kestrel.exe --all --report audit.html
```
Exécutez tout. Obtenez le rapport HTML complet. Et, tout à la fin de la console, la partie qui compte :
```
═══ Kestrel - Prioritized Findings ═══
CRITICAL DCSync CORP\svc_sql - non-default principal can replicate directory changes (DCSync)
→ fix: remove GetChanges/GetChangesAll from the principal on the domain head (dsacls) unless it is a DC
CRITICAL AD FS CN=... - read access to the DKM key (Golden SAML precondition)
→ fix: remove non-default read ACEs on the DKM object (dsacls) and rotate the token-signing certificate
HIGH Persistence CN=... - object hidden from enumeration via a broad deny-read ACE
→ fix: inspect the hidden object and remove the broad deny-read ACE (dsacls)
[=] 2 critical · 1 high · 0 medium · 0 low
```
Pas un mur de sortie. Les constats qui comptent, classés, chacun avec la commande pour le clore.
---
## Un seul exe. Rouge, bleu, violet.
- **Rouge / gris** - énumérez la persistance et la délégation que le graphe manque, exportez directement vers BloodHound CE OpenGraph (`--opengraph`) pour fusionner avec votre collecte existante, ou pivotez depuis n'importe quel principal (`--from`).
- **Bleu** - une liste de constats hiérarchisés et remédiés ; un `--diff` par rapport à l'instantané de la semaine dernière pour repérer ce qui a *changé* ; et un outil dont l'empreinte de détection exacte est publiée afin que vous puissiez le mettre en liste blanche et ajuster votre propre alerting autour de lui.
- **Violet** - un seul artefact que les deux camps lisent de la même manière. Le rouge le trouve, le bleu le corrige, tout le monde pointe vers le même numéro de ligne.
## Détectable par conception
Kestrel est en lecture seule. Il n'écrit jamais dans l'annuaire, ne réplique jamais, n'a jamais besoin de `SeSecurityPrivilege`, ne touche jamais au cloud. Lire *qui peut* faire un DCSync ne ressemble en rien, sur le réseau, à *faire* un DCSync - pas de DRSUAPI, pas de `4662` de signature de réplication. Chaque requête qu'il exécute et chaque événement qu'il peut (et ne peut pas) générer est catalogué dans **[FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md)**. Un auditeur qui indique au défenseur exactement comment l'attraper n'est pas une contradiction - c'est tout l'intérêt.
---
## Démarrage rapide
**Récupérez un build.** Chaque exécution CI verte publie un artefact `Kestrel.exe` - téléchargez-le depuis l'[onglet Actions](https://github.com/ssteelfactor-oss/Kestrel/actions), aucune chaîne d'outils requise.
**Ou compilez-le vous-même.** Visual Studio (v143+) ou MSBuild :
```
git clone https://github.com/ssteelfactor-oss/Kestrel.git
cd Kestrel
msbuild Kestrel.vcxproj /p:Configuration=Release /p:Platform=x64
```
C pur, zéro dépendance tierce. Compilez `/MT` et vous obtenez un exécutable unique et autonome - déposez-le sur un hôte joint au domaine, exécutez-le en tant que n'importe quel utilisateur ordinaire.
**Exécutez-le.**
```
Kestrel.exe --all --report audit.html # everything, HTML report + ranked findings
Kestrel.exe --acl --adcs --adfs # pick specific checks
Kestrel.exe --paths --from CORP\jdoe # attack paths from one principal
Kestrel.exe --all --diff last-week.json # what changed since the last snapshot
Kestrel.exe --all --opengraph graph.json # export to BloodHound CE OpenGraph
```
---
## Modules
Exécutez `--all`, ou sélectionnez n'importe quel sous-ensemble. Aide complète : `Kestrel.exe --help`.
| Option | Analyse |
|------|------|
| `--acl` | Arêtes ACL, droits DCSync, hygiène propriétaire/héritage/canonique, objets cachés, réanimation de pierres tombales |
| `--groups` | Appartenance privilégiée transitive + principaux de sécurité étrangers |
| `--delegation` | Non contrainte / contrainte / RBCD / S4U2Self |
| `--paths` / `--from` | Analyse des chemins d'attaque vers le Tier-0 (éventuellement depuis un principal donné) |
| `--adcs` | Audit des modèles de certificats / AC AD CS (ESC1–5/9) + magasin NTAuth + validité |
| `--adfs` | ACL de la clé DKM AD FS (condition préalable au Golden SAML) |
| `--schema` | Audit de porte dérobée du `defaultSecurityDescriptor` du schéma |
| `--trust` | Posture des approbations de domaine / forêt |
| `--machines` | Comptes machine créés via MachineAccountQuota (`mS-DS-CreatorSID`) |
| `--roast` | Comptes Kerberoastables + AS-REP-roastables |
| `--shadowcreds` | Identifiants fantômes (`msDS-KeyCredentialLink`) |
| `--sidhistory` | Injection de `sIDHistory` (privilégié / étranger) |
| `--adminsdholder` | Objets orphelins `adminCount=1` |
| `--gpp` | Balayage des secrets SYSVOL - `cpassword` GPP, `unattend`, identifiants de scripts |
| `--gpolateral` | Groupes locaux GPO → arêtes latérales (AdminTo / CanRDP / CanPSRemote / ExecuteDCOM) |
| `--policy` | Politique de sécurité GPO (LLMNR / NBT-NS / WDigest / NTLMv1) |
| `--pwdpolicy` | Politique de mots de passe / PSO · âge de `krbtgt` · MachineAccountQuota |
| `--hygiene` | Hygiène des identifiants (`PASSWD_NOTREQD` / `DONT_EXPIRE` / réversible / fuites dans les descriptions) |
| `--gmsa` | Énumération des lecteurs de mots de passe gMSA |
| `--laps` | Couverture LAPS (héritée + Windows LAPS 2023+) |
| `--stale` | Ordinateurs obsolètes via `lastLogonTimestamp` |
| `--topology` | Topologie des ordinateurs via décodage des SPN |
| `--adws` | Détection du point de terminaison ADWS (9389/TCP par DC) |
| `--archaeology` | ACE dangereuses orphelines (propriétaire mort, droit actif) + comptes privilégiés obsolètes |
| `--hardening` | Indicateurs de durcissement du domaine : accès anonyme `dSHeuristics` / exclusion SDProp + Compatible Access Pre-Windows 2000 |
| `--exchange` | Posture Exchange : version/EOL + escalade Exchange-vers-DA (WriteDACL sur le domaine) *(service ; opt-in)* |
| `--sccm` | Posture SCCM/MECM : ACL du conteneur `System Management` + point de gestion / plan de site *(service ; opt-in)* |
| `--dns` | DNS intégré à AD (ADIDNS) : DACL CreateChild de zone + wpad/isatap/joker + DnsAdmins *(service ; opt-in)* |
**Posture des services** (`--exchange` · `--sccm` · `--dns`) est opt-in et **ne fait pas** partie de `--all` ; exécutez `--services` pour toute la couche. Les résultats portent désormais des étiquettes de techniques **MITRE ATT&CK**.
**Sortie & interopérabilité :** `--report <file>` (`.html` / `.json` / `.yaml`) · `--opengraph <file>` (BloodHound CE) · `--diff <snapshot.json>` · `--verbose`.
---
## Invariants de conception
Ce sont des promesses, pas des préférences - les raisons pour lesquelles il est sûr de l'exécuter en production. En enfreindre un seul constitue un bug de sécurité (voir [SECURITY.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/SECURITY.md)).
- **Lecture seule** - ne crée, ne modifie ni ne supprime jamais un objet d'annuaire. Uniquement des événements de lecture/accès, jamais de modification.
- **Utilisateur de domaine ordinaire** - aucune élévation de privilèges, aucun `SeSecurityPrivilege`, masques de sécurité DACL uniquement.
- **Aucune réplication** - détecte qui *peut* faire du DCSync ; n'appelle jamais DRSUAPI lui-même.
- **Annuaire & SYSVOL uniquement** - aucun RPC/SMB contre les hôtes membres.
- **Aucune évasion** - pas de fragmentation des requêtes, pas de jeux de temporisation, pas d'altération des journaux. Voir [FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md).
- **On-prem uniquement** - aucun appel Entra / Graph / cloud ; il audite l'empreinte que l'hybride laisse *dans AD*.
- **Natif & autonome** - C pur, zéro dépendance tierce, un seul `.exe`.
---
## Feuille de route
| Version | Statut | Jalon |
|---------|:------:|-----------|
| v0.13 | ✅ | Posture de condition d'entrée |
| v0.14 | ✅ | Profondeur ACL + arêtes latérales |
| v0.15 | ✅ | Audit de structure ACL (classe ADeleg) |
| v0.16 | ✅ | Persistance furtive + profondeur SYSVOL / ADCS |
| v0.17 | ✅ | Empreinte inter-domaines + hybride |
| v0.18 | ✅ | Hygiène des requêtes + empreinte honnête |
| **v1.0** | ✅ | **Fonctionnalités complètes : constats priorisés + remédiation, CI, Apache 2.0** |
| **v1.1** | ✅ | **Couche passive de posture des services : Exchange · SCCM · ADIDNS · durcissement du domaine · étiquettes MITRE ATT&CK** |
| **v1.2** | ✅ | **Archéologie AD : ACE dangereuses orphelines + comptes privilégiés obsolètes** |
| v1.3 | 🔲 | Couture hybride (Entra Connect / Seamless SSO) · nTDSConnection / précondition DCShadow |
---
## Documentation
- **[FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md)** - la trace LDAP / SYSVOL exacte que chaque scan laisse, et les événements DC qu'il génère (et ne peut pas générer).
- **[SECURITY.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/SECURITY.md)** - signalement, périmètre et les invariants de conception en tant que garanties vérifiables.
- **[LICENSE](https://github.com/ssteelfactor-oss/kestrel/blob/main/LICENSE)** - Apache 2.0.
## Projets liés
Projet parent : [NetEnum](https://github.com/ssteelfactor-oss/NetEnum) - énumération AD via ADSI / COM / LDAP.
## Auteur
[@ssteelfactor-oss](https://github.com/ssteelfactor-oss) - recherche en sécurité et internals COM / Windows.
## Licence
Sous licence **Apache License 2.0** - voir [LICENSE](https://github.com/ssteelfactor-oss/kestrel/blob/main/LICENSE). Fourni « en l'état », sans garantie ; ne l'exécutez que contre des annuaires que vous êtes autorisé à auditer.