Macmod/flashingestor

GitHub: Macmod/flashingestor

一个兼容 BloodHound CE 的 Active Directory 数据采集器,提供分阶段的 LDAP 采集、远程收集和离线转换功能,带有友好的终端界面。

Stars: 127 | Forks: 8

flashingestor

A TUI for Active Directory collection.

GitHub Release Go Version Code Size License Build Status Go Report Card GitHub Downloads Twitter Follow

# 设计理念 本项目的主要目标是: 1. 成为兼容 BloodHound CE (Community Edition) 的**全量数据采集器** 2. 比其他收集器更快、噪声更小、更具可定制性 3. 提供带有进度追踪的友好 TUI (终端用户界面) # 演示 # 实现细节 `Flashingestor` 实现了 3 个独立的基本步骤:`LDAP Ingestion`(LDAP 采集)、`Remote Collection`(远程收集)和 `Conversion`(转换),这与其他在单一步骤中运行指定方法的收集器不同: - **Ingest** (`Ctrl+l`) - 从 LDAP 收集原始对象属性数据,并将其存储在 `output/ldap` 下的中间 `msgpack` 文件中。查询可以在 `config.yaml` 中自定义。 - **Remote** (`Ctrl+r`) - 将这些中间文件读入内存,计算要收集的计算机列表,并执行一系列 RPC/SMB/HTTP 请求以获取 `Computer` 和 `EnterpriseCA` 对象的相关远程信息,这些信息存储在 `output/remote` 下。 - **Convert** (`Ctrl+s`) - 将中间文件读入内存,合并采集和远程收集步骤的信息,并在 `output/bloodhound` 下生成兼容 Bloodhound 的转储文件 —— 这一步完全是离线操作。 欲了解更多技术细节和见解,请查看我们的 [📖 Wiki](https://github.com/Macmod/flashingestor/wiki)。 # 安装 ``` $ git clone https://github.com/Macmod/flashingestor $ cd flashingestor # 仅构建: $ go build ./cmd/flashingestor # 安装可执行文件到 $GOBIN 或 $GOPATH/bin: $ go install ./cmd/flashingestor ``` # 使用 首先使用以下方式之一进行身份验证: ``` # 匿名 # [要求 DirectoryServices 对象中的 dSHeuristics 为 0000002 # 并且由于缺乏 Read ACEs,可见性可能受限] $ ./flashingestor -u '@' -p '' [...] # 用户 + 密码 $ ./flashingestor -u @ -p [-k] [...] # 用户 + NTHash $ ./flashingestor -u @ -H [-k] [...] # 用户 + PFX $ ./flashingestor -u @ --pfx [--pfx-password ] [-k] [...] # 用户 + PEM $ ./flashingestor -u @ --cert --key [-k] [...] # 用户 + AESKey $ ./flashingestor -u @ --aes-key -k [...] # 用户 + Ticket $ ./flashingestor -u @ --ccache /path/to/ticket.ccache -k [...] or $ KRB5CCNAME=/path/to/ticket.ccache ./flashingestor -u @ -k [...] ``` 然后根据需要运行步骤。对于仅限 LDAP 的收集(除了 `GPOLocalGroup` 和 `CertServices` 之外的 `DCOnly` 模式),只需运行 `Ctrl+l`,检查采集是否成功,然后运行 `Ctrl+s` 生成最终转储。 ## DC 发现 & DNS 建议指定 `--dc` 和 `--dns` 来运行 `flashingestor`。如果不指定 `--dc`,`flashingestor` 将尝试通过 SRV / A 记录查找它,这可能会延迟初始的 `Ingest` 步骤。 如果您的标准 DNS 服务器不了解该域,则必须指定 `--dns` —— 当使用 AD 集成 DNS 时,只需将 `--dns` 指向托管它的 DC 即可。此外,无论是否指定 `--dc`,如果您想运行 `Remote Collection` 步骤,且您的 DNS 服务器不了解域中的计算机,则必须指定 `--dns` 进行查找。 ## 配置文件 如果配置文件未以 `config.yaml` 名称存在于当前目录下,或未通过 `--config` 提供路径,则将采用默认选项(与提供的 [config.yaml](config.yaml) 相同)—— 它们被硬编码在 [config/fallback.go](config/fallback.go) 中。更多信息,请阅读 [配置文件](https://github.com/Macmod/flashingestor/wiki/Configuration#configuration-file-configyaml)。 ## 其他选项 考虑使用 `--log` 指定日志输出文件(以便在关闭 TUI 后需要查看日志时使用),以及使用 `-vv` 查看调试日志消息,因为这些可能有助于排查可能出现的问题。有关命令行参数的完整参考,请阅读 [命令行参数](https://github.com/Macmod/flashingestor/wiki/Configuration#command-line-arguments)。 ## 采集 如果 `recurse_trusts` 设置为 `true`,它将使用提供的初始凭证递归采集发现的任何受信任域。 如果 `search_forest` 设置为 `true`,它将从 `Configuration` 分区采集与初始域属于同一林的域 —— 不会发出额外的查询,因为这已经是默认采集计划的一部分。这两个选项可以同时设置,`flashingestor` 只会采集发现的任何域一次(通过信任关系或通过当前林)。 如果启用了 `recurse_trusts` 并且 `recurse_feasible_only` 也设置为 true,则只有在信任关系满足以下条件时,它才会尝试采集受信任域: 1. 入站/双向 且 2. 该信任涉及初始域,或者是可传递的。 这意味着仅出站的信任将不会被遍历,并且除了第一层信任之外,采集路径会在非传递性信任处停止 —— 如果 B 非传递性地信任 A,那么 A 仍然可以认证到 B;但如果 C 也非传递性地信任 B,那么 A 无法认证到 C。 来自 [Macmod/ldapx](https://github.com/Macmod/ldapx) 的中间件链也可以直接与 `flashingestor` 一起使用,通过使用 `-f` (`--ldapx-filter`)、`-a` (`--ldapx-attrs`) 和 `-b` (`--ldapx-basedn`) 选项在采集步骤中**混淆 LDAP 查询**。使用 `-vv` 时,混淆前后的原始查询也将显示在日志中。 ## 远程收集 如果您打算运行远程收集步骤,请检查已启用的 `methods` —— 这些大致对应于 SharpHound 提供的方法,可用于通过 RPC 或 HTTP 切换特定的收集。 `--remote-*` 参数可用于为远程收集指定单独的一组凭证。如果未指定,`flashingestor` 将尝试使用标准采集参数中提供的用户凭证(`--user`、`--password` 等)进行远程收集。 也可以通过指定 `--remote-user Administrator@.` 来使用本地管理员进行远程收集,例如,但这种方法的有效性取决于该账户是否为内置管理员,以及 `FilterAdministratorToken` / `LocalAccountTokenFilterPolicy` 注册表键的值。有关此行为的更多详细信息,请参阅 [Pass-the-Hash Is Dead: Long Live LocalAccountTokenFilterPolicy](https://specterops.io/blog/2017/03/16/pass-the-hash-is-dead-long-live-localaccounttokenfilterpolicy/) ## 转换 选项 `compress_output` 和 `cleanup_after_compression` 有助于保持较小的磁盘使用量。在 Bloodhound 中加载最终转储后,如果您不需要 `output/ldap` 和 `output/remote` 下的文件,可以安全地手动删除它们,但保留这些文件可以方便查找重要信息,而无需重新运行完整收集。 # 致谢 * 非常感谢 SpecterOps 提供的 [BloodHound](https://github.com/SpecterOps/BloodHound)、[SharpHound](https://github.com/SpecterOps/SharpHound) / [SharpHoundCommon](https://github.com/SpecterOps/SharpHoundCommon) 以及 dirkjanm 提供的 [BloodHound.py](https://github.com/dirkjanm/Bloodhound.py),它们是本工具的主要参考。 * 感谢 [rtpt-erikgeiser](https://github.com/rtpt-erikgeiser) & [RedTeamPentesting](https://github.com/RedTeamPentesting/adauth) 提供的 [adauth](https://github.com/RedTeamPentesting/adauth) 以及 [p0dalirius](https://github.com/p0dalirius) 提供的 [winacl](https://github.com/TheManticoreProject/winacl),这两个库非常有用。 * 感谢 [oiweiwei](https://github.com/oiweiwei) 提供的 [go-msrpc](https://github.com/oiweiwei/go-msrpc),他的库使得实现基于 RPC 的远程收集方法成为可能。 # 已知问题 ## 远程收集 * 与采集阶段允许跨域身份验证的方法限制类似,当使用 Kerberos(例如,当用户属于 `Protected Users` 或 NTLM 身份验证通过安全设置被阻止时)或证书(底层使用 PKINIT)运行远程收集时,远程收集不会尝试向与用户所属域不同的域的计算机进行身份验证。这也适用于 `GPOLocalGroup` 方法,在这种情况下,即使采集数据中存在多个域,它也不会尝试从其他域的 DC 读取 GPO 文件。 * `Computer` 类型的 `SmbInfo` 仍是一个基本实现(仅注册表检查)。 * `HttpEnrollmentEndpoints` 仅在提供用户名/密码时有效。 * `AllowedToDelegateTo` / `ServicePrincipalNames` 解析仍是一个基本实现。 ## 通用 * 几乎所有在 SharpHound 中实现的属性都受支持,但此工具与 SharpHound 之间存在许多架构差异,因此不要期望输出与官方实现完全匹配(除非是偶发的 bug)。主要差异可能出现在更复杂的实现中,例如通过 RPC 的远程收集以及与 CA/证书滥用相关的收集。 * 超时设置仍然是静态的 —— SharpHound 的实现使用了 [adaptive timeout](https://github.com/SpecterOps/SharpHoundCommon/blob/v4/src/CommonLib/AdaptiveTimeout.cs)(非常巧妙!),但我还没时间研究它。如果需要,请使用 `--timeout`、`--computer-timeout` 和 `--method-timeout` 选项自定义超时([config/config.go](config/config.go) 指定了其他特定操作的超时)。 * 测试目前尚未实现,我只手动测试了一小部分功能。 # 许可证 The MIT License (MIT) Copyright (c) 2023 Artur Henrique Marzano Gonzaga Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
标签:Active Directory, AD采集, BloodHound CE, Checkov, Go语言, HTTP, LDAP查询, msgpack, Plaso, Prisma Cloud, Web报告查看器, 企业安全, 图形化TUI, 域渗透, 域环境分析, 威胁情报, 开发者工具, 数据解析, 日志审计, 电子数据取证, 程序破解, 网络资产管理, 远程数据获取