BloodHound 为你展示路径。Kestrel 为你展示已经潜伏在其中的东西。
所有人都在测绘同一件事:攻击路径——谁能抵达域管理员。 这是正确的问题,回答它的工具也非常出色。但一张“谁能抵达谁”的图对一整类问题视而不见,因为 Active Directory 中一些最糟糕的东西根本不是一条路径。
它们是被焊进某个属性里的后门。一张在密码重置很久之后仍能持续通过认证的证书。一个被烙进 schema 本身的权限,使得从此以后创建的每个对象都静默地继承它。一个被删除的账户,却有人悄悄保留了将其恢复的权限。一个仅凭一条拒绝读取 ACE 就被隐藏于枚举之外的对象。
这些都不是图中的一条边。而它们此刻全都躺在你的目录里。 Kestrel 能读取它们——使用原生 Windows 调用、普通域用户权限,无需服务器、无需 Python、无需代理,并且在域控制器上留下的足迹极为克制,已逐事件记录在案。
一个 .exe。一条命令。以下全部内容。
攻击性 AD 生态——SharpHound、impacket、Certipy,以及它们背后的图——非常出色,而它们全都着眼于同一个表面:可达性。Kestrel 着眼于这个表面无法表达的三个维度。
defaultSecurityDescriptor 后门、隐藏对象、OWNER RIGHTS 拒绝 ACE、AD FS DKM 密钥。图工具不收集这些,因为没有边可画。并不是说 Kestrel 比图更快。它回答的是图无法提出的问题。
| 风险点 | Kestrel 发现的内容 | 标志 |
|---|---|---|
| 复制与委派 | DCSync 权限(谁可以复制——而无需实际复制)、无约束 / 约束 / RBCD / S4U 委派 | --acl · --delegation |
| 证书滥用 | AD CS ESC1–5/9、NTAuth 存储中的流氓 CA、长期证书持久化、AD FS DKM 密钥 ACL——Golden SAML 的前提条件 | --adcs · --adfs |
| 属性中的持久化 | Shadow 凭据、SID 历史注入、墓碑复活权限、隐藏对象、架构 defaultSecurityDescriptor 后门、孤立的 adminCount | --shadowcreds · --sidhistory · --acl · --schema · --adminsdholder |
| 明文与可破解凭据 | GPP cpassword、SYSVOL 中的 unattend/sysprep 机密和脚本密码、可 Kerberoast 和 AS-REP-roast 的账户、LAPS 覆盖缺口 | --gpp · --roast · --laps |
| 跨域与混合 | 特权组中的外部主体、标记为 Tier-0 的 Entra Connect 同步账户、信任态势、通过 MachineAccountQuota 创建的机器账户(mS-DS-CreatorSID) | --groups · --trust · --machines |
| 态势与侦察 | 密码 / PSO 策略、krbtgt 年龄、LLMNR / NBT-NS / WDigest / NTLMv1 GPO 设置、gMSA 读取者、过期计算机、委派拓扑 | --pwdpolicy · --policy · --gmsa · --stale |
| 考古 | 孤立的危险 ACE(已删除主体持有的权限——SID 解析不到任何人)、过期的特权账户(被遗忘、权限过高、密码古老) | --archaeology |
| 域加固 | dSHeuristics 匿名 LDAP / AdminSDHolder 排除标志、Pre-Windows 2000 Compatible Access 的广泛成员资格 | --hardening |
| 服务态势 (从 AD 读取,不向服务发送数据包) | Exchange 到 DA 的提权与 EOL、SCCM 容器接管与站点映射、ADIDNS 区域投毒(Authenticated Users 可创建记录) | --exchange · --sccm · --dns |
二十多项检查,通常分散在十几个脚本和两种语言中。在这里,它们是一个二进制文件——并且最终给出一个按严重性排序的单一判定。
Kestrel.exe --all --report audit.html
运行全部内容。获取完整的 HTML 报告。并且,在控制台的最末尾,是真正重要的部分:
═══ 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
不是一大堆输出。只列出真正重要的发现,按优先级排序,每条都附上关闭它的命令。
--opengraph)以与你现有的采集数据融合,或从任意主体出发进行转向(--from)。--diff 对比上周的快照以捕捉变化;以及一个其精确检测足迹已公开的工具,以便你将其加入白名单并围绕它调整自己的告警。Kestrel 是只读的。它从不写入目录,从不复制,从不需要 SeSecurityPrivilege,从不接触云。读取谁可以执行 DCSync,在网络流量上与实际执行 DCSync 看起来完全不同 - 没有 DRSUAPI,没有复制签名的 4662。它运行的每个查询以及它能(和不能)生成的每个事件都记录在 FOOTPRINT.md 中。一个告诉防御者如何精确捕获自己的审计工具并不矛盾 - 这正是它的意义所在。
获取一个构建。 每次通过的 CI 运行都会发布一个 Kestrel.exe 产物 - 从 Actions 标签页 下载,无需工具链。
或者自己构建。 Visual Studio(v143+)或 MSBuild:
git clone https://github.com/ssteelfactor-oss/Kestrel.git
cd Kestrel
msbuild Kestrel.vcxproj /p:Configuration=Release /p:Platform=x64
纯 C 语言,零第三方依赖。构建 /MT 后即得到一个自包含的单一可执行文件——将其放到已加入域的任意主机上,以任意普通用户身份运行即可。
运行它。
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
运行 --all,或选择任意子集。完整帮助:Kestrel.exe --help。
| 标志 | 扫描 |
|---|---|
--acl | ACL 边、DCSync 权限、所有者/继承/规范卫生、隐藏对象、复活墓碑 |
--groups | 传递性特权成员资格 + 外部安全主体 |
--delegation | 无约束 / 约束 / RBCD / S4U2Self |
--paths / --from | 到 Tier-0 的攻击路径分析(可选从给定主体出发) |
--adcs | AD CS 证书模板 / CA 审计(ESC1–5/9)+ NTAuth 存储 + 有效期 |
--adfs | AD FS DKM 密钥 ACL(Golden SAML 前提条件) |
--schema | Schema defaultSecurityDescriptor 后门审计 |
--trust | 域 / 林信任态势 |
--machines | 通过 MachineAccountQuota 创建的机器账户(mS-DS-CreatorSID) |
--roast | 可 Kerberoast + 可 AS-REP-roast 的账户 |
--shadowcreds | 影子凭据(msDS-KeyCredentialLink) |
--sidhistory | sIDHistory 注入(特权 / 外部) |
--adminsdholder | 孤立的 adminCount=1 对象 |
--gpp | SYSVOL 机密扫描 - GPP cpassword、unattend、脚本凭据 |
--gpolateral | GPO 本地组 → 横向边(AdminTo / CanRDP / CanPSRemote / ExecuteDCOM) |
--policy | GPO 安全策略(LLMNR / NBT-NS / WDigest / NTLMv1) |
--pwdpolicy | 密码 / PSO 策略 · krbtgt 年龄 · MachineAccountQuota |
--hygiene | 凭据卫生(PASSWD_NOTREQD / DONT_EXPIRE / 可逆 / 描述泄露) |
--gmsa | gMSA 密码读取者枚举 |
--laps | LAPS 覆盖(旧版 + Windows LAPS 2023+) |
--stale | 通过 lastLogonTimestamp 检测陈旧计算机 |
--topology | 通过 SPN 解码检测计算机拓扑 |
--adws | ADWS 端点检测(每个 DC 的 9389/TCP) |
--archaeology | 孤立的危险 ACE(所有者已死、权限仍存)+ 陈旧特权账户 |
--hardening | 域加固标志:dSHeuristics 匿名访问 / SDProp 排除 + Pre-Windows 2000 Compatible Access |
--exchange | Exchange 态势:版本/EOL + Exchange 到 DA 的提权(对域的 WriteDACL)(服务;需主动启用) |
--sccm | SCCM/MECM 态势:System Management 容器 ACL + 管理点 / 站点映射 (服务;需主动启用) |
--dns | AD 集成 DNS(ADIDNS):区域 CreateChild DACL + wpad/isatap/通配符 + DnsAdmins (服务;需主动启用) |
服务态势(--exchange · --sccm · --dns)需主动启用,且不包含在 --all 中;运行 --services 以覆盖整个层。发现项现在带有 MITRE ATT&CK 技术标签。
输出与互操作: --report <file>(.html / .json / .yaml)· --opengraph <file>(BloodHound CE)· --diff <snapshot.json> · --verbose。
这些是承诺,而非偏好——它们是在生产环境中安全运行的理由。违反任何一条都是安全缺陷(参见 SECURITY.md)。
SeSecurityPrivilege,仅使用 DACL 安全掩码。.exe。