0x0Trace/Certihound

GitHub: 0x0Trace/Certihound

一款 Linux 原生的 AD CS 枚举与漏洞检测库,支持将基于证书的攻击路径导出至 BloodHound CE 进行可视化分析。

Stars: 84 | Forks: 4


CertiHound

Linux 原生的 BloodHound CE AD CS 收集器

PyPI Python Version License

功能安装快速开始用法BloodHoundAPI

**CertiHound** 通过 LDAP 枚举 Active Directory Certificate Services (AD CS),并导出与 BloodHound CE 兼容的数据以进行攻击路径可视化。识别 ESC1-ESC17 漏洞,并将基于证书的攻击路径可视化。 ## 截图 ### ESC1 - Enrollee Supplies Subject 检测

ESC1 Detection in BloodHound

*CertiHound 检测易受 ESC1 攻击的模板,并创建指向 Enterprise CA 的注册边缘(enrollment edges),从而能够在 BloodHound CE 中进行攻击路径分析。* ### ESC4 - 模板 ACL 滥用检测

ESC4 Detection in BloodHound

*证书模板上的 WriteDacl、WriteOwner 及其他危险权限将被识别并映射为攻击边缘。* ## 功能 | 功能 | 描述 | |---------|-------------| | **Linux 原生** | 无需 Windows 依赖 - 纯 Python LDAP 枚举 | | **BloodHound CE v6+** | 支持直接导入 JSON/ZIP,全面支持节点和边缘 | | **漏洞检测** | ESC1-ESC11, ESC13-ESC17, GoldenCert | | **多后端支持** | 适用于 ldap3、impacket 或任何兼容的 LDAP 适配器 | | **NetExec 集成** | 与 NetExec 的 `--bloodhound` 选项无缝集成 | | **全面覆盖** | 证书模板、Enterprise CA、Root CA、NTAuth、AIA CA | ### 支持的漏洞 | 漏洞 | 描述 | |---------------|-------------| | **ESC1** | 低权限注册且由注册者提供主体 (Enrollee Supplies Subject) | | **ESC2** | Any Purpose EKU 或无 EKU 允许注册代理滥用 | | **ESC3** | 注册代理模板 + 易受攻击的目标 | | **ESC4** | 证书模板上的危险 ACL 权限 | | **ESC5** | AD 容器上存在易受攻击的 PKI 对象访问控制 | | **ESC6** | Enterprise CA 上的 EDITF_ATTRIBUTESUBJECTALTNAME2 | | **ESC7** | 危险的 CA 权限 (ManageCA / ManageCertificates) | | **ESC8** | NTLM 中继到 AD CS Web 注册 (HTTP) 端点 | | **ESC9** | 无安全扩展 + 弱证书映射 | | **ESC10** | 无强绑定的弱证书映射 | | **ESC11** | NTLM 中继到 AD CS RPC 端点(无强制加密) | | **ESC13** | 带有 OID 组链接滥用的颁发策略 | | **ESC14** | 弱显式证书映射 (altSecurityIdentities) | | **ESC15** | EKUwu - Schema V1 模板上的应用程序策略滥用 | | **ESC16** | CA 上全局禁用安全扩展 | | **ESC17** | Server Authentication EKU + 注册者提供主体 (TLS MITM) | | **GoldenCert** | 从宿主计算机提取 CA 私钥 | ## 安装 ### 从 PyPI 安装(推荐) ``` pipx install certihound # 或者,如果您需要 Kerberos (-k) 认证: pipx install 'certihound[kerberos]' # 在现有安装上,注入 gssapi: pipx inject certihound gssapi ``` ### 从源码安装 ``` git clone https://github.com/0x0Trace/certihound.git cd certihound pip install -e . # core pip install -e '.[kerberos]' # with Kerberos support ``` ### 验证安装 ``` certihound --version certihound --help ``` ## 快速开始 ### 命令行 ``` # 使用密码认证的基本枚举 certihound -d corp.local -u 'user' -p 'password' --dc 10.10.10.10 -o output/ # Pass-the-Hash (仅限 NTHASH,或 LMHASH:NTHASH) certihound -d corp.local -u 'user' -H :31d6cfe0d16ae931b73c59d7e0c089c0 --dc 10.10.10.10 # LDAPS (SSL/TLS) 连接 certihound -d corp.local -u 'user' -p 'password' --dc 10.10.10.10 --ldaps -o output/ # Kerberos 认证 (使用 ccache;需要 'kerberos' 额外依赖) KRB5CCNAME=user.ccache certihound -d corp.local -k --dc dc01.corp.local -o output/ # 输出为 ZIP (默认) 或 JSON certihound -d corp.local -u 'user' -p 'password' --dc 10.10.10.10 --format zip certihound -d corp.local -u 'user' -p 'password' --dc 10.10.10.10 --format json ``` ### Python 库 ``` from certihound import ADCSCollector, BloodHoundCEExporter from certihound.ldap.connection import LDAPConnection, LDAPConfig # 配置连接 config = LDAPConfig( domain="corp.local", username="user", password="password", dc_ip="10.10.10.10", use_ldaps=True, ) # 收集并导出 with LDAPConnection(config) as conn: collector = ADCSCollector(conn) data = collector.collect_all() exporter = BloodHoundCEExporter(data.domain, data.domain_sid) result = exporter.export(data) result.write_zip("bloodhound_adcs.zip") ``` ## 用法 ### CLI 选项 ``` Usage: certihound [OPTIONS] Options: -d, --domain TEXT Target domain FQDN (e.g., corp.local) [required] -u, --username TEXT Username for authentication -p, --password TEXT Password for authentication -H, --hashes TEXT NTLM hash for pass-the-hash (LMHASH:NTHASH or NTHASH) --dc TEXT Domain Controller IP or hostname -k, --kerberos Use Kerberos authentication (ccache) --ldaps Use LDAPS (SSL/TLS) --ca-cert PATH CA certificate file for LDAPS validation --port INTEGER LDAP port (default: 389 or 636 for LDAPS) -o, --output TEXT Output directory (default: ./output) --format [json|zip|both] Output format (default: zip) --enum-only Only enumerate, skip vulnerability detection -v, --verbose Increase verbosity (-v, -vv) --version Show the version and exit. --help Show this message and exit. ``` ### 输出文件 CertiHound 生成兼容 BloodHound CE v6 的文件: | 文件 | 描述 | |------|-------------| | `certtemplates.json` | 包含属性和边缘的证书模板节点 | | `enterprisecas.json` | 包含模板发布的 Enterprise CA 节点 | | `rootcas.json` | Root CA 层次结构节点 | | `ntauthstores.json` | NTAuth 存储配置 | | `aiacas.json` | AIA CA 条目 | ## BloodHound 集成 ### 导入数据 1. 运行 CertiHound 生成 ZIP 文件 2. 打开 BloodHound CE 3. 点击 **Import** → 选择生成的 ZIP 文件 4. 使用内置的 ADCS 查询或创建自定义查询 ### Cypher 查询示例 **查找易受 ESC1 攻击的模板:** ``` MATCH p = (:Base)-[:Enroll|GenericAll|AllExtendedRights]-> (ct:CertTemplate)-[:PublishedTo]->(:EnterpriseCA) WHERE ct.enrolleesuppliessubject = True AND ct.authenticationenabled = True RETURN p ``` **查找 ESC4 模板 ACL 滥用:** ``` MATCH p = (principal)-[:WriteDacl|WriteOwner|GenericWrite|GenericAll|WriteAllProperties]-> (ct:CertTemplate)-[:PublishedTo]->(ca:EnterpriseCA) WHERE NOT principal.objectid ENDS WITH '-512' AND NOT principal.objectid ENDS WITH '-519' AND NOT principal.objectid ENDS WITH '-544' RETURN p ``` ## NetExec 集成 CertiHound 与 [NetExec](https://github.com/Pennyw0rth/NetExec) 集成以进行 ADCS 枚举。 ``` # 仅 ADCS 收集 nxc ldap 10.10.10.10 -u user -p pass --bloodhound -c ADCS # 包括 ADCS 的完整收集 nxc ldap 10.10.10.10 -u user -p pass --bloodhound -c All --dns-server 10.10.10.10 ``` ## API 参考 ### 核心类 | 类 | 描述 | |-------|-------------| | `ADCSCollector` | 用于 ADCS 枚举的主收集器 | | `BloodHoundCEExporter` | 将数据导出为 BloodHound CE 格式 | | `ImpacketLDAPAdapter` | 用于基于 impacket 的 LDAP (NetExec) 适配器 | | `LDAPConnection` | 独立 LDAP 连接包装器 | | `LDAPConfig` | 用于 LDAP 连接的配置数据类 | ### 数据模型 | 类 | 描述 | |-------|-------------| | `ADCSData` | 所有收集到的 ADCS 数据的容器 | | `CertTemplate` | 带有属性和 ACL 的证书模板 | | `EnterpriseCA` | 带有启用模板的 Enterprise CA | | `RootCA` | Root CA 节点 | | `NTAuthStore` | NTAuth 证书存储 | | `AIACA` | AIA CA 条目 | | `ExportResult` | 具有 `write_zip()`, `write_json()`, `to_dict()` 的导出结果 | ### 检测函数 ``` from certihound import ( detect_esc1, detect_esc2, detect_esc3_agent, detect_esc3_target, detect_esc4, detect_esc5, detect_esc6, detect_esc7, detect_esc8, detect_esc9, detect_esc10, detect_esc11, detect_esc13, detect_esc14, detect_esc15, detect_esc16, detect_esc17, ) ``` ### 用法示例 ``` from certihound import ( ADCSCollector, BloodHoundCEExporter, ADCSData, ExportResult, ) # 收集数据 collector = ADCSCollector.from_external(adapter, domain, domain_sid) data: ADCSData = collector.collect_all() # 访问收集到的对象 print(f"Templates: {len(data.templates)}") print(f"Enterprise CAs: {len(data.enterprise_cas)}") print(f"Root CAs: {len(data.root_cas)}") # 导出到 BloodHound exporter = BloodHoundCEExporter(data.domain, data.domain_sid) result: ExportResult = exporter.export(data) # 输出选项 result.write_zip("output.zip") # ZIP for BloodHound import result.write_json("output/") # Individual JSON files output_dict = result.to_dict() # Python dictionary ``` ## 依赖项 | 包 | 用途 | |---------|---------| | `ldap3` | LDAP 操作(独立模式) | | `impacket` | Kerberos 认证和 NetExec 集成 | | `cryptography` | 证书解析和分析 | | `pydantic` | 数据验证和模型 | | `click` | CLI 框架 | | `rich` | 终端输出格式化 | ## 许可证 该项目基于 MIT 许可证授权 - 详见 [LICENSE](LICENSE) 文件。 ## 致谢与参考 - 灵感来自 Oliver Lyak 开发的 [Certipy](https://github.com/ly4k/Certipy) - BloodHound CE 格式基于 SpecterOps 开发的 [BloodHound](https://github.com/SpecterOps/BloodHound) - ADCS 漏洞研究:Will Schroeder 和 Lee Christensen 撰写的 [Certified Pre-Owned](https://posts.specterops.io/certified-pre-owned-d95910965cd2)
标签:AD CS, BloodHound, log2timeline, Python, SNMP, 无后门, 逆向工具, 黑客追踪