
Ferramenta de enumeração de segurança do Active Directory de baixa observabilidade que utiliza interfaces nativas ADSI/COM. Enumera ACLs, delegação, trusts, ADCS, alvos de Kerberoast e caminhos de ataque sem .NET ou PowerShell, produzindo saída compatível com BloodHound.
O BloodHound mostra o caminho. O Kestrel mostra o que já está lá dentro.
Todos mapeiam a mesma coisa: o caminho de ataque - quem consegue chegar ao Domain Admin. É a pergunta certa, e as ferramentas que a respondem são excelentes. Mas um grafo de "quem alcança quem" é cego para uma classe inteira de problemas, porque algumas das piores coisas num Active Directory não são, de todo, um caminho.
São um backdoor soldado num atributo. Um certificado que continua a autenticar muito depois de a palavra-passe ser reposta. Uma permissão cunhada no próprio schema, para que todos os objetos criados daqui em diante a herdem silenciosamente. Uma conta eliminada cujo direito de a repor alguém guardou discretamente. Um objeto escondido da enumeração por um único deny-read ACE.
Nada disso é uma aresta num grafo. Tudo isso está agora mesmo no seu diretório. O Kestrel lê tudo isso - com chamadas nativas do Windows, direitos normais de utilizador de domínio, sem servidor, sem Python, sem agente, e com uma pegada no domain controller tão contida que está documentada evento a evento.
Um .exe. Um comando. Tudo abaixo.
O ecossistema ofensivo de AD - SharpHound, impacket, Certipy e o grafo por detrás deles - é soberbo, e tudo olha para a mesma superfície: a alcançabilidade. O Kestrel olha para as três dimensões que essa superfície não consegue expressar.
defaultSecurityDescriptor no schema, objetos ocultos, deny-ACEs de OWNER RIGHTS, chaves DKM do AD FS. As ferramentas de grafos não recolhem isto porque não há aresta para desenhar.Não é que o Kestrel seja mais rápido do que um grafo. Ele responde a perguntas que o grafo não consegue colocar.
Mais de vinte verificações que normalmente estão espalhadas por uma dúzia de scripts e duas linguagens. Aqui são um único binário - e terminam num único veredito ordenado por gravidade.
Kestrel.exe --all --report audit.html
Execute tudo. Obtenha o relatório HTML completo. E, bem no fim da consola, a parte que importa:
═══ 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
Não é uma enxurrada de saída. Os achados que importam, ordenados, cada um com o comando para o fechar.
--opengraph) para fundir com a sua coleção existente, ou faça pivot a partir de qualquer principal (--from).--diff contra o instantâneo da semana passada para apanhar o que mudou; e uma ferramenta cuja pegada exata de deteção é publicada para que a possa colocar na whitelist e afinar os seus próprios alertas em torno dela.O Kestrel é só de leitura. Nunca escreve no diretório, nunca replica, nunca precisa de SeSecurityPrivilege, nunca toca na cloud. Ler quem pode fazer DCSync não se parece nada, ao nível do tráfego, com fazer DCSync - sem DRSUAPI, sem assinatura de replicação 4662. Cada consulta que executa e cada evento que pode (e não pode) gerar está catalogado em FOOTPRINT.md. Um auditor que diz ao defensor exatamente como o apanhar não é uma contradição - é exatamente o objetivo.
Obtenha um build. Cada execução de CI verde publica um artefacto Kestrel.exe - transfira-o do separador Actions, sem necessidade de toolchain.
Ou compile-o você mesmo. 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 puro, zero dependências de terceiros. Compile com /MT e é um único executável autocontido - coloque-o num host ligado ao domínio e execute-o como qualquer utilizador normal.
Execute-o.
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
Execute --all, ou selecione qualquer subconjunto. Ajuda completa: Kestrel.exe --help.
Saída e interoperabilidade: --report <file> (.html / .json / .yaml) · --opengraph <file> (BloodHound CE) · --diff <snapshot.json> · --verbose.
Estas são promessas, não preferências - as razões pelas quais é seguro executá-lo em produção. Quebrar qualquer uma delas é um bug de segurança (ver SECURITY.md).
SeSecurityPrivilege, máscaras de segurança apenas com DACL..exe.Projeto pai: NetEnum - enumeração de AD via ADSI / COM / LDAP.
@ssteelfactor-oss - investigação de segurança e internals de COM / Windows.
Licenciado sob a Apache License 2.0 - ver LICENSE. Fornecido "as is", sem garantia; execute-o apenas contra diretórios que está autorizado a auditar.
| Pecado | O que o Kestrel encontra | Flag(s) |
|---|
| Replicação e delegação | Direitos DCSync (quem pode replicar - sem nunca replicar), delegação não condicionada / condicionada / RBCD / S4U | --acl · --delegation |
| Abuso de certificados | AD CS ESC1–5/9, CA rogue no store NTAuth, persistência de certificados de longa duração, ACL da chave DKM do AD FS - a pré-condição do Golden SAML | --adcs · --adfs |
| Persistência em atributos | Shadow credentials, injeção de SID history, direitos de reanimação de tombstones, objetos ocultos, backdoors de defaultSecurityDescriptor no schema, adminCount órfãos | --shadowcreds · --sidhistory · --acl · --schema · --adminsdholder |
| Credenciais em claro e crackáveis | cpassword do GPP, segredos de unattend/sysprep e palavras-passe de scripts em SYSVOL, contas Kerberoastable e AS-REP-roastable, lacunas de cobertura do LAPS | --gpp · --roast · --laps |
| Entre domínios e híbrido | Principais de segurança estrangeiros em grupos privilegiados, contas de sincronização do Entra Connect etiquetadas como Tier-0, postura de trusts, contas de máquina criadas via MachineAccountQuota (mS-DS-CreatorSID) | --groups · --trust · --machines |
| Postura e reconhecimento | Política de palavras-passe / PSO, idade do krbtgt, definições de GPO de LLMNR / NBT-NS / WDigest / NTLMv1, leitores de gMSA, computadores obsoletos, topologia de delegação | --pwdpolicy · --policy · --gmsa · --stale |
| Flag | Verificação |
|---|
--acl | Arestas de ACL, direitos DCSync, higiene de owner/herança/canónica, objetos ocultos, reanimate-tombstones |
--groups | Associação transitiva a grupos privilegiados + principais de segurança estrangeiros |
--delegation | Delegação não condicionada / condicionada / RBCD / S4U2Self |
--paths / --from | Análise de caminhos de ataque até Tier-0 (opcionalmente a partir de um principal) |
--adcs | Auditoria de modelos de certificado / CA do AD CS (ESC1–5/9) + store NTAuth + validade |
--adfs | ACL da chave DKM do AD FS (pré-condição do Golden SAML) |
--schema | Auditoria de backdoor de defaultSecurityDescriptor no schema |
--trust | Postura de trusts de domínio / floresta |
--machines | Contas de máquina criadas via MachineAccountQuota (mS-DS-CreatorSID) |
--roast | Contas Kerberoastable + AS-REP-roastable |
--shadowcreds | Shadow credentials (msDS-KeyCredentialLink) |
--sidhistory | Injeção de sIDHistory (privilegiado / estrangeiro) |
--adminsdholder | Objetos adminCount=1 órfãos |
--gpp | Varredura de segredos em SYSVOL - cpassword do GPP, unattend, credenciais de scripts |
--gpolateral | Grupos locais de GPO → arestas laterais (AdminTo / CanRDP / CanPSRemote / ExecuteDCOM) |
--policy | Política de segurança de GPO (LLMNR / NBT-NS / WDigest / NTLMv1) |
--pwdpolicy | Política de palavras-passe / PSO · idade do krbtgt · MachineAccountQuota |
--hygiene | Higiene de credenciais (PASSWD_NOTREQD / DONT_EXPIRE / reversível / fugas em descrições) |
--gmsa | Enumeração de leitores de palavras-passe de gMSA |
--laps | Cobertura do LAPS (legado + Windows LAPS 2023+) |
--stale | Computadores obsoletos via lastLogonTimestamp |
--topology | Topologia de computadores via descodificação de SPN |
--adws | Deteção de endpoint ADWS (9389/TCP por DC) |
| Versão | Estado | Marco |
|---|
| v0.13 | ✅ | Postura de condições de entrada |
| v0.14 | ✅ | Profundidade de ACL + arestas laterais |
| v0.15 | ✅ | Auditoria de estrutura de ACL (classe ADeleg) |
| v0.16 | ✅ | Persistência furtiva + profundidade de SYSVOL / ADCS |
| v0.17 | ✅ | Pegada entre domínios + híbrida |
| v0.18 | ✅ | Higiene de consultas + pegada honesta |
| v1.0 | ✅ | Funcionalidades completas: achados priorizados + remediação, CI, Apache 2.0 |
| v1.1 | 🔲 | Linha temporal · deteção de rogue-DC / DCShadow · ADIDNS · passada de postura defensiva |