
Kestrel v.1.1.0
Strumento di enumerazione della sicurezza di Active Directory a bassa osservabilità che utilizza le interfacce native ADSI/COM. Enumera ACL, deleghe, trust, ADCS, target Kerberoast e percorsi di attacco senza .NET o PowerShell, producendo output compatibile con BloodHound.
Kestrel
BloodHound ti mostra il percorso. Kestrel ti mostra ciò che è già dentro.
Tutti mappano la stessa cosa: il percorso di attacco - chi può raggiungere Domain Admin. È la domanda giusta, e gli strumenti che le rispondono sono eccellenti. Ma un grafo di "chi può raggiungere chi" è cieco a un'intera classe di problemi, perché alcune delle peggiori cose in Active Directory non sono affatto un percorso.
Sono una backdoor saldata dentro un attributo. Un certificato che continua ad autenticare molto dopo il reset della password. Un permesso impresso nello schema stesso, così che ogni oggetto creato d'ora in poi lo erediti silenziosamente. Un account eliminato di cui qualcuno ha silenziosamente conservato il diritto di riportare in vita. Un oggetto nascosto all'enumerazione da un singolo deny-read ACE.
Niente di tutto questo è un arco in un grafo. Tutto questo è nella tua directory adesso. Kestrel lo legge - con chiamate Windows native, diritti di un normale utente di dominio, nessun server, nessun Python, nessun agente, e un'impronta sul domain controller così contenuta che è documentata evento per evento.
Un .exe. Un comando. Tutto qui sotto.
Stai guardando nella direzione sbagliata
L'ecosistema AD offensivo - SharpHound, impacket, Certipy e il grafo che sta dietro di loro - è eccellente, e tutto guarda alla stessa superficie: la raggiungibilità. Kestrel osserva le tre dimensioni che quella superficie non può esprimere.
- Tempo. Un grafo è un'istantanea. Kestrel legge i metadati di replica - quando un attributo Tier-0 è cambiato e quale DC ne è l'origine. Un diritto DCSync concesso la scorsa notte non è lo stesso risultato di uno presente da anni, e solo uno dei due significa che sei sotto attacco in questo momento.
- Persistenza in un attributo, non in un arco. Shadow credentials, SID history, riattivazione dei tombstone, backdoor
defaultSecurityDescriptornello schema, oggetti nascosti, deny-ACEOWNER RIGHTS, chiavi DKM di AD FS. Gli strumenti a grafo non raccolgono queste cose perché non c'è alcun arco da disegnare. - Postura difensiva, invertita. Non «chi può attaccare», ma «cosa non è protetto» - l'account Tier-0 fuori dal suo silo, l'account di sincronizzazione con un RID casuale che nessuno ha etichettato, la policy di blocco che non limita mai uno spray.
Non è che Kestrel sia più veloce di un grafo. Risponde a domande che il grafo non può porsi.
Ogni peccato di AD, in un unico exe nativo
| Peccato | Cosa trova Kestrel | Flag |
|---|---|---|
| Replica e delega | Diritti DCSync (chi può replicare - senza replicare mai), delega non vincolata / vincolata / RBCD / S4U | --acl · --delegation |
| Abuso di certificati | AD CS ESC1–5/9, CA rogue nell'archivio NTAuth, persistenza tramite certificati longevi, ACL della chiave DKM di AD FS - la precondizione per Golden SAML | --adcs · --adfs |
| Persistenza negli attributi | Shadow credentials, iniezione della SID history, diritti di riattivazione dei tombstone, oggetti nascosti, backdoor defaultSecurityDescriptor nello schema, adminCount orfani | --shadowcreds · --sidhistory · --acl · --schema · --adminsdholder |
| Credenziali in chiaro e crackabili | Segreti GPP cpassword, unattend/sysprep e password negli script su SYSVOL, account Kerberoastable e AS-REP-roastable, lacune di copertura LAPS | --gpp · --roast · --laps |
| Cross-domain e ibrido | Principal esterni in gruppi privilegiati, account di sincronizzazione Entra Connect etichettati Tier-0, postura del trust, account macchina creati tramite MachineAccountQuota (mS-DS-CreatorSID) | --groups · --trust · --machines |
| Postura e ricognizione | Criteri password / PSO, età di krbtgt, impostazioni GPO LLMNR / NBT-NS / WDigest / NTLMv1, lettori gMSA, computer obsoleti, topologia della delega | --pwdpolicy · --policy · --gmsa · --stale |
Più di venti controlli che di solito sono sparsi in una dozzina di script e due linguaggi. Qui sono un unico binario - e terminano in un unico verdetto ordinato per gravità.
Una riga
Kestrel.exe --all --report audit.html
Esegui tutto. Ottieni il report HTML completo. E, in fondo alla console, la parte che conta:
═══ 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
Non un muro di output. I risultati che contano, ordinati, ognuno con il comando per chiuderlo.
Un unico exe. Red, blue, purple.
- Red / grey - enumera la persistenza e la delega che il grafo non vede, esporta direttamente in BloodHound CE OpenGraph (
--opengraph) per fonderlo con la tua raccolta esistente, oppure effettua il pivot da qualsiasi principal (--from). - Blue - un elenco di risultati prioritizzati e con remediation; un
--diffrispetto allo snapshot della scorsa settimana per cogliere cosa è cambiato; e uno strumento la cui esatta impronta di rilevamento è pubblicata, così puoi inserirlo in whitelist e ottimizzare il tuo alerting. - Purple - un unico artefatto che entrambe le parti leggono allo stesso modo. Red lo trova, blue lo corregge, tutti puntano allo stesso numero di riga.
Rilevabile per progettazione
Kestrel è read-only. Non scrive mai nella directory, non replica mai, non necessita mai di SeSecurityPrivilege, non tocca mai il cloud. Leggere chi può fare DCSync non assomiglia per nulla, sul wire, a fare DCSync - niente DRSUAPI, nessuna firma di replica 4662. Ogni query che esegue e ogni evento che può (e non può) generare è catalogato in FOOTPRINT.md. Un auditor che dice al difensore esattamente come individuarlo non è una contraddizione - è il punto centrale.
Avvio rapido
Scarica una build. Ogni esecuzione CI verde pubblica un artefatto Kestrel.exe - scaricalo dalla scheda Actions, nessun toolchain richiesto.
Oppure compilalo da solo. Visual Studio (v143+) o MSBuild:
git clone https://github.com/ssteelfactor-oss/Kestrel.git
cd Kestrel
msbuild Kestrel.vcxproj /p:Configuration=Release /p:Platform=x64
C puro, zero dipendenze di terze parti. Compila con /MT e ottieni un singolo eseguibile autonomo - copialo su un host aggiunto al dominio, eseguilo come un qualsiasi utente ordinario.
Eseguilo.
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
Moduli
Esegui --all oppure seleziona un qualsiasi sottoinsieme. Aiuto completo: Kestrel.exe --help.
| Flag | Scansione |
|---|---|
--acl | Archi ACL, diritti DCSync, igiene owner/ereditarietà/canonical, oggetti nascosti, riattivazione tombstone |
--groups | Membership privilegiata transitiva + security principal esterni |
--delegation | Delega non vincolata / vincolata / RBCD / S4U2Self |
--paths / --from | Analisi dei percorsi di attacco verso Tier-0 (opzionalmente da un principal specifico) |
--adcs | Audit dei modelli di certificato / CA di AD CS (ESC1–5/9) + archivio NTAuth + validità |
--adfs | ACL della chiave DKM di AD FS (precondizione Golden SAML) |
--schema | Audit delle backdoor defaultSecurityDescriptor nello schema |
--trust | Postura dei trust di dominio / foresta |
--machines | Account macchina creati tramite MachineAccountQuota (mS-DS-CreatorSID) |
--roast | Account Kerberoastable + AS-REP-roastable |
--shadowcreds | Shadow credentials (msDS-KeyCredentialLink) |
--sidhistory | Iniezione di sIDHistory (privilegiata / esterna) |
--adminsdholder | Oggetti orfani con adminCount=1 |
--gpp | Scansione dei segreti SYSVOL - GPP cpassword, unattend, credenziali negli script |
--gpolateral | GPO gruppi locali → archi di movimento laterale (AdminTo / CanRDP / CanPSRemote / ExecuteDCOM) |
--policy | Criteri di sicurezza GPO (LLMNR / NBT-NS / WDigest / NTLMv1) |
--pwdpolicy | Criteri password / PSO · età di krbtgt · MachineAccountQuota |
--hygiene | Igiene delle credenziali (PASSWD_NOTREQD / DONT_EXPIRE / reversibili / leak nella descrizione) |
--gmsa | Enumerazione dei lettori di password gMSA |
--laps | Copertura LAPS (legacy + Windows LAPS 2023+) |
--stale | Computer obsoleti tramite lastLogonTimestamp |
--topology | Topologia dei computer tramite decodifica SPN |
--adws | Rilevamento endpoint ADWS (9389/TCP per DC) |
Output e interoperabilità: --report <file> (.html / .json / .yaml) · --opengraph <file> (BloodHound CE) · --diff <snapshot.json> · --verbose.
Invarianti di progettazione
Queste sono promesse, non preferenze - i motivi per cui è sicuro eseguirlo in produzione. Violarne una qualsiasi è un bug di sicurezza (vedi SECURITY.md).
- Read-only - non crea, modifica o elimina mai un oggetto della directory. Solo eventi di lettura/accesso, mai eventi di modifica.
- Utente di dominio ordinario - nessuna escalation di privilegi, nessun
SeSecurityPrivilege, solo maschere di sicurezza DACL. - Nessuna replica - rileva chi può fare DCSync; non chiama mai DRSUAPI.
- Solo directory e SYSVOL - nessun RPC/SMB verso gli host membri.
- Nessuna evasione - nessuna frammentazione delle query, nessun gioco sui tempi, nessuna manomissione dei log. Vedi FOOTPRINT.md.
- Solo on-prem - nessuna chiamata a Entra / Graph / cloud; audita l'impronta che l'ibrido lascia in AD.
- Nativo e autonomo - C puro, zero dipendenze di terze parti, un singolo
.exe.
Roadmap
| Versione | Stato | Traguardo |
|---|---|---|
| v0.13 | ✅ | Postura delle condizioni di ingresso |
| v0.14 | ✅ | Profondità ACL + archi laterali |
| v0.15 | ✅ | Audit della struttura ACL (classe ADeleg) |
| v0.16 | ✅ | Persistenza stealth + profondità SYSVOL / ADCS |
| v0.17 | ✅ | Impronta cross-domain + ibrida |
| v0.18 | ✅ | Igiene delle query + impronta onesta |
| v1.0 | ✅ | Funzionalità complete: risultati prioritizzati + remediation, CI, Apache 2.0 |
| v1.1 | 🔲 | Timeline temporale · rilevamento rogue-DC / DCShadow · ADIDNS · passaggio sulla postura difensiva |
Documentazione
- FOOTPRINT.md - la traccia LDAP / SYSVOL esatta che ogni scansione lascia e gli eventi DC che genera (e non può generare).
- SECURITY.md - reporting, ambito e invarianti di progettazione come garanzie verificabili.
- LICENSE - Apache 2.0.
Correlati
Progetto padre: NetEnum - enumerazione AD tramite ADSI / COM / LDAP.
Autore
@ssteelfactor-oss - ricerca sulla sicurezza e internals COM / Windows.
Licenza
Concesso in licenza secondo la Apache License 2.0 - vedi LICENSE. Fornito "così com'è", senza garanzia; eseguilo solo contro directory che sei autorizzato ad auditare.