一个用于 Active Directory 收集的 TUI 工具。
该项目的主要目标是:
Flashingestor 实现了三个独立的基本步骤:LDAP 导入、远程收集 和 转换,而其他收集器则在单个步骤中运行指定的方法:
导入 (Ctrl+l) - 从 LDAP 收集原始对象属性数据,并将其存储在 output/ldap 下的中间 msgpack 文件中。查询可以在 config.yaml 中自定义。
远程 (Ctrl+r) - 将这些中间文件读入内存,计算要收集的计算机列表,并执行一系列 RPC/SMB/HTTP 请求,以获取 Computer 和 EnterpriseCA 对象的相关远程信息,这些信息存储在 output/remote 下。
转换 (Ctrl+s) - 将中间文件读入内存,合并导入和远程收集步骤的信息,并在 output/bloodhound 下生成 Bloodhound 兼容的转储文件——此步骤完全离线。
有关更多技术细节和见解,请查看我们的 📖 Wiki。
$ git clone https://github.com/Macmod/flashingestor
$ cd flashingestor
# 仅构建:
$ go build ./cmd/flashingestor
# 将可执行文件安装到 $GOBIN 或 $GOPATH/bin:
$ go install ./cmd/flashingestor
[!NOTE] 你也可以使用提供的 Releases 中的预编译二进制文件。
首先使用以下方式之一进行身份验证:
# 匿名
# [需要在 DirectoryServices 对象中设置 dSHeuristics 为 0000002,
# 并且由于缺少 Read ACE,可见性可能有限]
$ ./flashingestor -u '@<DOMAIN>' -p '' [...]
# 用户名 + 密码
$ ./flashingestor -u <USER>@<DOMAIN> -p <PASSWORD> [-k] [...]
# 用户名 + NTHash
$ ./flashingestor -u <USER>@<DOMAIN> -H <NTHASH> [-k] [...]
# 用户名 + PFX
$ ./flashingestor -u <USER>@<DOMAIN> --pfx <PFXPATH> [--pfx-password <PFXPASS>] [-k] [...]
# 用户名 + PEM
$ ./flashingestor -u <USER>@<DOMAIN> --cert <PEMPATH> --key <KEYPATH> [-k] [...]
# 用户名 + AESKey
$ ./flashingestor -u <USER>@<DOMAIN> --aes-key <AESKEY> -k [...]
# 用户名 + Ticket
$ ./flashingestor -u <USER>@<DOMAIN> --ccache /path/to/ticket.ccache -k [...]
或
$ KRB5CCNAME=/path/to/ticket.ccache ./flashingestor -u <USER>@<DOMAIN> -k [...]
然后根据需要运行步骤。对于仅 LDAP 收集(除 GPOLocalGroup 和 CertServices 外的 DCOnly),只需运行 Ctrl+l,检查导入是否成功,然后运行 Ctrl+s 生成最终转储。
建议指定 --dc 和 --dns 来运行 flashingestor。如果不指定 --dc,flashingestor 会尝试通过 SRV / A 查询来查找 DC,这可能会延迟初始的 Ingest 步骤。
如果标准 DNS 服务器不知道域,则必须指定 --dns——当使用 AD 集成 DNS 时,只需将 --dns 指向托管它的 DC。此外,无论是否指定 --dc,如果你想运行 远程收集 步骤,并且你的 DNS 服务器不知道域中的计算机,则必须指定 --dns 以进行查询。
[!TIP] 在具有多个 DC 的环境中,你还可以使用
dcprobe工具来测量到所有 DC 的延迟,并找到一个好的目标候选用于导入:$ go build ./cmd/dcprobe $ ./dcprobe --dns 192.168.88.6 -d creta.local -r 10
如果当前目录下不存在 config.yaml,或者没有通过 --config 提供路径,则会使用默认选项(与提供的 config.yaml 相同)——它们被硬编码在 config/fallback.go 中。更多信息请阅读 配置文件。
考虑使用 --log 指定日志输出文件(以便在关闭 TUI 后审核日志),以及使用 -vv 查看调试日志消息,这些可能有助于排查潜在问题。有关命令行参数的完整参考,请阅读 命令行参数。
[!NOTE] 提供的
config.yaml中的默认查询是为 Bloodhound 转换所需的信息而设计的。你可以选择在config.yaml中自定义查询或属性,但最好避免删除所需属性,也不要更改搜索过滤器的含义。
如果 recurse_trusts 设置为 true,它将使用导入时提供的初始凭据递归地导入任何发现的受信任域。
如果 search_forest 设置为 true,它将从 Configuration 分区导入与初始域位于同一林中的域——不会发出额外的查询,因为这已经是默认导入计划的一部分。这两个选项可以同时设置,flashingestor 只会导入每个发现的域一次(无论是通过信任关系还是当前林)。
如果启用了 recurse_trusts 并且 recurse_feasible_only 也设置为 true,则只有当信任关系满足以下条件时,它才会尝试导入受信任域:
这意味着只出不入的信任关系不会被遍历,并且除了信任的第一层外,导入路径在非可传递信任处停止——如果 B 非可传递地信任 A,则 A 仍然可以向 B 进行身份验证;但如果 C 也非可传递地信任 B,则 A 无法向 C 进行身份验证。
[!IMPORTANT]
recurse_trusts/search_forest仅在提供的凭据是明文密码或NT hash时,才会使用指定凭据对发现的域中的 LDAP 进行身份验证;使用 TGT 为此目的发出引荐票据在理论上是可能的,但在adauth库中 尚未实现。
来自 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。
选项 compress_output 和 cleanup_after_compression 有助于保持磁盘使用量较小。在 Bloodhound 中加载最终转储后,可以安全地手动删除 output/ldap 和 output/remote 下的文件(如果不需要它们),但这些文件可以保留下来,以便在不重新运行完整收集的情况下查找重要信息。
[!TIP]
output/ldap和output/remote文件夹下的msgpack文件的主要目的是作为中间格式,以分离整个过程的职责,但这些文件也可以通过转换为 JSON 来作为信息源——这样你就不必查找原始对象属性或远程收集结果:$ go build ./cmd/ingest2json $ ./ingest2json output/ldap/YOURDOMAIN/SelectedFile.msgpack -o output.json
特别感谢 SpecterOps 提供了 BloodHound、SharpHound / SharpHoundCommon,以及 dirkjanm 提供了 BloodHound.py,这些是本工具的主要参考。
感谢 rtpt-erikgeiser 和 RedTeamPentesting 提供了 adauth,以及 p0dalirius 提供了 winacl,这两个库都非常有用。
Protected Users 的一部分,或者通过安全设置阻止了 NTLM 身份验证),或者使用证书(底层使用 PKINIT)时,远程收集不会尝试对与用户所属域不同的域中的计算机进行身份验证。这也适用于 GPOLocalGroup 方法,在这种情况下,即使导入的数据中存在多个域,它也不会尝试从其他域的 DC 读取 GPO 文件。Computer 类型的 SmbInfo 仍然是基础实现(仅注册表检查)。HttpEnrollmentEndpoints 仅适用于提供的用户名/密码。AllowedToDelegateTo / ServicePrincipalNames 解析仍然是基础实现。SharpHound 中实现的几乎所有属性都受支持,但此工具与 SharpHound 之间存在许多架构差异,因此不要期望输出与官方实现完全一致(除非是意外的 bug)。特别是在复杂实现(如通过 RPC 进行远程收集以及与 CA/证书滥用相关的收集)方面,可能会出现关键差异。
超时设置目前大多是静态的——SharpHound 的实现使用了 自适应超时(非常巧妙!),但我还没有时间研究它。如有需要,可以使用 --timeout、--computer-timeout 和 --method-timeout 选项自定义超时(config/config.go 指定了其他操作特定的超时)。
目前尚未实现测试,我只手动测试了少量功能。
MIT 许可证(MIT)
Copyright (c) 2023 Artur Henrique Marzano Gonzaga
特此授予任何人免费获得本软件及相关文档文件(“软件”)副本的许可,不受限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许获得软件的人这样做,但须满足以下条件:
上述版权声明和本许可声明应包含在所有软件的副本或重要部分中。
本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权持有人均不对因本软件或本软件的使用或其他交易引起的任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为或其他方面。