最近,在乌云上看到有人利用Redis非授权访问获取webshell的案例。其实,之前在安全论坛上有看到相关的介绍文章。好吧,我也打算试用一把,在测试过程中把遇到的问题及解决办法记录一下。指不定有些朋友可以用的上,当然,仅作交流,请勿用于非法途径。
什么是Redis呢?我摘抄一段百度百科中的文字:Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
我主要在自己的kali虚拟机上测试,之前没有安装Redis相关的程序,第一步肯定是安装了。具体可以参考官网链接:http://redis.io/download。用SHODAN搜索了一下,找个案例实验一下。
为了保护隐私,文章后续涉及到具体IP地址,我都会打上马赛克。
如下图所示,我找到了一个非授权访问的Redis数据库。具体就是使用redis-cli命令来进行连接。
连上之后,我们看下数据库中的key值。具体命令如下:
keys *
得到如下图所示结果:
可以看到,有2167项内容。咱们开始获取webshell的过程。在这里,我们需要知道web服务器的解析路径。这个可以猜测或者比较幸运的是主站正好有类似phpinfo这样的网页可以访问。在这里我找到一个info.php的页面,正好得到网站路径的绝对地址。
执行webshell的几条命令如下:(我得到的网站路径的绝对地址为/data/www/ecstore/)
config set dir /data/www/ecstore/config set dbfilename chopper.phpset webshell "<?php phpinfo(); ?>"save
命令执行完成之后,一般情况下就可以访问webshell了,也不排除特殊情况,如下图所示:
这个是什么问题呢?我后续写入了一个test.txt的文件,然后下载发现,Redis数据库执行save后会把内存中存在的所有数据都会保存到磁盘,这样就导致想要保存的webshell文件过大,然后不能执行了。那么,有什么好办法解决?可以先把Redis数据库中的内容全部清除,再写入webshell。这样就可以成功了。注意一点,还是首先备份一下Redis数据库中的内容,然后写入webshell成功后,再次恢复Redis数据库中的内容。本着不破坏的原则,应该是要这么做的。
在这里推荐备份和恢复Redis数据库的工具redis-dump,具体可以参看GitHub上的地址:https://github.com/delano/redis-dump。
首先来个备份,保存的是json格式。如下图所示:
接下来清空Redis数据库,然后执行webshell写入过程。清空Redis数据库的命令如下:
FLUSHALL
最后,再次恢复Redis数据库中的内容:
这次,得到的webshell就可以执行了。最后需要注意的地方,webshell上传成功且可以执行之后,如果恢复Redis数据库,你会发现之前能够成功执行的webshell又不能执行了。貌似恢复的Redis数据库中的内容会覆盖webshell中的内容。所以,先上传个小马,然后再用小马上传个大马,这样小马不行了,还可以用大马。
参考链接:
http://www.secpulse.com/archives/5357.html
http://www.secpulse.com/archives/5366.html