Redis屡爆安全漏洞 HanSight紧急支招

2015年11月11日 作者: 瀚思科技

Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

然而近来因为Redis的安全问题而导致的入侵事件成爆发性增多,为此瀚思安全研究团队对Redis的安全问题进行了测试,具体分析如下:

危害简介

早在今年三月,关于利用redis写webshell的方法就已经公布出来。(http://www.secpulse.com/archives/5357.html)redis是一个key-value型数据库,信息以键对应值的关系存储在内存中,也可以将其存储到硬盘上,这也是写shell的必要条件。我们可以随时执行“save”命令将当前redis的数据保存到硬盘上。

以此即可很轻松的将shell写入网站目录。而这次的事件则是利用redis在用户目录写入一个ssh私钥文件,从而建立一个信任关系,这样即可绕过ssh的密码验证进行远程登录。

Redis安全问题成因:

服务器以root权限开启的redis-server,默认允许被远程访问,默认开启6379端口。并且默认安装的redis在安装过程中并没有要求设置身份验证。因此就造成了很多redis-server在安装完后,并没有设置身份验证。这也就是这次安全事件的主要成因。

攻击者只需要在本地装上redis-cli即可对远程以root权限启动起来的redis-server进行远程连接。连接语句:redis-cli -h 远程主机ip -p 6379 由此看出并没有身份验证的过程既可以成功连接。

攻击者通过以上方法连接上远程redis-server后,即可通过“save”命令向网站目录写webshell。也可以在用户目录写入一个ssh私钥文件,以此即可通过22端口远程登录服务器。

Redis安全性测试:

我们在本地搭建了redis环境进行测试。redis-server ip为192.168.2.1。

redis-cli ip为192.168.2.130。

当redis-server服务以普通用户身份启动时,远程访问结果为:

我们再以root权限启动redis-server。再次进行远程连接:

这次即可成功连接上。至此,即可远程操redis-server,执行flushall等危险命令。下图为在远程获取redis-server的数据库内容:

我们在客户端生成私钥文件redis_test_rsa

通过调用config set命令对redis的备份文件路径进行修改,然后执行save生成备份文件authorized_keys文件。

查看redis-server上是否成功生存该文件:

以下是被植入的公钥的内容:

至此,就可以使用本地的私钥去登录被植入公钥的ssh服务器了。

自测方法:

在此给出一个python的redis未授权扫描脚本,具体用法详见github:https://github.com/code-scan/rescan

整改加固建议:

1.以普通用户权限启动redis-server服务,redis缺省端口 > 1024,也就是在linux下本来就不需要特别以root身份才能监听端口。某些缺省安装的redis数据目录 /usr/local/var/db/ 是root所有,这个也要改成其他用户或者换目录。

2.给安装好的redis增加身份验证。修改redis.conf。requirepass mypassword

3.通过配置rename-command CONFIG “”,禁止一些命令。(必须以高权限运行的,可以参考此方法)修改redis.conf,增加:

rename-command FLUSHALL “”

rename-command FLUSHDB “”

rename-command CONFIG “”

rename-command EVAL “”

4.redis服务器不对外网开发。

题外话,都尽量避免以root身份起非linux必不可少的服务器程序,比如mysqld可以额外建立mysql用户起。必需以root起的,比如nginx等web服务器,可以用spawn一个低权限进程完成实际工作。或者类似<1024端口这种,以iptables进行端口映射。