
Kestrel v.1.1.0
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
BloodHound vous montre le chemin. Kestrel vous montre ce qui se trouve déjà à l'intérieur.
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 classe de problèmes, car certaines des pires choses dans un Active Directory ne sont pas du tout un chemin.
Ce sont des backdoors soudées dans un attribut. Un certificat qui continue de s'authentifier bien après la réinitialisation du mot de passe. Une permission estampillée dans le schéma lui-même, si bien que chaque objet créé à partir de maintenant l'hérite silencieusement. Un compte supprimé dont quelqu'un a discrètement conservé le droit de le restaurer. 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 est dans votre annuaire en ce moment même. Kestrel le lit - avec des appels Windows natifs, des droits d'utilisateur de domaine ordinaires, sans serveur, sans Python, sans agent, et une empreinte sur le contrôleur de domaine si restreinte qu'elle est documentée événement par événement.
Un seul .exe. Une seule commande. Tout ce qui suit.
Vous regardiez dans la mauvaise direction
L'écosystème AD offensif - SharpHound, impacket, Certipy, et le graphe qui les sous-tend - est superbe, et tout cela examine la même surface : l'atteignabilité. Kestrel s'intéresse aux trois dimensions que cette surface ne peut pas 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é hier soir n'est pas la même constatation qu'un droit présent depuis des années, et un seul d'entre eux signifie que vous êtes attaqué en ce moment même.
- Une persistance dans un attribut, pas dans une arête. Shadow credentials, SID history, réanimation de tombstones, backdoors
defaultSecurityDescriptordu schéma, objets masqués, deny-ACEsOWNER 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 tagué, 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.
Chaque péché 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, CA non autorisée 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 | Shadow credentials, injection de SID history, droits de réanimation de tombstones, objets masqués, backdoors defaultSecurityDescriptor du schéma, adminCount orphelin | --shadowcreds · --sidhistory · --acl · --schema · --adminsdholder |
| Identifiants en clair et craquables | cpassword GPP, secrets unattend/sysprep et mots de passe de scripts dans SYSVOL, comptes Kerberoastable et AS-REP-roastable, lacunes de couverture LAPS | --gpp · --roast · --laps |
| Inter-domaines et hybride | Principaux étrangers dans des groupes privilégiés, comptes de synchronisation Entra Connect tagués Tier-0, posture des approbations, comptes machines 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 |
Plus de vingt vérifications habituellement réparties entre une douzaine de scripts et deux langages. Ici, elles tiennent en un seul binaire - et se concluent par un verdict unique, trié par sévérité.
Une seule 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 constatations qui comptent, classées, chacune avec la commande pour y remédier.
Un seul exe. Rouge, bleu, violet.
- Rouge / gris - énumérez la persistance et la délégation que le graphe ne détecte pas, exportez directement vers BloodHound CE OpenGraph (
--opengraph) pour fusionner avec votre collecte existante, ou effectuez un pivot depuis n'importe quel principal (--from). - Bleu - une liste de constatations priorisées avec remédiation ; un
--diffpar rapport à l'instantané de la semaine dernière pour détecter ce qui a changé ; et un outil dont l'empreinte de détection exacte est publiée afin que vous puissiez le mettre sur liste blanche et ajuster votre propre alerting autour de lui. - Violet - un artefact que les deux camps lisent de la même manière. Le rouge le trouve, le bleu le corrige, tout le monde pointe 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, ne nécessite jamais SeSecurityPrivilege, ne touche jamais au cloud. Lire qui peut faire un DCSync ne ressemble en rien, sur le fil, à 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 répertorié dans FOOTPRINT.md. Un auditeur qui dit au défenseur exactement comment le détecter n'est pas une contradiction - c'est tout l'intérêt.
Démarrage rapide
Récupérez une build. Chaque exécution CI verte publie un artefact Kestrel.exe - téléchargez-le depuis l'onglet Actions, sans 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 autonome unique - 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 masqués, réanimation de tombstones |
--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 Tier-0 (éventuellement depuis un principal donné) |
--adcs | Audit des modèles de certificats / CA AD CS (ESC1–5/9) + magasin NTAuth + validité |
--adfs | ACL de la clé DKM AD FS (condition préalable du Golden SAML) |
--schema | Audit des backdoors defaultSecurityDescriptor du schéma |
--trust | Posture des approbations de domaine / forêt |
--machines | Comptes machines créés via MachineAccountQuota (mS-DS-CreatorSID) |
--roast | Comptes Kerberoastable + AS-REP-roastable |
--shadowcreds | Shadow credentials (msDS-KeyCredentialLink) |
--sidhistory | Injection de sIDHistory (privilégié / étranger) |
--adminsdholder | Objets adminCount=1 orphelins |
--gpp | Balayage des secrets SYSVOL - GPP cpassword, unattend, identifiants de scripts |
--gpolateral | Groupe local de 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éversibles / fuites dans les descriptions) |
--gmsa | Énumération des lecteurs de mots de passe gMSA |
--laps | Couverture LAPS (legacy + Windows LAPS 2023+) |
--stale | Ordinateurs obsolètes via lastLogonTimestamp |
--topology | Topologie des ordinateurs via décodage SPN |
--adws | Détection de l'endpoint ADWS (9389/TCP par DC) |
Sortie et 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 violer une seule est un bug de sécurité (voir SECURITY.md).
- Lecture seule - ne crée, ne modifie ni ne supprime jamais d'objet d'annuaire. Uniquement des événements de lecture/accès, jamais d'événements de modification.
- Utilisateur de domaine ordinaire - aucune élévation de privilège, pas de
SeSecurityPrivilege, uniquement des masques de sécurité DACL. - Pas de réplication - détecte qui peut faire un DCSync ; n'appelle jamais DRSUAPI lui-même.
- Annuaire et SYSVOL uniquement - aucun RPC/SMB vers les hôtes membres.
- Aucune évasion - pas de fragmentation de requêtes, pas de jeux de temporisation, pas de falsification de journaux. Voir FOOTPRINT.md.
- On-prem uniquement - aucun appel Entra / Graph / cloud ; il audite l'empreinte que l'hybride laisse dans AD.
- Natif et autonome - C pur, zéro dépendance tierce, un seul
.exe.
Feuille de route
| Version | Statut | Jalon |
|---|---|---|
| v0.13 | ✅ | Posture des conditions d'entrée |
| v0.14 | ✅ | Profondeur des ACL + arêtes latérales |
| v0.15 | ✅ | Audit de la structure des 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 : constatations priorisées + remédiation, CI, Apache 2.0 |
| v1.1 | 🔲 | Chronologie temporelle · détection de DC non autorisé / DCShadow · ADIDNS · passe de posture défensive |
Documentation
- FOOTPRINT.md - la trace LDAP / SYSVOL exacte que laisse chaque analyse, et les événements DC qu'elle génère (et ne peut pas générer).
- SECURITY.md - signalement, périmètre, et les invariants de conception en tant que garanties vérifiables.
- LICENSE - Apache 2.0.
Liens connexes
Projet parent : NetEnum - énumération AD via ADSI / COM / LDAP.
Auteur
@ssteelfactor-oss - recherche en sécurité et internals COM / Windows.
Licence
Distribué sous licence Apache License 2.0 - voir LICENSE. Fourni « tel quel », sans garantie ; exécutez-le uniquement contre des annuaires que vous êtes autorisé à auditer.