ThievingFox 是一套后渗透工具集,用于从各种密码管理器及 Windows 实用工具中收集凭据。 每个模块利用特定的方法注入到目标进程中,然后挂钩内部函数来收集凭据。
相关博客文章请参阅 此处
必须安装 Rustup,请按照以下地址的说明操作:https://rustup.rs/
必须安装 mingw-w64 包。 在 Debian 上,可通过以下命令安装:
apt install mingw-w64
必须为 Rust 安装 x86 和 x86_64 两个 Windows 目标:
rustup target add x86_64-pc-windows-gnu
rustup target add i686-pc-windows-gnu
还必须安装 Mono 和 Nuget,说明请见:https://www.mono-project.com/download/stable/#download-lin
添加 Mono 仓库后,可通过 apt 安装 Nuget:
apt install nuget
最后,必须安装 Python 依赖:
pip install -r client/requirements.txt
ThievingFox 需要 python >= 3.11。
必须安装 Rustup,请按照以下地址的说明操作:https://rustup.rs/
必须为 Rust 安装 x86 和 x86_64 两个 Windows 目标:
rustup target add x86_64-pc-windows-msvc
rustup target add i686-pc-windows-msvc
还必须安装 .NET 开发环境。从 Visual Studio 中,导航到 工具 > 获取工具和功能 > 安装“.NET 桌面开发”。
最后,必须安装 Python 依赖:
pip install -r client/requirements.txt
ThievingFox 需要 python >= 3.11
注意:在 Windows 主机上,为了使用 KeePass 模块,msbuild 必须在 PATH 中可用。可以通过在 Visual Studio 开发人员 PowerShell (工具 > 命令行 > 开发人员 PowerShell) 中运行客户端来实现。
所有模块已在以下 Windows 版本上测试:
| Windows 版本 |
|---|
| Windows Server 2022 |
| Windows Server 2019 |
| Windows Server 2016 |
| Windows Server 2012R2 |
| Windows 10 |
| Windows 11 |
[!CAUTION] 模块尚未在其他版本上测试,预计将无法工作。
[!CAUTION] 尽管我已尽力确保这些工具不会影响目标应用程序的稳定性,但内联钩子和库注入并不安全,可能导致崩溃或应用程序不稳定。如果发生这种情况,在目标上使用
cleanup模块应该足以确保下次启动应用程序时不会执行注入/钩子操作。
ThievingFox 包含 3 个主要模块:poison、cleanup 和 collect。
对于命令行参数中指定的每个应用程序,poison 模块会检索将被劫持的原始库(针对 COM 劫持和 DLL 代理),编译一个与原始 DLL 属性匹配的库,将其上传到服务器,并在必要时修改注册表以执行 COM 劫持。
为了加速所有库的编译过程,在 client/cache/ 中维护了一个缓存。
--mstsc、--rdcman 和 --mobaxterm 有特定的选项,分别为 --mstsc-poison-hkcr、--rdcman-poison-hkcr 和 --mobaxterm-poison-hkcr。如果指定了其中一个选项,COM 劫持将替换 HKCR 配置单元中的注册表项,这意味着所有用户都将受到影响。默认情况下,仅影响所有当前登录的用户(拥有 HKCU 配置单元的所有用户)。
--keepass 和 --keepassxc 有特定的选项:--keepass-path、--keepass-share 以及 --keepassxc-path、--keepassxc-share,用于指定这些应用程序的安装位置(如果不是默认安装路径)。对于其他应用程序则不需要,因为它们使用 COM 劫持。
KeePass 模块要求在目标上安装 Visual C++ Redistributable。
可以同时指定多个应用程序,或者使用 --all 标志来针对所有应用程序。
[!IMPORTANT] 如果更改了
--tempdir参数,请记得清除缓存,因为目录名称已嵌入到原生 DLL 中。
$ python3 client/ThievingFox.py poison -h
usage: ThievingFox.py poison [-h] [-hashes HASHES] [-aesKey AESKEY] [-k] [-dc-ip DC_IP] [-no-pass] [--tempdir TEMPDIR] [--keepass] [--keepass-path KEEPASS_PATH]
[--keepass-share KEEPASS_SHARE] [--keepassxc] [--keepassxc-path KEEPASSXC_PATH] [--keepassxc-share KEEPASSXC_SHARE] [--mstsc] [--mstsc-poison-hkcr]
[--consent] [--logonui] [--rdcman] [--rdcman-poison-hkcr] [--mobaxterm] [--mobaxterm-poison-hkcr] [--all]
target
positional arguments:
target 目标机器或范围 [domain/]username[:password]@<IP or FQDN>[/CIDR]
options:
-h, --help 显示此帮助信息并退出
-hashes HASHES, --hashes HASHES
LM:NT hash
-aesKey AESKEY, --aesKey AESKEY
用于 Kerberos 身份验证的 AES 密钥
-k 使用 Kerberos 身份验证。对于 LogonUI、mstsc 和 consent 模块,将执行匿名 NTLM 身份验证以获取操作系统版本。
-dc-ip DC_IP, --dc-ip DC_IP
域控制器的 IP 地址
-no-pass, --no-pass 不提示输入密码
--tempdir TEMPDIR 用于 DLL 和输出的临时目录名称 (默认: ThievingFox)
--keepass 尝试对 KeePass.exe 下毒
--keepass-path KEEPASS_PATH
KeePass 的安装路径,不包含共享名称 (默认: /Program Files/KeePass Password Safe 2/)
--keepass-share KEEPASS_SHARE
KeePass 所在的共享 (默认: c$)
--keepassxc 尝试对 KeePassXC.exe 下毒
--keepassxc-path KEEPASSXC_PATH
KeePassXC 的安装路径,不包含共享名称 (默认: /Program Files/KeePassXC/)
--keepassxc-share KEEPASSXC_SHARE
KeePassXC 所在的共享 (默认: c$)
--mstsc 尝试对 mstsc.exe 下毒
--mstsc-poison-hkcr 不毒化所有当前登录用户的 HKCU 配置单元,而是毒化 mstsc 的 HKCR 配置单元,这将适用于当前未登录的用户 (默认: False)
--consent 尝试对 Consent.exe 下毒
--logonui 尝试对 LogonUI.exe 下毒
--rdcman 尝试对 RDCMan.exe 下毒
--rdcman-poison-hkcr 不毒化所有当前登录用户的 HKCU 配置单元,而是毒化 RDCMan 的 HKCR 配置单元,这将适用于当前未登录的用户 (默认: False)
--mobaxterm 尝试对 MobaXTerm.exe 下毒
--mobaxterm-poison-hkcr
不毒化所有当前登录用户的 HKCU 配置单元,而是毒化 MobaXTerm 的 HKCR 配置单元,这将适用于当前未登录的用户 (默认: False)
--all 尝试对所有应用程序下毒
对于命令行参数中指定的每个应用程序,cleanup 首先移除强制目标应用程序加载钩子库的下毒工件。然后,尝试删除上传到远程主机的库。
对于支持同时毒化 HKCU 和 HKCR 配置单元的应用程序,无论使用哪种,都会清理两者。
可以同时指定多个应用程序,或者使用 --all 标志来清理所有应用程序。
它不会清理远程主机上提取的凭据。
[!IMPORTANT] 如果在运行
cleanup模块时目标应用程序正在使用,则无法删除放置在目标上的 DLL。尽管如此,cleanup模块将恢复启用注入的配置,这应该能确保下次启动应用程序时不执行注入。ThievingFox 无法删除的文件会被记录。
$ python3 client/ThievingFox.py cleanup -h
usage: ThievingFox.py cleanup [-h] [-hashes HASHES] [-aesKey AESKEY] [-k] [-dc-ip DC_IP] [-no-pass] [--tempdir TEMPDIR] [--keepass] [--keepass-share KEEPASS_SHARE]
[--keepass-path KEEPASS_PATH] [--keepassxc] [--keepassxc-path KEEPASSXC_PATH] [--keepassxc-share KEEPASSXC_SHARE] [--mstsc] [--consent] [--logonui]
[--rdcman] [--mobaxterm] [--all]
target
positional arguments:
target 目标机器或范围 [domain/]username[:password]@<IP or FQDN>[/CIDR]
options:
-h, --help 显示此帮助信息并退出
-hashes HASHES, --hashes HASHES
LM:NT hash
-aesKey AESKEY, --aesKey AESKEY
用于 Kerberos 身份验证的 AES 密钥
-k 使用 Kerberos 身份验证。对于 LogonUI、mstsc 和 consent 模块,将执行匿名 NTLM 身份验证以获取操作系统版本。
-dc-ip DC_IP, --dc-ip DC_IP
域控制器的 IP 地址
-no-pass, --no-pass 不提示输入密码
--tempdir TEMPDIR 用于 DLL 和输出的临时目录名称 (默认: ThievingFox)
--keepass 尝试清理所有与 KeePass.exe 相关的下毒工件
--keepass-share KEEPASS_SHARE
KeePass 所在的共享 (默认: c$)
--keepass-path KEEPASS_PATH
KeePass 的安装路径,不包含共享名称 (默认: /Program Files/KeePass Password Safe 2/)
--keepassxc 尝试清理所有与 KeePassXC.exe 相关的下毒工件
--keepassxc-path KEEPASSXC_PATH
KeePassXC 的安装路径,不包含共享名称 (默认: /Program Files/KeePassXC/)
--keepassxc-share KEEPASSXC_SHARE
KeePassXC 所在的共享 (默认: c$)
--mstsc 尝试清理所有与 mstsc.exe 相关的下毒工件
--consent 尝试清理所有与 Consent.exe 相关的下毒工件
--logonui 尝试清理所有与 LogonUI.exe 相关的下毒工件
--rdcman 尝试清理所有与 RDCMan.exe 相关的下毒工件
--mobaxterm 尝试清理所有与 MobaXTerm.exe 相关的下毒工件
--all 尝试清理所有应用程序相关的下毒工件
对于命令行参数中指定的每个应用程序,collect 模块检索远程主机上 C:\Windows\Temp\<tempdir> 目录下对应应用程序的输出文件,并对它们进行解密。文件会从远程主机删除,检索到的数据存储在 client/output/ 中。
可以同时指定多个应用程序,或者使用 --all 标志来收集所有应用程序的日志。
$ python3 client/ThievingFox.py collect -h
usage: ThievingFox.py collect [-h] [-hashes HASHES] [-aesKey AESKEY] [-k] [-dc-ip DC_IP] [-no-pass] [--tempdir TEMPDIR] [--keepass] [--keepassxc] [--mstsc] [--consent]
[--logonui] [--rdcman] [--mobaxterm] [--all]
target
positional arguments:
target 目标机器或范围 [domain/]username[:password]@<IP or FQDN>[/CIDR]
options:
-h, --help 显示此帮助信息并退出
-hashes HASHES, --hashes HASHES
LM:NT hash
-aesKey AESKEY, --aesKey AESKEY
用于 Kerberos 身份验证的 AES 密钥
-k 使用 Kerberos 身份验证。对于 LogonUI、mstsc 和 consent 模块,将执行匿名 NTLM 身份验证以获取操作系统版本。
-dc-ip DC_IP, --dc-ip DC_IP
域控制器的 IP 地址
-no-pass, --no-pass 不提示输入密码
--tempdir TEMPDIR 用于 DLL 和输出的临时目录名称 (默认: ThievingFox)
--keepass 收集 KeePass.exe 日志
--keepassxc 收集 KeePassXC.exe 日志
--mstsc 收集 mstsc.exe 日志
--consent 收集 Consent.exe 日志
--logonui 收集 LogonUI.exe 日志
--rdcman 收集 RDCMan.exe 日志
--mobaxterm 收集 MobaXTerm.exe 日志
--all 收集所有应用程序的日志
| 应用程序 | 注入方法 |
|---|
| KeePass.exe | AppDomainManager 注入 |
| KeePassXC.exe | DLL 代理 |
| LogonUI.exe (Windows 登录界面) | COM 劫持 |
| consent.exe (Windows UAC 弹窗) | COM 劫持 |
| mstsc.exe (Windows 默认 RDP 客户端) | COM 劫持 |
| RDCMan.exe (Sysinternals 的 RDP 客户端) | COM 劫持 |
| MobaXTerm.exe (第三方 RDP 客户端) | COM 劫持 |