struts2-052漏洞学习笔记
- 了解漏洞
- struts2是什么?
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
MVC:是一种思想,是一种模式,将软件分为 Model模型、View视图、Controller控制器
- struts2-052是什么漏洞?
2017年9月5日,Apache Struts官方发布最新的安全公告称,Apache Struts 2.5.x的REST插件存在远程代码执行高危漏洞,漏洞编号为CVE-2017-9805(S2-052),受影响的版本为Struts 2.5 - Struts 2.5.12。攻击者可以通过构造恶意XML请求在目标服务器上远程执行任意代码。漏洞的成因是由于使用XStreamHandler反序列化XStream实例的时候没有执行严格的过滤导致远程代码执行。
- 分析漏洞原理
在目录/struts-2.3.33/src/plugins/rest/src/中找到问题插件rest的源代码
在/main/resources/struts-plugin.xml配置了很多的bean,这些bean按照content-type进行分类,并唯一指定一个具体的Handler。这些Handler都实现了ContentTypeHandler接口。从下图源码中可以看出,这个ContentTypeHandler实际上是按照Content-type的不同,将请求的数据丢给指定的子类进行处理,其中红圈为漏洞所在子类:
进入目录/struts-2.3.33/src/plugins/rest/src/main/java/org/apache/struts2/rest/handler找到问题子类的源代码:
这里实际上就是对XML和java对象之间进行转化,这里面的 toObject方法触发了漏洞——反序列化XStream实例的时候没有执行严格的过滤。
结合以上两个情况,如果我们拦截住提交数据的请求包,将其对应的ContentType直接改为 application/xml,则ContentTypeHandler按照Content-type,很自然的就把这个包分发给了XStreamHandler这个类来处理,然而这个类没有进行任何校验,直接进行了转换,所以服务器就会直接执行我们编写的任意xml代码。
- 漏洞的重现和利用
- 搭建漏洞环境:
- 安装apache-tomcat-7.0.82和struts-2.3.33:
直接使用wget命令在官网下载源码包,解压安装即可:
- 进入到struts 的apps(我的是/home/flurry/struts-2.3.33/apps)目录,把struts2-rest-showcase.war文件放到tomcat的webapps目录(我的是/home/flurry/apache-tomcat-7.0.82/webapps):
- 进入到tomcat的bin目录(我的是/home/flurry/apache-tomcat-7.0.82/bin),启动tomcat:
- 打开浏览器,访问http://127.0.0.1:8080/struts2-rest-showcase,出现以下页面:
- 设置浏览器网络代理(8080端口已被tomcat占用,改用8088端口,并把不使用代理的localhost以及127.0.0.1删掉):
- 打开burpsuite,,设置proxy(保证与浏览器的设置一致):
- 点击浏览器界面里的edit:
- burpsuite里点击drop,浏览器进入下一界面,点击submit,burpsuite里点击drop,抓住一个包:
- 点击action,把这个包发送到repeater:
- 在repeater中编辑content-type值为application/xml,把最下面的请求换成写好的payload,然后点击Go,服务器会返回Error,如下图所示:
Payload代码如下所示,其中核心部分为红圈圈出来的部分:
<command>
<string>/usr/bin/touch</string>
<string>/tmp/test</string>
</command>
等价于命令touch /tmp/test,会在tmp目录下创建一个叫test的文件,查看tmp目录,发现有test文件,测试成功:
使用openvas扫描:
找到该漏洞的nvt:
分析源码可知,首先确定系统(windows或者linux),针对不同的系统定义了command命令:ping一下本机
然后获取主机地址,将文件中写好的payload写入请求包
将请求包发送给主机,分析得到的回复,如果执行了命令command,则说明存在漏洞: