
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
[](https://github.com/ssteelfactor-oss/Kestrel/actions/workflows/build.yml)
[](LICENSE)
[](#)
[](#)
> ### BloodHound ti mostra il percorso. Kestrel ti mostra cosa c'è già dentro.
Tutti mappano la stessa cosa: il percorso di attacco - *chi può raggiungere il Domain Admin.* È la domanda giusta, e gli strumenti che vi rispondono sono eccellenti. Ma un grafo di "chi può raggiungere chi" è cieco di fronte a un'intera classe di problemi, perché alcune delle cose peggiori in un Active Directory non sono affatto un percorso.
Sono una backdoor saldata dentro un attributo. Un certificato che continua ad autenticare molto tempo dopo che la password è stata reimpostata. Un permesso impresso nello schema stesso, così che ogni oggetto creato da ora in poi lo erediti silenziosamente. Un account eliminato di cui qualcuno ha silenziosamente conservato il diritto di ripristinare. Un oggetto nascosto all'enumerazione da un singolo ACE di deny-read.
**Niente di tutto ciò è un arco in un grafo. Tutto ciò è presente nella tua directory in questo momento.** Kestrel lo legge - con chiamate Windows native, normali diritti di utente di dominio, nessun server, nessun Python, nessun agent, e un'impronta sul domain controller così contenuta che è [documentata evento per evento](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md).
Un solo `.exe`. Un solo comando. Tutto quanto segue.
---
## Hai guardato nella direzione sbagliata
L'ecosistema offensivo per AD - SharpHound, impacket, Certipy e il grafo che li sottende - è superbo, e guarda tutto alla stessa superficie: la raggiungibilità. Kestrel guarda alle tre dimensioni che quella superficie non può esprimere.
- **Il tempo.** Un grafo è un'istantanea. Kestrel legge i metadati di replica - *quando* un attributo Tier-0 è cambiato e *quale DC* lo ha originato. Un diritto DCSync concesso la notte scorsa non è la stessa scoperta di uno presente da anni, e solo uno dei due significa che sei sotto attacco in questo momento.
- **La persistenza in un attributo, non in un arco.** Shadow credentials, SID history, reanimate-tombstones, backdoor nello `defaultSecurityDescriptor` dello schema, oggetti nascosti, ACE di deny `OWNER RIGHTS`, chiavi DKM di AD FS. Gli strumenti basati su grafo non raccolgono queste cose perché non c'è alcun arco da disegnare.
- **La 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 lockout che non rallenta mai uno spray.
Non è che Kestrel sia più veloce di un grafo. Risponde a domande che il grafo non può porre.
---
## Ogni peccato dell'AD, in un unico exe nativo
| Peccato | Cosa trova Kestrel | Flag |
|-----|-------------------|---------|
| **Replicazione e delega** | Diritti DCSync (chi *può* replicare - senza mai replicare), delega non vincolata / vincolata / RBCD / S4U | `--acl` · `--delegation` |
| **Abuso di certificati** | AD CS ESC1–5/9, CA canaglia nell'archivio NTAuth, persistenza tramite certificati a lunga durata, **ACL della chiave DKM di AD FS - il prerequisito del Golden SAML** | `--adcs` · `--adfs` |
| **Persistenza negli attributi** | Credenziali shadow, iniezione della cronologia SID, **diritti di rianimazione delle tombstone**, **oggetti nascosti**, **backdoor nello `defaultSecurityDescriptor` dello schema**, `adminCount` orfano | `--shadowcreds` · `--sidhistory` · `--acl` · `--schema` · `--adminsdholder` |
| **Credenziali in chiaro e decifrabili** | `cpassword` di GPP, segreti `unattend`/`sysprep` e password negli script su SYSVOL, account Kerberoastable e AS-REP-roastable, lacune nella copertura LAPS | `--gpp` · `--roast` · `--laps` |
| **Cross-domain e ibrido** | Principal esterni in gruppi privilegiati, **account di sincronizzazione Entra Connect etichettati Tier-0**, postura delle trust, **account macchina creati tramite MachineAccountQuota** (`mS-DS-CreatorSID`) | `--groups` · `--trust` · `--machines` |
| **Postura e ricognizione** | Policy password / PSO, età di `krbtgt`, impostazioni GPO LLMNR / NBT-NS / WDigest / NTLMv1, lettori gMSA, computer obsoleti, topologia delle deleghe | `--pwdpolicy` · `--policy` · `--gmsa` · `--stale` |
| **Archeologia** | **ACE pericolose orfane** (un diritto detenuto da un principal eliminato - il SID non risolve a nessuno), **account privilegiati obsoleti** (dimenticati, con privilegi eccessivi, password antica) | `--archaeology` |
| **Hardening del dominio** | Flag `dSHeuristics` per LDAP anonimo / esclusione da AdminSDHolder, appartenenza ampia a Pre-Windows 2000 Compatible Access | `--hardening` |
| **Postura dei servizi** *(letti da AD, nessun pacchetto inviato al servizio)* | **Escalation Exchange-to-DA ed EOL**, **takeover del container SCCM e site map**, **avvelenamento delle zone ADIDNS** (Authenticated Users può creare record) | `--exchange` · `--sccm` · `--dns` |
Oltre due dozzine di controlli che di solito sono sparsi tra 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, alla fine della 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. Solo i risultati che contano, classificati, ciascuno con il comando per chiuderlo.
---
## Un solo exe. Red, blue, purple.
- **Red / grey** - enumera persistenza e delegation che il grafo non rileva, esporta direttamente in BloodHound CE OpenGraph (`--opengraph`) per fondere con la tua raccolta esistente, oppure parti da qualsiasi principal (`--from`).
- **Blue** - un elenco di risultati prioritizzato e con remediation; un `--diff` rispetto allo snapshot della settimana scorsa per individuare ciò che è *cambiato*; e uno strumento la cui esatta impronta di rilevamento è pubblicata, così puoi inserirlo nella whitelist e tarare il tuo alerting attorno ad esso.
- **Purple** - un unico artefatto che entrambe le parti leggono allo stesso modo. Il red lo trova, il blue lo corregge, tutti indicano lo stesso numero di riga.
## Rilevabile per progettazione
Kestrel è in sola lettura. Non scrive mai nella directory, non replica mai, non richiede mai `SeSecurityPrivilege`, non tocca mai il cloud. Leggere *chi può* eseguire DCSync non assomiglia affatto, sul traffico di rete, a *eseguire* DCSync - nessun DRSUAPI, nessun `4662` di firma di replica. Ogni query che esegue e ogni evento che può (e non può) generare è catalogato in **[FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md)**. Un auditor che spiega al difensore esattamente come individuarlo non è una contraddizione - è proprio il punto.
---
## Avvio rapido
**Scarica una build.** Ogni esecuzione CI verde pubblica un artefatto `Kestrel.exe` - scaricalo dalla [scheda Actions](https://github.com/ssteelfactor-oss/Kestrel/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 qualsiasi utente ordinario.
**Esegui.**
```
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. Guida completa: `Kestrel.exe --help`.
| Flag | Scansione |
|------|------|
| `--acl` | Archi ACL, diritti DCSync, igiene di owner/inheritance/canonical, oggetti nascosti, reanimate-tombstones |
| `--groups` | Appartenenza transitiva a gruppi privilegiati + principal di sicurezza esterni |
| `--delegation` | Unconstrained / constrained / RBCD / S4U2Self |
| `--paths` / `--from` | Analisi dei percorsi di attacco verso il Tier-0 (opzionalmente da un principal specificato) |
| `--adcs` | Audit dei template di certificato / CA di AD CS (ESC1–5/9) + archivio NTAuth + validità |
| `--adfs` | ACL della chiave DKM di AD FS (precondizione per Golden SAML) |
| `--schema` | Audit backdoor dello schema `defaultSecurityDescriptor` |
| `--trust` | Postura dei trust di dominio / foresta |
| `--machines` | Account macchina creati tramite MachineAccountQuota (`mS-DS-CreatorSID`) |
| `--roast` | Account Kerberoastable + AS-REP-roastable |
| `--shadowcreds` | Credenziali shadow (`msDS-KeyCredentialLink`) |
| `--sidhistory` | Iniezione di `sIDHistory` (privilegiato / esterno) |
| `--adminsdholder` | Oggetti orfani con `adminCount=1` |
| `--gpp` | Scansione dei segreti in SYSVOL - `cpassword` GPP, `unattend`, credenziali negli script |
| `--gpolateral` | Gruppi locali dei GPO → archi laterali (AdminTo / CanRDP / CanPSRemote / ExecuteDCOM) |
| `--policy` | Policy di sicurezza dei GPO (LLMNR / NBT-NS / WDigest / NTLMv1) |
| `--pwdpolicy` | Policy password / PSO · età di `krbtgt` · MachineAccountQuota |
| `--hygiene` | Igiene delle credenziali (`PASSWD_NOTREQD` / `DONT_EXPIRE` / reversibile / fughe nella description) |
| `--gmsa` | Enumerazione dei password-reader dei gMSA |
| `--laps` | Copertura LAPS (legacy + Windows LAPS 2023+) |
| `--stale` | Computer obsoleti tramite `lastLogonTimestamp` |
| `--topology` | Topologia dei computer tramite decodifica degli SPN |
| `--adws` | Rilevamento dell'endpoint ADWS (9389/TCP per DC) |
| `--archaeology` | ACE pericolose orfane (owner morto, diritto attivo) + account privilegiati obsoleti |
| `--hardening` | Flag di hardening del dominio: accesso anonimo `dSHeuristics` / esclusione SDProp + Pre-Windows 2000 Compatible Access |
| `--exchange` | Postura di Exchange: versione/EOL + escalation da Exchange a DA (WriteDACL sul dominio) *(servizio; opt-in)* |
| `--sccm` | Postura di SCCM/MECM: ACL del container `System Management` + management-point / site map *(servizio; opt-in)* |
| `--dns` | DNS integrato in AD (ADIDNS): DACL CreateChild della zona + wpad/isatap/wildcard + DnsAdmins *(servizio; opt-in)* |
**Postura dei servizi** (`--exchange` · `--sccm` · `--dns`) è opt-in e **non** fa parte di `--all`; esegui `--services` per l'intero layer. I risultati ora riportano i tag delle tecniche **MITRE ATT&CK**.
**Output e interoperabilità:** `--report <file>` (`.html` / `.json` / `.yaml`) · `--opengraph <file>` (BloodHound CE) · `--diff <snapshot.json>` · `--verbose`.
---
## Invarianti di progettazione
Queste sono promesse, non preferenze - le ragioni per cui è sicuro eseguirlo in produzione. Violare una qualsiasi di esse è un bug di sicurezza (vedi [SECURITY.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/SECURITY.md)).
- **Sola lettura** - 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`, maschere di sicurezza solo DACL.
- **Nessuna replica** - rileva chi *può* eseguire DCSync; non chiama mai DRSUAPI stesso.
- **Solo directory e SYSVOL** - nessun RPC/SMB verso host membri.
- **Nessuna evasione** - nessuna frammentazione delle query, nessun gioco sui tempi, nessuna manomissione dei log. Vedi [FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md).
- **Solo on-prem** - nessuna chiamata a Entra / Graph / cloud; verifica l'impronta che l'ibrido lascia *in AD*.
- **Nativo e autonomo** - puro C, zero dipendenze di terze parti, singolo `.exe`.
---
## Roadmap
| Versione | Stato | Milestone |
|---------|:------:|-----------|
| v0.13 | ✅ | Postura delle condizioni d'ingresso |
| v0.14 | ✅ | Profondità ACL + archi laterali |
| v0.15 | ✅ | Audit della struttura ACL (classe ADeleg) |
| v0.16 | ✅ | Persistenza stealth + profondità SYSVOL / ADCS |
| v0.17 | ✅ | Footprint cross-domain + ibrido |
| v0.18 | ✅ | Igiene delle query + footprint onesto |
| **v1.0** | ✅ | **Feature-complete: findings prioritizzati + remediation, CI, Apache 2.0** |
| **v1.1** | ✅ | **Livello passivo di postura dei servizi: Exchange · SCCM · ADIDNS · hardening del dominio · tag MITRE ATT&CK** |
| **v1.2** | ✅ | **Archeologia AD: ACE pericolose orfane + account privilegiati obsoleti** |
| v1.3 | 🔲 | Giunzione ibrida (Entra Connect / Seamless SSO) · nTDSConnection / precondizione DCShadow |
---
## Documentazione
- **[FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md)** - l'esatta traccia LDAP / SYSVOL lasciata da ogni scansione, e gli eventi DC che genera (e che non può generare).
- **[SECURITY.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/SECURITY.md)** - segnalazione, ambito e invarianti di progettazione come garanzie verificabili.
- **[LICENSE](https://github.com/ssteelfactor-oss/kestrel/blob/main/LICENSE)** - Apache 2.0.
## Correlati
Progetto padre: [NetEnum](https://github.com/ssteelfactor-oss/NetEnum) - enumerazione AD tramite ADSI / COM / LDAP.
## Autore
[@ssteelfactor-oss](https://github.com/ssteelfactor-oss) - ricerca sulla sicurezza e internals COM / Windows.
## Licenza
Concesso in licenza sotto la **Apache License 2.0** - vedi [LICENSE](https://github.com/ssteelfactor-oss/kestrel/blob/main/LICENSE). Fornito "così com'è", senza garanzia; eseguilo solo contro directory che sei autorizzato ad analizzare.