Retour aux mises à jour
New releaseAug 23, 2026

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.

Partager

Kestrel

build license language dependencies

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 defaultSecurityDescriptor du schéma, objets masqués, deny-ACEs 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 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 trouveOption(s)
Réplication et délégationDroits DCSync (qui peut répliquer - sans jamais répliquer), délégation non contrainte / contrainte / RBCD / S4U--acl · --delegation
Abus de certificatsAD 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 attributsShadow 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 craquablescpassword 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 hybridePrincipaux é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 reconnaissancePolitique 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 --diff par 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.

OptionAnalyse
--aclArêtes ACL, droits DCSync, hygiène propriétaire/héritage/canonique, objets masqués, réanimation de tombstones
--groupsAppartenance privilégiée transitive + principaux de sécurité étrangers
--delegationNon contrainte / contrainte / RBCD / S4U2Self
--paths / --fromAnalyse des chemins d'attaque vers Tier-0 (éventuellement depuis un principal donné)
--adcsAudit des modèles de certificats / CA AD CS (ESC1–5/9) + magasin NTAuth + validité
--adfsACL de la clé DKM AD FS (condition préalable du Golden SAML)
--schemaAudit des backdoors defaultSecurityDescriptor du schéma
--trustPosture des approbations de domaine / forêt
--machinesComptes machines créés via MachineAccountQuota (mS-DS-CreatorSID)
--roastComptes Kerberoastable + AS-REP-roastable
--shadowcredsShadow credentials (msDS-KeyCredentialLink)
--sidhistoryInjection de sIDHistory (privilégié / étranger)
--adminsdholderObjets adminCount=1 orphelins
--gppBalayage des secrets SYSVOL - GPP cpassword, unattend, identifiants de scripts
--gpolateralGroupe local de GPO → arêtes latérales (AdminTo / CanRDP / CanPSRemote / ExecuteDCOM)
--policyPolitique de sécurité GPO (LLMNR / NBT-NS / WDigest / NTLMv1)
--pwdpolicyPolitique de mots de passe / PSO · âge de krbtgt · MachineAccountQuota
--hygieneHygiène des identifiants (PASSWD_NOTREQD / DONT_EXPIRE / réversibles / fuites dans les descriptions)
--gmsaÉnumération des lecteurs de mots de passe gMSA
--lapsCouverture LAPS (legacy + Windows LAPS 2023+)
--staleOrdinateurs obsolètes via lastLogonTimestamp
--topologyTopologie des ordinateurs via décodage SPN
--adwsDé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

VersionStatutJalon
v0.13Posture des conditions d'entrée
v0.14Profondeur des ACL + arêtes latérales
v0.15Audit de la structure des ACL (classe ADeleg)
v0.16Persistance furtive + profondeur SYSVOL / ADCS
v0.17Empreinte inter-domaines + hybride
v0.18Hygiène des requêtes + empreinte honnête
v1.0Fonctionnalité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.

Catégories