
Kestrel v.1.1.0
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.
Kestrel
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.
Tem andado a olhar para o lado errado
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.
- Tempo. Um grafo é um instantâneo. O Kestrel lê os metadados de replicação - quando um atributo Tier-0 mudou e qual DC o originou. Um direito DCSync concedido ontem à noite não é o mesmo achado que um que já lá está há anos, e só um deles significa que está a ser atacado agora mesmo.
- Persistência num atributo, não numa aresta. Shadow credentials, SID history, reanimate-tombstones, backdoors de
defaultSecurityDescriptorno schema, objetos ocultos, deny-ACEs deOWNER RIGHTS, chaves DKM do AD FS. As ferramentas de grafos não recolhem isto porque não há aresta para desenhar. - Postura defensiva, invertida. Não "quem pode atacar", mas "o que não está protegido" - a conta Tier-0 fora do seu silo, a conta de sincronização com um RID aleatório que ninguém etiquetou, a política de bloqueio que nunca limita um password spray.
Não é que o Kestrel seja mais rápido do que um grafo. Ele responde a perguntas que o grafo não consegue colocar.
Cada pecado de AD, num único exe nativo
| 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 |
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.
Uma linha
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.
Um exe. Vermelho, azul, roxo.
- Vermelho / cinzento - enumere a persistência e a delegação que o grafo não vê, exporte diretamente para BloodHound CE OpenGraph (
--opengraph) para fundir com a sua coleção existente, ou faça pivot a partir de qualquer principal (--from). - Azul - uma lista de achados priorizada e com remediação; um
--diffcontra 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. - Roxo - um único artefacto que ambos os lados leem da mesma forma. O vermelho encontra-o, o azul corrige-o, e todos apontam para o mesmo número de linha.
Detetável por conceção
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.
Início rápido
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
Módulos
Execute --all, ou selecione qualquer subconjunto. Ajuda completa: Kestrel.exe --help.
| 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) |
Saída e interoperabilidade: --report <file> (.html / .json / .yaml) · --opengraph <file> (BloodHound CE) · --diff <snapshot.json> · --verbose.
Invariantes de conceção
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).
- Só de leitura - nunca cria, modifica ou elimina um objeto do diretório. Apenas eventos de leitura/acesso, nunca eventos de modificação.
- Utilizador de domínio normal - sem elevação de privilégios, sem
SeSecurityPrivilege, máscaras de segurança apenas com DACL. - Sem replicação - deteta quem pode fazer DCSync; nunca chama a DRSUAPI.
- Apenas diretório e SYSVOL - sem RPC/SMB contra hosts membros.
- Sem evasão - sem fragmentação de consultas, sem jogos de timing, sem adulteração de logs. Ver FOOTPRINT.md.
- Apenas on-prem - sem chamadas a Entra / Graph / cloud; audita a pegada que o híbrido deixa no AD.
- Nativo e autocontido - C puro, zero dependências de terceiros, um único
.exe.
Roadmap
| 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 |
Documentação
- FOOTPRINT.md - o rasto LDAP / SYSVOL exato que cada verificação deixa, e os eventos de DC que ela gera (e não consegue gerar).
- SECURITY.md - reporte, âmbito e os invariantes de conceção como garantias verificáveis.
- LICENSE - Apache 2.0.
Relacionado
Projeto pai: NetEnum - enumeração de AD via ADSI / COM / LDAP.
Autor
@ssteelfactor-oss - investigação de segurança e internals de COM / Windows.
Licença
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.