Struts2漏洞测试书面报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts2漏洞测试书⾯报告
Struts2 漏洞测试报告
信息化建设处
2016年6⽉15⽇
Struts2 漏洞测试报告
0.前期⼯作准备
前期的⼯作主要围绕以下⼏个⽅⾯进⾏:
分析从2014年以来Struts2官⽅所披露的⼏个⾼危/重要漏洞的版本号、形成的原因、影响的范围以及修复的建议。
了解乌云知识库⾥对相关漏洞原理的分析
对学校218和216⽹段的所有开启“Apache Tomcat/Coyote JSP”服务的IP进⾏扫描,并根据服务器所属的业务,对⽬标
IP进⾏分类处理。
0.1Struts2重要漏洞的类型
纵观2014年以来Struts2官⽅所披露的各种漏洞,归纳起来,主要有3种类型:“classLoader导致特定环境下的DOS漏洞”、“开启DMI导致的远程代码执⾏漏洞”和“使⽤REST插件导致的远程代码执⾏漏洞”。
本次测试根据此3种类型,选取具有代表性的⼏个重要漏洞进⾏分析。
S2-037[1]:2016年6⽉16⽇,乌云漏洞报告平台,报告了⼀份最新的S2-037漏洞(官⽅⽹站仍未正式更新)。
主要原因是使⽤REST插件导致的远程代码执⾏漏洞,受影响的版本号为2.3.20-
2.3.28.1。
S2-032[2]:2016年4⽉21⽇Struts2官⽅发布S2-032漏洞,评级为⾼。
主要原因是在开启动态⽅法调⽤(Dynamic Method Invocation,DMI)的情况下,会被攻击者实现远程代码执⾏攻击,受影响的版本号为2.3.18-2.3.28 ( 2.3.20.2和2.3.24.2除外)。
S2-021/S2-020[3][4]:2014年左右频繁爆发的漏洞类型主要是“classLoader导致特定环境下的DOS漏洞”,受影响的版本号为
2.0.0 - 2.
3.16.1。
0.2Nmap扫描结果与分类
在分析测试之前,由于没有218和216段服务器的相关资料,为了避免盲⽬地进⾏测试,因此,选⽤nmap⼯具,对218和216段(⼀共512个IP)进⾏扫描,从⽽得到所有开启“Apache Tomcat/Coyote JSP”服务的IP地址。
相关情况如下:
表1 开启“ Apache Tomcat/Coyote JSP”服务的扫描结果
本次测试只对以上的IP进⾏了测试,详细的扫描结果,见附件。
1.测试对象
根据前期的相关⼯作,参照S2-032、S2-020、S2-021的漏洞情
况,分别对表1中涉及到的关键服务器进⾏测试分析。
2.测试思路与⽅法
在正式进⾏测试前,需要判断下表1中,是否所有的服务器都使⽤了Struts2框架,以及使⽤Struts2的版本号范围,这样可以节省很多时间,进⾏有针对性的测试。
2.1判断是否使⽤Struts2框架
Apache Tomcat 不仅可以⽤于开发动态页⾯,也可以⽤于开发单纯的html静态页⾯,另外,不是所有的动态页⾯(jsp、asp、aspx)都⼀定要选择基于Struts2的MVC模型来开发,因此,并不是所有的开启“ Apache Tomcat/Coyote JSP”服务的服务器都是本次测试的⽬标。
判断是否使⽤Struts2框架的⽅法,⼤致有以下2种:?通过在IP末尾加index.action,来判定,如果可以正常访问,且不报错,就表⽰可能使⽤了Struts2框架。
但这种⽅法是有⼀定的误报率的,因为,有的站点使⽤了重定向(HTTP状态码为302),这时候,不管你加什么,它都可以正常访问。
我们知道,基于Apache Tomcat 开发的动态页⾯,⼀般是jsp 页⾯(java server page),⽽jsp页⾯⼀般会有表单(Form)标签,在这个表单标签⾥,⼀般会有相应的Action。
通过前期的分析研究,我们发现Struts2 所有的漏洞执⾏,都是基于Action 中的ognlUtil.getValue⽅法,因此,可以通过把表单中的action 放在相应的URL末尾,来进⾏判定。
如果可以正常访问,且不会报错,⼀般可以断定是使⽤了Struts2框架的。
2.2判断Struts2的版本号
⼀般⽽⾔,Struts2作为MVC框架的⼀种实现,其版本号不会暴露在HTTP的任何GET/POST请求⾥,但也不是完全没有机会判断Struts2的版本号。
如果服务器的Struts2⼀直没有升级过,那么可以通过Apache Tomcat的版本号来⼤致判断Struts2的版本号所属的范围。
Apache Tomcat的版本号的判断⽅法为:发送⼀个不存在的GET/POST请求,服务器⼀般会返回⼀个404错误,这个404错误,会暴露服务器的版本号,通过此信息,可以⼤致判断Struts2版本号的所属范围。
2.3确定测试⽬标及漏洞类型
通过以上2步判断,基本上可以锁定最终的测试⽬标和Struts2的漏洞类型。
从表2中可以看到,受影响的服务器为教学平台、江苏学习在线以及⽼年教育。
表2 测试⽬标及其漏洞类型
为了进⼀步佐证初步判断,我使⽤Seebug的测试站点[5]和GitHub上开源的S2-032漏洞源码[6],在Kali Linux 2 上对表1中所有可能的IP进⾏了测试,均没有发现S2-032的漏洞。
3.样本分析
本着只测试,不远程执⾏命令的原则,并保证正常服务不被恶意破坏的情况下,对表2中的测试⽬标进⾏⼀⼀测试。
测试的POC (Proof of Concept)如下。
教学平台的测试POC:
http://210.28.218.79/index.action?top.Class.ClassLoader.resources.dirContext.doc Base=//210.28.218.79/cc
江苏学习在线的测试POC:
http://www.js-
/doc/751f0567f342336c1eb91a37f111f18583d00c1a.html /index.action?
class.classLoader.resources.dirContext.docBase=//210.28.2
18.204/opt
⽼年教育的测试POC:
http://xyh.js-
/doc/751f0567f342336c1eb91a37f111f18583d00c1a.html /index.action?
class.classLoader.resources.dirContext.docBase=//210.28.2
18.205/opt
使⽤上述POC均可以使得被测服务器产⽣拒绝服务(Deny of Service, DOS)。
4.修复建议
⼀般的修复⽅法有以下2种:
利⽤Struts2 MVC模型中的拦截器,或者W AF,过滤特定⽅法,但这不是长久之计,且可能会影响正常的业务请求。
更新为最新的Struts2。
更新后,如果⽆法重启,⼀般是由于导⼊了不该导⼊的jar包,或者该导⼊的jar包没有导⼊。
5.结论
本次测试只针对Struts2漏洞进⾏测试,⾸先对2014以来的Struts2的漏洞进⾏相关分析,掌握漏洞形成的原理,并对漏洞进⾏了分类处理。
其次,对学校218和216⽹段的所有开启“Apache Tomcat/Coyote JSP”服务的IP进⾏扫描,得到所有可能存在漏洞的站点,并通过⼀些技巧,锁定最可能有漏洞的3个站点。
最后,通过POC样本,证明了漏洞的存在,并给出了相关的修复⽅法。
另外,特此申明,本次测试,并没有对除表2之外,其他任何服务器,以任何⽅式,进⾏攻击测试。
对表2的3个站点,也仅仅局限于POC测试。
6.参考
1. S2-037:/doc/751f0567f342336c1eb91a37f111f18583d00c1a.html /papers/16875
2. S2-032:/doc/751f0567f342336c1eb91a37f111f18583d00c1a.html /papers/15430
3. S2-021:/doc/751f0567f342336c1eb91a37f111f18583d00c1a.html /papers/1778
4.S2-020:/doc/751f0567f342336c1eb91a37f111f18583d00c1a.html /papers/1377
5.Seebug:https:///doc/751f0567f342336c1eb91a37f111f18583d00c1a.html /monster/?vul_id=91389
6.GitHub:https:///doc/751f0567f342336c1eb91a37f111f18583d00c1a.html /rapid7/metasploit-framework/blob/master/modules/exploits/linux/http/struts_dmi_exec.rb。