手工打造Windows下编译的免杀Payload

Veil对Payload的免杀已经做的很好了,最新的Veil有39个可用的Payload。但是有时候需要使用Windows来完成所有的渗透测试工 作,Linux和Windows切换来切换去很不方便、让我的渣本安装个虚拟机更是浪费资源。因此,在Windows下生成免杀Payload已成为当务 之急。

一开始我选择了在Kali下使用Veil生成Python版的Payload然后再到windows下使用Py2exe或是pyinstaller来编译打包生成可执行文件。但是这种方法让我感到无比蛋疼……

第一:Py2exe不支持64位的python(我的系统中已经安装了python 2.7 X64以及各种python的开发工具,卸载了再安装、配置是一件令人头痛的事);

第二:pyinstaller虽然支持使用64位的python打包,但是打包出来的程序也是64位的(这让32位的系统情何以堪);第三:编译打包后的Payload奇大无比(大约3-7MB)
0.jpg
打包时可以选择生成一个文件(所有运行所须的库及dll都打包到exe中),也可以选择生成多个文件(Payload和所需的库分开。Payload大约1M多,剩下的十几个文件又让人感到头痛,难道让我一个一个上传不成)。最后虽然用这种方法获得了免杀的Payload,但是还是不得不放弃这种方法。

3.jpg

既然无捷径可走了,那还是静下心来去翻一翻Veil吧。下载Veil,在Veil根目录下的\modules\payloads文件件中看到了生成各种免杀Payload的.py文件。共7类:

先从比较熟悉的“c”看起吧,在\modules\payloads\c\meterpreter\下有4个用来生成c代码的py文件。

打开rev_http.py查看:

可以看到generate()最终返回了混淆后的c代码,在生成的过程中LHOST和LPORT(默认8080)由用户定义(上面代码加粗的部分)。
c代码中几乎所有的变量都使用helpers.randomString()来随机生成,代码中的整型数字则使helpers.obfuscateNum()来进行混淆(例如:5会写成2*2+1或是5*1+0)。
通过还原变量名称、整理代码,最终我得到了c_rev_http的源码。
1.jpg
整理后:

因上面的代码是使用GNU/GCC来编译的,所以在windows下直接使用vc6编译会报一大堆错误。没办法,拿起大学时代那本《C语言程序设计与应用教程》回顾了半天,修改代码,最终通过编译。
2.jpg
编译后体积185kb(可加壳缩小体积),虽然比metasploit生成的要大,但已经满足要求。
使用同样的方法,依次还原了c_rev_http_service、c_rev_tcp、c_rev_tcp_service、cs_rev_http、cs_rev_https、cs_rev_tcp的源码(powershell和ruby的还没有看)。
编译生成对应的payload比较一下体积并测试免杀和连接效果:
体积对比:
5.jpg

可见C#代码编译后的Payload更小,竟然只有5kb…… cs_rev_tcp使用了三个不同版本的.NET csc编译。
免杀效果:(360安全卫士最新木马库查杀)
6.jpg
7.jpg
连接测试:

c_rev_tcp

7.jpg

c_rev_http

8.jpg

cs_rev_tcp

9.jpg

cs_rev_http

10.jpg

cs_rev_https

11.jpg
想在windows上获得msf免杀payload的同学赶快行动起来吧!

[via@wooyun zone]