点击蓝字 关注我们
免责声明
本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。
如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。
文中所涉及的技术、思路及工具等相关知识仅供安全为目的的学习使用,任何人不得将其应用于非法用途及盈利等目的,间接使用文章中的任何工具、思路及技术,我方对于由此引起的法律后果概不负责。
🌟简介
生成 x86、x64 或 AMD64+x86 与位置无关的 shellcode,用于从内存中加载 .NET 程序集、PE 文件和其他 Windows 负载,并使用参数运行它们
Donut 是一种与位置无关的代码,支持在内存中执行 VBScript、JScript、EXE、DLL 文件和 dotNET 程序集。由 Donut 创建的模块可以从 HTTP 服务器暂存,也可以直接嵌入到 loader 本身中。该模块可选择使用 Chaskey 分组密码和 128 位随机生成的密钥进行加密。在内存中加载并执行文件后,将擦除原始引用以阻止内存扫描程序。生成器和加载程序支持以下功能:
-
通过 RtlCompressBuffer 使用 aPLib 和 LZNT1、Xpress、Xpress Huffman 压缩输入文件。
-
将熵用于 API 哈希和字符串生成。
-
文件的 128 位对称加密。
-
覆盖本机 PE 标头。
-
将本机 PE 存储在 MEM_IMAGE 内存中。
-
修补反恶意软件扫描接口 (AMSI) 和 Windows 锁定策略 (WLDP)。
-
修补 Windows 事件跟踪 (ETW)。
-
修补 EXE 文件的命令行。
-
修补与 exit 相关的 API 以避免主机进程终止。
-
多种输出格式:C、Ruby、Python、PowerShell、Base64、C#、十六进制和 UUID 字符串。
有适用于 Linux 和 Windows 的动态和静态库,可以集成到您自己的项目中。还有一个 python 模块,您可以在构建和使用 Python 扩展中阅读更多相关信息。
2. 运行
Donut 包含每种受支持文件类型的单个加载程序。对于 dotNET EXE/DLL 程序集,Donut 使用非托管 CLR 托管 API 来加载公共语言运行时。将 CLR 加载到主机进程中后,将创建一个新的应用程序域,以允许在一次性 AppDomain 中运行程序集。当 AppDomain 准备就绪时,将通过 AppDomain.Load_3 方法加载 dotNET 程序集。最后,使用任何其他参数调用 EXE 的入口点或 DLL 的公共方法。有关非托管 CLR 托管 API 的文档,请参阅 MSDN。有关 CLR Host 的独立示例,请参阅此处的代码。
VBScript 和 JScript 文件使用 IActiveScript 接口执行。对 Windows Script Host (wscript/cscript) 提供的某些方法的支持也最低限度。有关独立示例,请参阅此处的代码。有关更详细的描述,请阅读:JavaScript、VBScript、JScript 和 XSL 的内存中执行
非托管或本机 EXE/DLL 文件使用自定义 PE 加载程序执行,并支持延迟导入、TLS 和修补命令行。仅支持包含重定位信息的文件。有关更多信息,请阅读 DLL 的内存中执行。
加载程序可以禁用 AMSI 和 WLDP,以帮助逃避对在内存中执行的恶意文件的检测。有关更多信息,请阅读 Red Teams 如何绕过 .NET 动态代码的 AMSI 和 WLDP。它还支持使用 aPLib 或 RtlDecompressBuffer API 解压缩内存中的文件。有关更多信息,请阅读 数据压缩。
从 v1.0 开始,ETW 也被绕过。与 AMSI/WLDP 一样,这是一个模块化系统,允许您将默认旁路换成自己的旁路。默认旁路源自 XPN 的研究。有关详细信息,请参阅隐藏 .NET - ETW。
默认情况下,加载程序将覆盖非托管 PE 的 PE 标头(从基址到 'IMAGE_OPTIONAL_HEADER。SizeOfHeaders')。如果未使用诱饵模块(模块过载),则 PE 标头将被归零。如果使用诱饵模块,诱饵模块的 PE 标头将用于覆盖负载模块的 PE 标头。这是通过将内存中模块的 PE 标头与磁盘上支持它们的文件进行比较来阻止检测。用户可以要求将所有 PE 标头保留其原始状态。这对于有效负载模块需要访问其 PE 标头的场景(例如,在查找嵌入式 PE 资源时)非常有用。
有关使用生成器的详细演练以及 Donut 如何影响 tradecraft,请阅读 Donut - 将 .NET 程序集作为 Shellcode 注入。有关加载程序的更多信息,请阅读从内存加载 .NET 程序集。
那些希望了解更多关于内部结构的人应该参考 Developer notes。
3. Build
有两种类型的构建。如果您想调试 Donut,请参阅此处的文档。如果没有,请继续阅读发布版本。
克隆
从 Windows 命令提示符或 Linux 终端中,克隆存储库。
git clone http://github.com/thewover/donut.git
下一步取决于您的操作系统以及您决定使用的编译器。目前,Donut 的生成器和加载器模板都可以用 Microsoft Visual Studio 2019 和 MingGW-64 成功编译。要在您自己的 C/C++ 项目中使用这些库,请参阅此处提供的示例。
Windos
要生成加载器模板,动态库donut.dll,静态库 donut.lib 和生成器donut.exe。启动 x64 Microsoft Visual Studio 开发人员命令提示符,切换到克隆 Donut 存储库的目录,然后输入以下内容:
nmake -f Makefile.msvc
要执行相同的操作,除了在 Windows 或 Linux 上使用 MinGW-64 之外,请更改为克隆 Donut 存储库的目录,然后输入以下内容:
make -f Makefile.mingw
Linux
要生成动态库 donut.so,静态库 donut.a 和生成器 donut.切换到克隆 Donut 存储库的目录,然后键入 make。
Python 模块
Donut 可以安装并用作 Python 模块。要从源安装需要 pip for Python3。首先,通过在 Linux 终端或 Microsoft Visual Studio 命令提示符上发出以下命令,确保未安装旧版本的 donut-shellcode。
pip3 uninstall donut-shellcode
确认不再安装旧版本后,发出以下命令。
pip3 install .
您也可以从 PyPi 存储库中获取 Donut 作为 Python 模块进行安装。
pip3 install donut-shellcode
有关更多信息,请参阅构建和使用 Python 扩展。
Docker
构建 Docker 容器。
docker build -t donut .
启动donut。
docker run -it --rm -v "${PWD}:/workdir" donut -h
支持工具
Donut 包括其他几个可以单独构建的可执行文件。这包括 “hash.exe”、“encrypt.exe”、“inject.exe” 和 “inject_local.exe”。前两个用于 shellcode 生成。提供后两个是为了帮助测试 donut shellcode。“inject.exe” 将按其 PID 或进程名称将原始二进制文件 (loader.bin) 注入进程。“inject_local.exe” 会将原始二进制文件注入到自己的进程中。
要单独构建这些支持可执行文件,您可以使用 MSVC makefile。例如,要构建 “inject_local.exe” 来测试您的圆环 shellcode,您可以运行。
nmake inject_local -f Makefile.msvc
项目地址
https://github.com/TheWover/donut
原文始发于微信公众号(SecHub网络安全社区):SGN编码器——最好的Shellcode编码器
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论