Struts2-045、046、048漏洞基础
Struts2-045、046、048漏洞基础
0x00、涉及漏洞
Struts2-045(CVE-2017-5638),影响版本Struts2.3.5~Struts2.3.31,Struts
2.5.0~Struts2.5.1
Struts2-046(CVE-2017-5638),影响版本同上
Struts2-048(CVE-2017-9791),影响版本Struts2.3.x系列启用了struts2-struts1-plugin插件的版本
0x01、目的
主要为了测试一个Struts2漏洞集成扫描工具,初步测试过程中发现了一些问题。所以顺带了解一下。搭建的环境是struts2.3.24版本,另一个是利用docker以及vulhub现成的环境。测试内容包含45、46、48这3个漏洞。但是工具最开始只能测出45,46。
0x02、原理
在进入正题之前,先来了解一下最基础的东西。
一个http请求包含3个部分,分别是:
- (1)请求行
- (2)请求报头
- (3)消息主体
http协议规定post提交的数据必须放在消息主体中,但是协议对编码方式没有规定。服务器端就根据请求头中的Content-Type字段来判断请求中消息主体是以哪种方式进行编码的,然后再对消息主体进行解码。具体的编码方式如下:
- (1)application/x-www-form-urlencoded
最常见post提交数据的方式,以form表单形式提交数据。 - (2)application/json
以json串提交数据。 - (3)multipart/form-data
一般使用来上传文件
举个例子,如下图1所示,是一个文件上传的包结构。
图1 文件上传包结构
除了上文所讲的Content-Type以外,同时还存在一个Content-Disposition。
再来解释一下Content-Disposition:是MIME协议的扩展,当浏览器收到请求头时,会激活文件下载对话框,请求头中的文件名会自动填充到对应的文本框中。
- S2-045原理:
成因(文字描述):由于上传功能的异常处理函数没有正确处理用户输入的错误信息,导致攻击者可通过发送恶意数据包,利用该漏洞可以在服务器上执行任意命令。
简单分析:当Content-Type中出现”multipart/form-data“时,会被认为有文件上传,然后调用struts2默认的文件上传组件Jakarta,通过组件漏洞载入OGNL代码并执行,达到远程调用的目的。
- S2-045原理:
- S2-046原理:
与45的触发点相同,在使用文件上传功能时调用Jakarta组件,通过在http报文头部的Content-Disposition中构造恶意的filename字段,可导致RCE。
利用条件:满足两点。- (1)Content-Type中包含multipart/form-data
- (2)Content-Disposition中filename包含OGNL语句。
利用方式:2种情况。 - (1)Content-Disposition的filename存在空字节。
- (2)Content-Disposition的filename不存在空字节。
当filename不存在空字节想要成功利用的时候,需要满足以下两个条件:- A.Content-Length的长度值需要超过Struts2允许上传的最大值(2M)
- B.数据流需要经过JakartaStreamMultipartRequest。(即在struts.xml中添加配置
)
对于B的条件,是非默认情况下的配置,所以如果在filename不存在空字节的时候,利用成功的概率会大大降低。
- S2-046原理:
- S2-048原理:
问题出在struts2-struts1-plugin这个插件包上。这个库的主要作用是为了让struts2兼容struts1,所以将struts1的action封装成struts2的action在struts2上来运行使用。包里调用了getText()函数,而该函数能执行OGNL表达式,且该参数的输入点可以被用户直接进行控制。从而可以实现RCE攻击。
利用方式:name字段添加POC
- S2-048原理:
0x03、漏洞判断
这部分主要是讲关于如何识别一个网站是用的Struts框架或者说是用的web框架类型。
判断Struts的方法:(2个方案,仅限于初步判断,误判较高,但快速)
- (1)通过网页后缀来判断,如do.action等,这也是最常用的方法之一,不准的原因是JBOSS系统也是以do为后缀,但JBoss和tomcat不是一回事。
- (2)通过actis,该方法最早是由kxlzx在好些年前提出来,要求的是对应的Action需要继承自ActionSupport类。利用方法:
如原始URL为:http://www.baidu.com
检测所用URL则为:http://www.baidu.com/?actis=1111
如果返回的页面出现异常,则可以判定目标是基于Struts2构建的。
异常包括以下几种:
- A)网站页面可能会直接出现 404 或者 500 等错误。
- B)网站页面上输出了与业务有关错误消息,或者1111被回显到了网站前端的页面上。
- C)网站页面的内容结构发生了明显的变化
- D)网站页面发生了301重定向
以上是专门针对Struts2框架的。下面介绍一些通用的探测Web应用框架的方法。
使用工具:
- (1)Wappalyzer
- (2)Whatweb
- (3)BlindElephant
判别依据:
- (1)HTTP头
查看HTTP响应数据包头的X-Powered-By字段:
X-Powered-By: Mono //web应用框架是Mono - (2)Cookies
更可靠的方法是查看HTTP请求包(注意是请求包),每个框架特有的Cookies,例如:
Cookie: CAKEPHP=sidfiwhefjdcsfowjoef; //web应用框架是CakePHP
上面的工具里第三个目前没有使用过,通过前两个已经达到目的,因此主要从前两个来说。
利用Wappalyzer的时候,对自己搭的环境,以及搭在远程服务器上的Struts2环境进行探测,发现并没有显示出想要的Struts框架来,如下图2所示:
图2 wappalyzer探测
再利用whatweb进行探测,得出poweredby内容,获取框架信息,如下图3所示。
图3 whatweb探测
0x04、漏洞检测
网上扫描工具比较多,就不细讲,这部分主要是抓包手动加POC,后面顺便简述一下工具的修改以及工具还存在的问题(测试范围仅针对这三种类型漏洞)。
先来看一下POC,POC结构上大体相同,具体的部分根据编号不同有差异。以网上最常见的来说。如下图4所示。
图4 POC
分为三部分:
- (1)触发文件漏洞,声明为文件上传
%{(#_=’multipart/form-data’)
注:开头是“%”,根据Struts代码,也可以替换成“$”,同样有效 - (2)注入OGNL代码,通过ognl表达式静态调用获取ognl.OgnlContext的DEFAULT_MEMBER_ACCESS属性,并将获取的结果覆盖_memberAccess属性,绕过SecurityMemberAccess的限制。如下图5所示:
图5 注入ognl代码
- (3)调用CMD命令,首先判断操作系统,win下调用cmd,linux下调用bash。至于执行的具体命令可自行进行修改。
图6 调用cmd命令
先来看一下S2-045,注入点是在Content-Type中,抓包后进行修改。发现GET和POST请求都可以注入。如下图7和图8所示。图7中利用netstat命令,打印出端口开放情况。图8利用了whoami打印出本机名。
图7 端口开放情况
图8 post请求打印本机名
测试S2-046的点主要在于利用filename,但是抓包改包的时候发现并不能正确回显(如下图9所示),在修改jakarta配置后,依旧不能正常回显,但用集成工具进行测试时,发现可以正常显示。
注:S2-045以及S2-046都是上传位置,抓包在fileupload处(如下图10所示)。
图9 S2-046抓包改包无法正常回显
图10 S2-045及S2-046抓包点
测试S2-048的点在name字段,在进行本机测试的时候,利用网上公开最多的一个POC,是不能正常回显的,进行URL编码后依旧无效。但在远程搭建的服务器上可以响应该POC(如下图11所示,显示netstat命令不存在,这里集成工具测试时也有些问题)。本机搭的环境是048肯定存在的环境,但利用POC并不能测出48的漏洞,所以在对代码进行了多次测试后,利用了另一个POC如下图12所示。(奇怪的是,该POC测试远程服务器时,无回显)
图11 远程服务器响应S2=048常见POC
图12 非常用S2-048POC
图13 非常用POC测试本机S2-048结果
注:S2-048的抓包位置在:intergration下的Struts 1 integration处,如下图14所示。
图14 S2-048抓包位置
至此就是S2-045,S2-046,S2-048的手工抓包以及测试点。
下面就来看一下集成工具方面存在的问题以及简单的修改。
利用的工具是github上的一个集成工具:struts-scan,扫描范围较广,从S-05到S-057一些危害比较大的漏洞都有所涉及。但在测试本机的时候不能发现S2-048的漏洞(如下图15所示)。
图15 集成工具测试本机环境漏测S2-048
所以看一下该工具具体代码实现细节。
图16 S2-048集成工具代码实现细节
图17 判别回显依据
该代码实现逻辑比较简单(如上图16所示),就是在name字段加载POC,其中postdata处该字典各字段对应的正是在intergration/editGangster.action页面提交post请求时各框内需要填入的值,然后根据接收到的数据包的一些特征进行判断,这里判断是根据POC中命令来的,此处用到的命令是netstat -an,如上图17所示,是该POC的判别依据。可以看到该工具集成的POC就是网上最常用的那一个,经过上面的抓包测试,发现本机测试时该POC确实有问题,由于测试远程服务器上专门搭的S2-048采用另一个POC时也出现了问题,所以此处,需要对该代码进行修改的就是,同时利用两个POC进行测试,使之兼容。所以此处增添了一个部分S2-048-02,同时,为了方便测试,在回显的时候除了显示漏洞是否存在以外,针对漏洞存在的情况直接打印出命令执行后的结果。如下图18所示。
图18 修改集成工具后漏洞测试结果
修改之后可以成功兼容。
但根据该集成工具的实现逻辑以及实际过程中碰到的问题来看,该工具还需要进一步的修改。主要修改点在以下方面:
- (1)在S2-048测试中,可以看到vulnurl中在通过urlparse函数获取IP地址再结合添加的后缀是固定的值(固定值为struts2-showcase/integration/saveGangster.action),如下图19所示。
图19 S2-048测试URL
问题就在于struts2-showcase实际上就是struts的war包解析后自动生成的文件夹,虽然默认情况下都为struts2-showcase,但实际开发中,只要有一点安全意识即可进行文件夹名字的修改。比如此处,将此war包改名为struts2,如下图20所示。
图20 struts的war包重命名
此时测试,虽然输入的测试地址为struts2,但实际集成工具在进行发包时依旧会对struts2-showcase进行发包,如下图21所示。
图21 更改war包名字进行重测,测试结果失败
此处其实应该结合目录字典爆破,可手工进行RCE攻击。
- (2)判断回显依据上出现问题。判断仅根据执行netstat -an命令后回显的数据包中几种状态包括”Active Internet connections”,”Active Connections”,”活动连接”,”LISTEN”这四种进行漏洞判别,正常情况下netstat在linux和windows确实同时可使用,但不排除有些服务器所用的linux系统为最原生的系统,可能会出现该命令不存在的情况,只能执行ls等最基础的命令,如在上文中图11所示对远程服务器上的S2-048漏洞进行测试时出现的结果。该情况下漏洞并非不存在而是命令不存在,修改命令后,漏洞触发情况如下图22所示,对此执行whoami命令。
图22 远程S2-048漏洞执行whoami命令
集成工具暂时修改内容只兼容了另外的测S2-048POC,之后有时间会进行其他方面的修改。
0x05、总结
本文是针对Struts全家桶系列的基础内容之一,该文仅讲了Struts2-045,Struts2-046,Struts2-048三个漏洞,45和46的触发点都是在上传点位置,即fileupload处,而48的位置则是在integration处,45的漏洞,需要在Content-Type处执行文件上传功能,即multipart/form-data同时后面紧跟OGNL执行语句,而46的漏洞则除满足Content-Type:multipart/form-data同时在Content-Disposition下的filename处进行修改,这里边又包含两种情况,为含空字节和不含空字节。48的触发点则是在name字段,可利用的POC视具体情况。
随后记叙了如何探测网站框架,插件或者whatweb等方式,然后对漏洞进行抓包测试,最后再针对集成工具进行一些测试修改以及针对代码逻辑结构提出了一些现目前存在的问题。
最后,文末将给出一张简易的梳理图,如下图23所示。
图23 S-045,S2-046,S2-048逻辑梳理
0x06、参考文献
https://blog.csdn.net/wutianxu123/article/details/82634738
https://www.sohu.com/a/156177758_128736
https://www.anquanke.com/post/id/85776
http://blog.nsfocus.net/apache-struts2-vulnerability-analysis-protection-program/
https://www.360zhijia.com/360anquanke/186708.html
https://www.freebuf.com/vuls/129871.html
http://netsecurity.51cto.com/art/201707/544837.htm(注:含漏洞搭建)
https://www.freebuf.com/vuls/140410.html
https://www.jianshu.com/p/356291fb26a2(S2-048另一POC)