第18节 神级开源shellcode工具:donut

我做了一个关于shellcode入门和开发的专题👩🏻‍💻,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考。

我的个人主页:https://imbyter.com

目录

一、Donut是什么​

 二、Donut的特点​

三、功能参数解读​

四、Donut的编译​

1. 将CMD设置为VS的x86编译环境变量​

2. 编译源码获得loader_exe_x86.h文件​

五、将CMD设置为VS的x64编译环境变量​

编译源码获得最终文件​

六、功能场景测试​

1. 将原生exe转为shellcode​

2. 将原生dll转为shellcode​

3. 将.net exe转为shellcode​

4. 将.net dll转为shellcode​

5. 远程加载shellcode​

6. 将vbs/js/xsl转为shellcode​

7. shellcode加载器​

七、集成开发​

如何使用donut.dll文件​

八、存在问题​

1. 不支持转换的情况​

2. 兼容性存在的问题​

九、代码附件​

对4.1测试exe源码​

对4.2测试dll源码​

对4.3测试.net exe源码​

对4.4测试.net dll源码​

对4.7shellcode加载器源码​

十、参考资料​


一、Donut是什么​

Donut是一款shellcode生成器,可将C/C++、C#生成的PE文件转换为shellcode文件,同时支持JS、XSL、VBS脚本转换为shellcode。 Donut生成的shellcode可以从HTTP服务器上加载,也可以从本地加载。生成的shellcode模块支持128位比特随机密钥加密,支持压缩解压且支持AMSI与WLDP的Bypass。

 二、Donut的特点​

  1. 对目标文件转换为shellcode的过程中,支持数据压缩,包括aPLib、LZNT1、Xpress,,以及Xpress Huffman等五种算法。
  2. 使用通过函数字符串的hash值来定位API地址。
  3. 支持128位密钥对称加密。
  4. 支持对Windows的AMSI接口和WLDP策略的规避。
  5. 支持PE文件参数传入。
  6. 能够避免退出函数对主线程的强制退出行为(Patching exit-related API to avoid termination of host process)。
  7. 支持多种输出格式,包括C语言、Ruby、Python、Powershell、Base64、C#以及16进制格式。
  8. 支持静态库与动态库的生成,方便集成到第三方项目中。

三、功能参数解读​

在命令行中直接输入 donut.exe 回车即可查看 donut 所支持的功能参数,如下:

选项说明描述
-n<name>HTTP服 务 器 加 载 模 式 下 的 模 块 名 , 如 果 启 用 熵 等 级 , 则 模 块 名 随 机 。
-s<server>在 HTTP服 务 器 中 用 来 存 储 模 块 的 URL地 址 。
-e<level>熵 等 级 : 1=无 , 2=随 机 名 , 3=随 机 名 +加 密 ( 默 认 ) 。
-a<arch>目 标 构 架 : 1=x86, 2=amd64, 3=x86+amd64( 默 认 ) 。
-b<level>绕 过 AMSI/WLDP: 1=不 启 用 ( 默 认 ) , 2=启 用 , 失 败 则 终 止 , 3=启 用 , 失 败 仍 继 续 。
-o<path>保 存 文 件 名 ( 含 路 径 ) , 默 认 是 "shellcode.bin"。
-f<format>输 出 格 式 : 1=Binary (默 认 ), 2=Base64, 3=C, 4=Ruby, 5=Python, 6=Powershell, 7=C#, 8=Hex。
-y<addr>为 加 载 器 创 建 线 程 , 并 在 提 供 地 址 处 继 续 执 行 。
-x<action>退 出 : 1=退 出 线 程 ( 默 认 ) , 2=退 出 进 程 。
-c<namespace.class>选 类 名 ( .NET DLL需 要 ) 。
-d<name>为 .NET程 序 集 创 建 的 AppDomain名 称 。 如 果 启 用 了 熵 , 则 会 随 机 产 生 。
-m`<methodapi>`
-p<arguments>DDL或 EXE的 可 选 参 数 或 命 令 行 ( 需 要 用 双 引 号 包 含 ) 。
-w传 递 给 标 准 动 态 链 接 库 DLL( 非 .Net DLL) 函 数 Unicode编 码 的 参 数 ( 默 认 是 ANSI) 。
-r<version>CLR运 行 时 版 本 , 默 认 使 用 MetaHeader, 如 果 没 有 则 使 用 v4.0.30319。
-t将 标 准 的 EXE( 非 托 管 ) 入 口 点 作 为 线 程 执 行 。
-z<engine>打 包 /压 缩 文 件 : 1=None, 2=aPLib( 默 认 ) , 3=LZNT1, 4=Xpress, 5=Xpress Huffman。

本文使用的donut汉化版执行时,默认使用参数:

-a 3 -b 1 -e 3 -f 1 -x 1 -z 2 -o "shellcode.bin"

四、Donut的编译​

在Windows下使用Microsoft Visual Studio进行编译:

1. 将CMD设置为VS的x86编译环境变量​

将CMD切换到D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build目录(各个VS版本路径有所不同),执行vcvar32.bat。

2. 编译源码获得loader_exe_x86.h文件​

  1. 将CMD切换到到donut根目录,执行nmake donut -f Makefile.msvc。
  2. 得到 loader_exe_x86.h,错误忽略。

五、将CMD设置为VS的x64编译环境变量​

新打开CMD切换到D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build目录(各个VS版本路径有所不同),执行vcvar64.bat。

编译源码获得最终文件​

  1. 将CMD切换到到donut目录,执行nmake donut -f Makefile.msvc。
  2. 得到 donut.exe、lib\donut.dll,以及lib\donut.lib文件。

六、功能场景测试​

以下“原生”EXE/DLL指非托管PE文件(包括并不限于C/C++、delphie等编写生成的可执行文件),可以直接由系统加载运行,区别于.Net生成的托管文件。

1. 将原生exe转为shellcode​

测试程序cexe.exe源代码见文末代码附件。

  1. 不带参数的exe文件转换为shellcode,直接执行:donut.exe cexe.exe

    • 实例类型:嵌入 表示原文件cexe.exe被嵌入到生成的shellcode内部了。

    • 模块文件:"cexe.exe" 表示要处理的目标文件是cexe.xe。

    • 熵:随机 + 加密 表示cexe.exe被转为shellcode时使用了随机密钥加密方式。我们可以对同一个cexe.exe连续进行两次处理,然后对比前后生成的两个文件,会发现两个文件数据并不一样。也就是说如果启用了熵的随机加密参数,那么每次生成的shellcode文件均不一样,在对于抗分析与免杀对抗有一定效果。使用“Beyond Compare”比较二文件效果(红色区域表示不同之处):

  2. 带参数的exe转换为shellcode,执行:donut.exe CExe64.exe -p "参数1 参数2"参数:参数1 参数2 表示对CExe64.exe文件传入了两个参数,一个是“参数1”,一个是“参数2”。 如果一个参数中有空格,则以"来包含,比如: > donut.exe CExe64.exe -p "\"参数1第一部分 参数1第二部分\" 参数2 参数3"

2. 将原生dll转为shellcode​

  1. 无导出函数的dll转为shellcode

    donut.exe CDll64.dll

  2. 有导出函数的dll转为shellcode

    donut.exe CDll.dll -m fun

    • -m fun:表示执行dll的导出函数fun

    • 函数:fun 表示生成的shellcode会调用dll的导出函数fun。

3. 将.net exe转为shellcode​

donut.exe后面直接跟要转的.net exe即可:donut.exe DotNet.exe

4. 将.net dll转为shellcode​

donut.exe DotDLl.dll -c TestClass -m RunProcess -p "calc notepad"

  • -c TestClass:表示该程序类名为TestClass;
  • -m RunProcess:表示该程序入口函数为RunProcess;
  • -p "calc notepad":表示传递了两个参数,一个calc,一个notepad;

5. 远程加载shellcode​

donut支持从远程HTTP服务器获取shellcode并执行:donut.exe CExe32.exe -n a.php -s http://192.168.1.22

  • -n a.php:表示生成放在HTTP服务器上的shellcode文件名为a.php;
  • -s http://192.168.1.22:表示本地运行"加载器shellcode"(即shellcode.bin)时,会从该URL获取a.php;
  • 模块名称:a.php CEexe32.exe转换的shellcode文件,需要放在http://192.168.1.22的根目录。
  • 上传到:http://192.168.1.22 a.php需要放置的URL路径。
  • shellcode:“shellcode.bin” 注意,此处生成的shellcode.bin并非包含CExe32.exe的shellcode,而是donut自带的用于从HTTP服务器下载并执行shellcode的功能模块。

6. 将vbs/js/xsl转为shellcode​

  1. 将如下demo.vbs转为shellcode:donut.exe demo.vbs

    demo.vbs源码:

    rem 获取主机名
    Const HKEY_LOCAL_MACHINE = &H80000002
    strRegKey = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"
    Set objReg = GetObject( "winmgmts:{impersonationLevel=impersonate}!//./root/default:StdRegProv" )
    objReg.GetStringValue HKEY_LOCAL_MACHINE, strRegKey, "Hostname", strHostnamerem 获取系统版本
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
    For Each objOperatingSystem in colOperatingSystems
    Msgbox  "OS: " & objOperatingSystem.Caption & " " & objOperatingSystem.Version & chr(13) & "Host Name: " & strHostName
    Next
  2. 将如下demo.js转为shellcode:donut.exe demo.js

    demo.js源码:

    var a = new ActiveXObject("WScript.Shell");
    // 弹框提示1秒自动关闭
    a.popup('Hello, imbyter.com',1,'title',0+64);
    // 打开记事本
    a.Run("cmd.exe /c notepad.exe",0,true)

7. shellcode加载器​

以上各种类型文件转为shellcode后,直接使用shellcode加载器(代码见下文)调用执行即可:

> LoadShellcode32.exe shellcode.bin

> LoadShellcode64.exe shellcode.bin

被处理exe/dll为32位程序,则需要用32为的shellcode加载器启用,exe/dll为64位的就用64位shellcode加载器启用。

七、集成开发​

如何使用donut.dll文件​

  1. 新建工程,将donut.h和donut.lib放到工程目录下:
  2. 如下代码:
    #include "donut.h"#pragma comment(lib,"donut")int main()
    {DONUT_CONFIG dc;memset(&dc, 0, sizeof(DONUT_CONFIG));dc.arch         = DONUT_ARCH_X84;dc.bypass       = DONUT_BYPASS_NONE;dc.compress     = DONUT_COMPRESS_NONE; dc.exit_opt     = DONUT_OPT_EXIT_THREAD;dc.format       = DONUT_FORMAT_BINARY;dc.inst_type    = DONUT_INSTANCE_EMBED;dc.entropy      = DONUT_ENTROPY_DEFAULT;lstrcatA(dc.input, "CExe.exe");         // 目标文件lstrcatA(dc.output, "shellcode.bin");   // 生成文件int err = DonutCreate(&dc);return puts(DonutError(err));
    }
    结构体DONUT_CONFIG中的参数的宏定义,均可通过donut.h文件查看。
  3. 将编译后生成的exe和donut.dll放在同一个目录下,运行exe,即可得到shellcode.bin文件。

八、存在问题​

1. 不支持转换的情况​

能转换的标准exe/dll的PE结构中必须含有重定位表(.reloc),不含重定位表的不能转换,会有如下提示:

2. 兼容性存在的问题​

  1. 实测donut对部分带界面(Desktop Application)的exe支持并不友好;

  2. 对存在dll导出函数需要参数传递的时候,只能传递一个参数;

九、代码附件​

对4.1测试exe源码​

#include <stdio.h>
#include <windows.h>
int main(int argc, char* argv[])
{if (argc == 3){// 额外有两个参数传入时MessageBoxA(NULL, argv[1], argv[2], MB_OK);}else{// 只有一个或者没有额外参数传入时MessageBoxA(NULL, "Hello, imbyter.com", "tip", MB_OK);}return 0;
}

对4.2测试dll源码​

#include <stdio.h>
#include <windows.h>extern "C" __declspec(dllexport) void __stdcall fun()
{MessageBoxA(NULL, "Hello, imbyter.com", "tip", MB_OK);
}BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:MessageBox(NULL, L"DllMan测试", L"提示", MB_OK);case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

对4.3测试.net exe源码​

using System;
using System.Windows;namespace DotNet
{internal class Program{static void Main(string[] args){MessageBox.Show("Hello, imbyter.com");}}
}

对4.4测试.net dll源码​

using System.Diagnostics;public class TestClass
{public static void RunProcess(string path, string path2){Process.Start(path);Process.Start(path2);}
}

对4.7shellcode加载器源码​

#include <stdio.h>
#include <windows.h>int main(int argc, char* argv[])
{if (argc == 2){HANDLE hSCFile = CreateFileA(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);if (hSCFile == INVALID_HANDLE_VALUE){return 0;}DWORD dwHighSize = 0;DWORD dwFileSize = GetFileSize(hSCFile, &dwHighSize);DWORD flOldProtect;DWORD dwAlreadyRead = 0;DWORD dwReadSum = 0;LPVOID g_pShellcode = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwFileSize);VirtualProtect(g_pShellcode, dwFileSize, PAGE_EXECUTE_READWRITE, &flOldProtect);ReadFile(hSCFile, (char*)g_pShellcode, dwFileSize, &dwAlreadyRead, NULL);CloseHandle(hSCFile);/* 以下方式调用shellcode用仅支持x86版本_asm{pushadcall g_pShellcodepopad}*//* 以下方式调用shellcode能够x86和x64通用 */typedef void (*FN_Shellcode)();FN_Shellcode fn_Shellcode = (FN_Shellcode)g_pShellcode;fn_Shellcode();puts("the shellcode operation is successful!");system("pause");}else{puts("e.g: TestShellcode.exe <shellcode file path>");system("pause");}
}

十、参考资料​

  • GitHub - TheWover/donut: Generates x86, x64, or AMD64+x86 position-independent shellcode that loads .NET Assemblies, PE files, and other Windows payloads from memory and runs them with parameters
  • Donut - Injecting .NET Assemblies as Shellcode – The Wover – Red Teaming, .NET, and random computing topics
  • Donut:将.NET程序集注入Windows进程 - FreeBuf网络安全行业门户

如果有任何问题,欢迎在我们的知识社群『imbyter代码酷』中提问。

图片

一个人走得再快,不如一群人走得更远!🤜🤛


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python创建新环境并安装pytorch

python创建新环境并安装pytorch 一、创建新环境1、准备工作2、创建虚拟环境并命名3、激活虚拟环境 二、安装pytorch1、pytorch官网2、选择与你的系统相对应的版本3、安装成功 一、创建新环境 1、准备工作 本次创建的环境是在anaconda环境下&#xff0c;否则需要在纯净环境下创…

AutoNeRF:Training Implicit Scene Representations with Autonomous Agents

论文概述 《AutoNeRF》是由Pierre Marza等人撰写的一篇研究论文&#xff0c;旨在通过自主智能体收集数据来训练隐式场景表示&#xff08;如神经辐射场&#xff0c;NeRF&#xff09;。传统的NeRF训练通常需要人为的数据收集&#xff0c;而AutoNeRF则提出了一种使用自主智能体高效…

Spring Boot | Spring Boot 中 自定义“用户退出控制“、获取“登录用户信息“

目录: 一、SpringBoot 中 自定义 "用户授权管理" ( 总体内容介绍 ) :二、 自定义 "用户退出控制" ( 通过 "HttpSecurity类" 的 logout( )方法来实现 "自定义用户用户登录控制" ) :1.基础项目文件准备2.实现 "自定义身份认证"…

springboot005学生心理咨询评估系统

springboot005学生心理咨询评估系统 亲测完美运行带论文&#xff1a;获取源码&#xff0c;私信评论或者v:niliuapp 运行视频 包含的文件列表&#xff08;含论文&#xff09; 数据库脚本&#xff1a;db.sql其他文件&#xff1a;ppt.ppt论文&#xff1a;开题.doc论文&#xf…

WT99C262-SG LoRa开发板使用教程

WT99C262-SG模块是全新一代的Wi-FiBLELoRa无线扩频模块&#xff0c;基于启明云端WTLRC262-SG系列模组设计开发的新一代LoRa扩频芯片方案设计的无线串口模块。具有多种传输方式&#xff0c;LoRa扩频技术&#xff0c;且模组大部分管脚均已引出至两侧排针&#xff0c;开发人员可根…

爬虫界的“闪电侠”:异步爬虫与分布式系统的实战秘籍

Hi&#xff0c;我是阿佑&#xff0c;前文给大家讲了&#xff0c;如何做一个合法“采蜜”的蜜蜂&#xff0c;有了这么个自保的能力后&#xff0c;阿佑今天就将和大家踏入 —— 异步爬虫 的大门&#xff01; 异步爬虫大法 1. 引言1.1 爬虫框架的价值&#xff1a;效率与复杂度管理…

卷轴分红商城模式:适用于多种的商业营销模式

卷轴分红商城模式是一种基于区块链技术的去中心化积分商城系统&#xff0c;通过智能合约和数字资产分红实现积分流通和价值回馈&#xff0c;适用于多种场景。 什么是卷轴分红商城模式&#xff1a; 这是一个去中心化的积分商城系统&#xff0c;消费者在商城消费时&#xff0c;可…

番外篇 | 一文读懂卷积神经网络(CNN)的基础概念及原理

前言:Hello大家好,我是小哥谈。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。本文旨在对卷积神经网络进行详细的讲解,从基本原理到实际应用,帮助读者全面了解CNN的工作原理、优势和基本组成等,以及其在现实生…

异步编程CompletableFuture总结

文章目录 1. 简介&#xff1a;2. 比较1、传统方式2、使用CompletableFuture&#xff1a;异步执行返回值 3、组合处理&#xff1a;anyOfallof : 4. 异步回调&#xff1a;thenAcceptthenApplywhenComplete等同于 thenAccepthandel()等同于thenApply 5. 常用方法&#xff1a;1、su…

Python——IO编程

IO在计算机中指Input/Output&#xff0c;也就是输入和输出。由于程序和运行时数据是在内存中驻留&#xff0c;由CPU这个超快的计算核心来执行&#xff0c;涉及到数据交换的地方&#xff0c;通常是磁盘、网络等&#xff0c;就需要IO接口。 比如你打开浏览器&#xff0c;访问新浪…

Linux查看进程命令ps和top

Linux 是一种自由和开放源代码的操作系统&#xff0c;它的使用在全球范围内非常广泛。在 Linux 中&#xff0c;进程是操作系统中最重要的组成部分之一&#xff0c;它代表了正在运行的程序。了解如何查看正在运行的进程是非常重要的&#xff0c;因为它可以帮助你了解系统的运行状…

Python 白底黑字图片去除红色水印

Python 白底黑字图片去除红色水印 import os from PIL import Imagedef remove_color(image_path, new_image_path):"""初始化:param image_path: 图片路径:param new_image_path: 新图片路径"""# 打开图片并转换为RGBA格式img Image.open(imag…

java入门1.1.2

前言&#xff1a; 第一&#xff1a;一坨垃圾的迭代&#xff0c;还是垃圾 第二&#xff1a;本内容为对类&#xff0c;对象&#xff0c;构造函数的最新抽象理解 正片 先将类&#xff0c;对象&#xff0c;还要构造函数翻译成英文 class&#xff0c;object&#xff0c;construc…

汇中 SCL-61D2超声水表汇中通讯协议

RS-485串行通讯接口设置表 通用代码注释 读取正向仪表数据 DD的内容为 通讯示例 主机命令&#xff1a;2A 41 4A 仪表响应&#xff1a;26 41 4A 00 00 13 63 00 00 07 72 00 00 10 34 00 33 读取负向仪表数据&#xff1a;&#xff08;单向型仪表无此命令&#xff09; DD的内容…

selenium发展史

Selenium Core 2004 年&#xff0c;Thoughtworks 的工程师 Jason Huggins 正在负责一个 Web 应用的测试工作&#xff0c;由于这个项目需要频繁回归&#xff0c;这导致他不得不每天做着重复且低效的工作。为了解决这个困境&#xff0c;Jason 开发了一个运行在 JavaScript 沙箱中…

2010-2024年各地级市社会信用体系建设匹配DID数据

2010-2024年各地级市社会信用体系建设匹配DID数据 1、时间&#xff1a;2010-2024年 2、指标&#xff1a;行政区划代码、年份、所属省份、地区、社会信用体系建设示范区 3、范围&#xff1a;310个地级市 4、来源&#xff1a;国家发改委 5、指标解释&#xff1a; 社会信用体…

跨平台应用开发进阶(五十四)cordova自定义插件

文章目录 一、前言二、cordova 自定义插件2.1 cordova 安装2.2 cordova 创建 android 工程2.3 使用 cordova 官方提供的插件2.4 创建自定义插件 三、拓展阅读 一、前言 在前期博文《ReactNative进阶&#xff08;一&#xff09;&#xff1a;ReactNative 学习资料汇总》中&#…

C++基础与函数解析 | 函数的声明与定义 | 函数调用 | 函数详解 | 函数重载 | 重载解析 | 递归函数 | 内联函数 | 函数指针

文章目录 一、函数基础1.基本函数定义2.函数的声明与定义3.函数调用 二、函数详解1.参数2.函数体3.返回类型 三、函数重载与重载解析1.函数重载2.重载解析 四、函数相关的其他内容1.递归函数2.内联函数3.constexpr函数&#xff08;C11起&#xff09;4.consteval 函数 (C20 起 )…

Redis - hiredis源码安装和接口使用介绍

一、hiredis源码安装说明 本文创作基于 hiredisv1.2.0版本 1.简介 hiredis是一个用于与Redis交互的C语言客户端库。它提供了一组简单易用的API&#xff0c;使开发人员可以轻松地连接到Redis服务器&#xff0c;并执行各种操作&#xff0c;如设置和获取键值对、执行命令、订阅和…

C语言 | Leetcode C语言题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; struct ListNode *reverseBetween(struct ListNode *head, int left, int right) {// 因为头节点有可能发生变化&#xff0c;使用虚拟头节点可以避免复杂的分类讨论struct ListNode *dummyNode malloc(sizeof(struct ListNode));dummyNode…