Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

$
0
0
【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

2017-08-10 10:53:11

阅读:803次
点赞(0)
收藏
来源: mediaservice.net





【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

作者:for_while





【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

译者:for_while

预估稿费:150RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


Java反序列化漏洞简介

Java序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中,Java中的ObjectOutputStream类的writeObject()方法可以实现序列化。

Java反序列化即逆过程,由字节流还原成对象。ObjectInputStream类的readObject()方法用于反序列化。

因此要利用Java反序列化漏洞,需要在进行反序列化的地方传入攻击者的序列化代码。如果Java应用对用户输入,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行。

下面结合一些demo介绍一款用于检测和简单利用java反序列化漏洞的burpsuite扩展:Java Deserialization Scanner。


插件安装

该插件可以在 burp Suite 的 BApp Store 中安装 , 安装好后需要配置ysoserial(一款java反序列化漏洞payload生成器) 的路径。


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

你可以自己从github上下载源码,编译。或者使用我刚编译的:https://pan.baidu.com/s/1eSxPPQi 密码:nxv4. 放到burpsuite.jar同一目录,然后填上文件名即可(如上图所示)。


插件测试

插件作者很贴心,不仅写了个这么棒的插件,还附带了很多示例。我以sampleCommonsCollections3 为例介绍该插件的使用。首先在tomcat中把 这个war包部署好。然后就可以在webapps\sampleCommonsCollections3下查看对应源码和他使用的库,该插件检测反序列化漏洞就是基于一些已知库中的gadget(依赖于 ysoserial),进行检测。进入webapps\sampleCommonsCollections3会看到


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

访问http://localhost:8008/sampleCommonsCollections3/就可以看到示例的首页了(端口根据自己的情况修改,我这是 8008)。


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner
这些示例根据实际代码中对传输序列化对象的各种方式进行了模拟(直接传输,hex编码传输,base64编码传输,gzip压缩传输,以及他们的一些组合)。插件也根据这些传输方案给出了对应的解决办法。

对未编码的序列化对象测试

先来看看 最简单 的testRawBody.jsp

<html> <head> <title>JavaDeserializationTestingJSPPage</title> </head> <bodybgcolor=white> <h1>JavaDeserializationTestingJSPPage</h1> <p>ThisistheoutputofaJSPpagethatdeserializeanobjectsentasPOSTbody.</p> <%@pageimport="java.io.ObjectInputStream"%> <%@pageimport="java.io.InputStream"%> <%@pageimport="java.io.ByteArrayInputStream"%> <% ObjectInputStreamobjectInputStream=newObjectInputStream(request.getInputStream()); StringdeserializedString=(String)objectInputStream.readObject(); out.println("<p>Deserializedstring:</p>"); out.println("<p>"+deserializedString+"</p>"); %> </body> </html>

直接对POST过来的数据进行了 反序列化, 下面看看它的库, 进入WEB-INF\lib 目录,


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

存在commons-collections-3.1.jar这个库是有利用反序列化漏洞所需要的漏洞类的。下面用插件来试试。浏览器进入sampleCommonsCollections3/,burpsuite抓包,点击第一个Serialized Java Object in body(不编码直接发送序列化对象到服务端)。


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

然后右键把请求包发送到 插件中


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

设置好测试的位置


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

最下面的一排,表示选中的数据是以什么格式编码的, 倒数第2排的那个下拉框,选择判断漏洞是否存在使用的方式,有 DNS(依赖于burpsuite的Collaborator功能来获取响应), Sleep (如果有漏洞让服务器sleep 几秒钟), 还有 cpu模式。这里选择 Sleep模式,然后 点击Attack(因为这里的序列化对象没有被编码),等一阵就有结果了。


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

可以看到,检测出Apache Commons Collections 3 漏洞。然后右键,


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

在Exploitation tab在确认下,下面那个输入框下 输入 ysoserial的参数, 这里检测出了Apache Commons Collections 3,所以使用CommonsCollections3 COMMAD。如下图所示:


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

上面会在服务器下执行 calc , 弹出一个计算器。


下面再以 gzip 为例对编码过的序列化对象测试

看看代码webapps\sampleCommonsCollections3\testGzipBody.jsp:

<html> <head> <title>JavaDeserializationTestingJSPPage</title> </head> <bodybgcolor=white> <h1>JavaDeserializationTestingJSPPage</h1> <p>ThisistheoutputofaJSPpagethatdeserializeacompressedGZIPobjectsentasPOSTbody.</p> <%@pageimport="java.io.ObjectInputStream"%> <%@pageimport="java.io.InputStream"%> <%@pageimport="java.io.ByteArrayInputStream"%> <%@pageimport="java.io.ByteArrayOutputStream"%> <%@pageimport="java.io.ByteArrayInputStream"%> <%@pageimport="java.util.zip.GZIPInputStream"%> <%@pageimport="java.util.Map"%> <% GZIPInputStreamgzis=newGZIPInputStream(request.getInputStream()); byte[]buffer=newbyte[1024]; java.io.ByteArrayOutputStreambyteout=newjava.io.ByteArrayOutputStream(); intlen; while((len=gzis.read(buffer))>0){ byteout.write(buffer,0,len); } byte[]uncompressed=byteout.toByteArray(); ByteArrayInputStreambais=newByteArrayInputStream(uncompressed); ObjectInputStreamobjectInputStream=newObjectInputStream(bais); StringdeserializedString=(String)objectInputStream.readObject(); out.println("<p>Deserializedstring:</p>"); out.println("<p>"+deserializedString+"</p>"); %> </body> </html>

对数据gzip解压,然后反序列化。

在首页中点击Serialized Java Object in body, compressed in GZIP, burp 抓包


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner

下面的一个问题是我们怎么这个这东西就是 序列化对象的数据呢? java 序列化对象的开头 2个字节为0xaced, 所以我们看到数据开头为0xaced,就可以大致推测这是序列化的对象。下面在介绍一个Decompressor插件,它用于自动的把gzip压缩的数据解压。该插件也可在BApp Store中安装。安装后,在抓到的数据包中的数据是以gzip压缩时,会增加一个tab来显示解压后的数据。


【技术分享】Burp Suite扩展之Java-Deserialization-Scanner
所以这是以 gzip压缩的 序列化对象 ,然后将它发送到Java-Deserialization-Scanner插件, 点击Attack Gzip即可(其他设置和之前那个例子一样)。

总结

该插件使得我们发现和测试 Java 反序列化漏洞更加容易,而且他还提供了几种针对序列化数据被编码的场景进行利用的方式,同时由于该插件是开源的,所以很方便测试人员在测试时根据情况进行扩展。


参考

http://blog.nsfocus.net/java-deserialization-vulnerability-comments/

https://github.com/federicodotta/Java-Deserialization-Scanner

https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/



【技术分享】Burp Suite扩展之Java-Deserialization-Scanner
【技术分享】Burp Suite扩展之Java-Deserialization-Scanner
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/

Viewing all articles
Browse latest Browse all 12749

Latest Images

Trending Articles





Latest Images