作者:admin 日期:2023-09-06 瀏覽: 次
面試經(jīng)典 Redis未授權(quán)漏洞與組合拳
Redis 全稱 Remote Dictionary Server(即遠(yuǎn)程字典服務(wù)),它是一個(gè)基于內(nèi)存(當(dāng)然也可以把其存儲(chǔ)至硬盤上,這也是寫shell的必要條件之一)實(shí)現(xiàn)的鍵值型非關(guān)系(NoSQL)數(shù)據(jù)庫(kù)。Redis 免費(fèi)開源,其最新穩(wěn)定版本是 6.2.x(2022/11/10),版本更新參見(jiàn)常用版本包括。自 Redis 誕生以來(lái),它以其超高的性能、完美的文檔和簡(jiǎn)潔易懂的源碼廣受好評(píng),國(guó)內(nèi)外很多大型互聯(lián)網(wǎng)公司都在使用 Redis,比如騰訊、阿里、Twitter、Github 等等。
一般的,redis.conf文件路徑
Redis默認(rèn)配置過(guò)程中無(wú)需設(shè)置密碼,可能造成空口令風(fēng)險(xiǎn)。這種情況下只要連接的Redis服務(wù)器的host和port正確,且攻擊機(jī)安裝redis客戶端就可以成功連接,存在類似風(fēng)險(xiǎn)的數(shù)據(jù)庫(kù)服務(wù)器還有。Redis安裝默認(rèn)情況下,會(huì)綁定在,如果沒(méi)有限制來(lái)源IP并且沒(méi)有設(shè)置密碼(所以這也是兩種修復(fù)手段),就會(huì)導(dǎo)致攻擊者非法訪問(wèn),讀取Redis的數(shù)據(jù),利用自身config命令進(jìn)行寫入操作。Redis 是常見(jiàn)內(nèi)網(wǎng)服務(wù)。其他的常見(jiàn)內(nèi)網(wǎng)服務(wù)還有如 Structs2 和 Elastic。
未授權(quán) Redis 拿 shell 的 3 種方式
nmap掃描端口發(fā)現(xiàn)redis服務(wù)無(wú)密碼未授權(quán)實(shí)現(xiàn)直接訪問(wèn),然后可以執(zhí)行redis命令操作
查看reids服務(wù)端信息利用條件
Redis 未授權(quán)訪問(wèn)漏洞
服務(wù)器對(duì)外開啟了 ssh 服務(wù)
Redis 服務(wù)器運(yùn)行在 root 用戶下(否則還要猜測(cè)用戶用以修改authorized_keys的保存目錄)
所以在實(shí)際滲透過(guò)程中,該服務(wù)器「端口掃描」結(jié)果至少要滿足:
Redis 服務(wù) open(默認(rèn) 6379 端口)
ssh 服務(wù) open(默認(rèn) 22 端口)[沒(méi)開 ssh 都是扯淡]具體步驟
1. 生成一個(gè) ssh-key:
2. 防止其他數(shù)據(jù)干擾給公鑰加點(diǎn)換行:
3. 把公鑰寫入到一個(gè) key 里面,這個(gè)例子中是寫入了 may 這個(gè) key。
4. 設(shè)置 rdb 文件存放的路徑:
5. 設(shè)置 rdb 文件的文件名
6. 搞定保存。
7. ssh嘗試登陸:
這樣我們就獲得了一臺(tái)服務(wù)器的 shell??梢缘酱朔?wù)器上查看,發(fā)現(xiàn)目錄下已經(jīng)有了 authorized_keys:
cat /root/.ssh/authorized_keys
一些心得現(xiàn)狀:
首先此方式肯定是無(wú)法適用于 Windows 主機(jī)的。(判斷是 Windows 機(jī)器還是 Linux 機(jī)器可以通過(guò)下圖所示的命令根據(jù)路徑判斷,下圖為L(zhǎng)inux下)另外隨著運(yùn)維人員對(duì)此漏洞認(rèn)識(shí)的深入,現(xiàn)在越來(lái)越少運(yùn)維會(huì)直接以 root 起 Redis 的。這樣就無(wú)法直接往目錄下寫公鑰。當(dāng)然寫入的目錄不限于下的,也可以寫入用戶目錄。那么要多一個(gè)猜用戶的步驟。相較之下,直接寫 webshell 和寫計(jì)劃任務(wù)這兩種方式用的更多。
關(guān)于什么時(shí)候要flushall
一般寫authorized-key時(shí)注意多寫兩個(gè)換行就行,這里我找了很多垃圾數(shù)據(jù)放在authorized-key文件里,依然能正常免密登錄,主要是在寫webshell時(shí)需要注意。redis在生產(chǎn)環(huán)境里面數(shù)據(jù)量經(jīng)常是十分龐大的,save到php文件里會(huì)超過(guò)php的允許文件大小,導(dǎo)致無(wú)法解析,而且save也不支持僅寫入某個(gè)數(shù)據(jù)庫(kù),而是只能保存整個(gè)redis的實(shí)例,所以select到某個(gè)空數(shù)據(jù)庫(kù)來(lái)寫入shell也是無(wú)法試驗(yàn)的
解決辦法
直接flushall全刪掉即可?;蛘呦葌浞菰賱h,之后再進(jìn)行恢復(fù)。實(shí)戰(zhàn)就算碰見(jiàn)了也慎用,師傅們保命重要利用條件:
知道網(wǎng)站根目錄絕對(duì)路徑(所以實(shí)際滲透過(guò)程中,這個(gè)方法通常需要搭配 phpinfo() 等信息使用。)
無(wú)需是 root 起的 Redis
可適用于 Windows(非 ssh 連接)
一般無(wú)需 flushall 清空數(shù)據(jù)庫(kù)(一定情況下也需要)
理解了落地ssh公鑰原理,利用redis寫webshell就十分簡(jiǎn)單,主要還是四個(gè)步驟具體步驟:
1. 設(shè)置保存路徑
2. 修改保存文件名
3. 將鍵值寫入文件

4. 保存
雖然寫入的是二進(jìn)制文件,但是網(wǎng)頁(yè)端訪問(wèn)依然能夠解析可能遇見(jiàn)的錯(cuò)誤
下面是一種典型的報(bào)錯(cuò),說(shuō)明運(yùn)行redis的用戶對(duì)網(wǎng)站根目錄沒(méi)用寫入權(quán)限,這里redis服務(wù)屬于redis用戶利用條件:
通過(guò)寫 crontab 的方式 getshell 是一種很綠色的方式:
無(wú)需 flushall 清空數(shù)據(jù)
注意,這里并不是因?yàn)閷懹?jì)劃任務(wù)本身無(wú)需 flushall,而是因?yàn)檫@樣的語(yǔ)法可以控制第一條記錄,就能保證你的內(nèi)容始終保持在最前面。就是一個(gè)標(biāo)準(zhǔn)用法,因?yàn)榘俜痔?hào)比的優(yōu)先級(jí)更高。
需要是 root 起的 Redis。
歸根到底還是要 root 運(yùn)行 redis,畢竟要寫到/var/spool/cron/crontabs/root下,主要優(yōu)勢(shì)是適用一些 ssh 不能被直接訪問(wèn)的場(chǎng)景。
不適用于 Windows 服務(wù)器
Windows 場(chǎng)景下沒(méi)有計(jì)劃任務(wù),可以嘗試一下寫入啟動(dòng)項(xiàng)。理論上可以嘗試寫文件到用戶啟動(dòng)項(xiàng),但是現(xiàn)實(shí)是 Windows 普通用戶沒(méi)有計(jì)劃任務(wù)權(quán)限。Windows 下 Redis 拿 shell,后面會(huì)單獨(dú)成文討論。具體步驟
1. 計(jì)劃任務(wù)默認(rèn)存儲(chǔ)路徑,設(shè)置寫 crontabs 的文件夾路徑
2. 修改保存文件名
3. 對(duì)寫入「反彈 shell」的計(jì)劃任務(wù)
4. 保存
5. 監(jiān)聽公網(wǎng)機(jī)器指定端口,接收反彈回來(lái)的 shell
未授權(quán)或弱密碼造成的可登入是必要條件,可公網(wǎng)訪問(wèn)是充分條件。如果公網(wǎng)不能訪問(wèn),還可以通過(guò) socks 隧道、SSRF 等方式內(nèi)網(wǎng)漫游。
前面說(shuō)過(guò),redis是基于內(nèi)存的,當(dāng)場(chǎng)景需要大量訪問(wèn)Redis中的數(shù)據(jù),服務(wù)端難免會(huì)難以承受。Redis就提供了主從模式,主從模式就是指使用一個(gè)redis實(shí)例作為主機(jī),其他實(shí)例都作為備份機(jī),其中主機(jī)和從機(jī)數(shù)據(jù)相同,而從機(jī)只負(fù)責(zé)讀,主機(jī)只負(fù)責(zé)寫,通過(guò)讀寫分離可以大幅度減輕流量的壓力,算是一種通過(guò)犧牲空間來(lái)?yè)Q取效率的緩解方式。問(wèn)題就出現(xiàn)在了數(shù)據(jù)同步這一步,主機(jī)如果有惡意數(shù)據(jù)的話從機(jī)也會(huì)不分黑白跟著同步。
該漏洞的觸發(fā)條件依然是未授權(quán)或者弱口令連接
利用redis-rogue-server工具
該工具的原理就是首先創(chuàng)建一個(gè)惡意的Redis服務(wù)器作為Redis主機(jī)(master),該Redis主機(jī)能夠回應(yīng)其他連接它的Redis從機(jī)的響應(yīng)。有了惡意的Redis主機(jī)之后,就會(huì)遠(yuǎn)程連接目標(biāo)Redis服務(wù)器,通過(guò)slaveof命令將目標(biāo)Redis服務(wù)器設(shè)置為我們惡意Redis的Redis從機(jī)(slaver)。然后將惡意Redis主機(jī)上的exp同步到Reids從機(jī)上,并將dbfilename設(shè)置為exp.so。最后再控制Redis從機(jī)(slaver)加載模塊執(zhí)行系統(tǒng)命令即可。
進(jìn)行主從關(guān)系綁定的惡意代碼
審過(guò)Exp之后我們可以發(fā)現(xiàn),在寫入so文件時(shí)和另一個(gè)開源項(xiàng)目十分相似,兩個(gè)項(xiàng)目在這里都進(jìn)行了類似模塊污染的操作。這里想起了之前做過(guò)的一道題目:[天翼杯 2021]easy_eval當(dāng)時(shí)在做這道題目的時(shí)候,通過(guò)redis進(jìn)行提權(quán)。當(dāng)時(shí)思路是:
造成redis沙盒逃逸漏洞的原因主要是由于redis lua,redis嵌入了lua編程語(yǔ)言作為其腳本引擎,可通過(guò)eval命令使用lua,lua引擎是沙盒化的,不能在運(yùn)行redis的服務(wù)器上執(zhí)行任意代碼。但在Debian以及ubuntu發(fā)行版上,由于打包問(wèn)題,在lua沙箱中遺留了一個(gè)對(duì)象package,攻擊者可以利用這個(gè)對(duì)象package逃逸redis lua沙盒,在運(yùn)行redis的服務(wù)器上執(zhí)行任意命令。
利用的前提依然是未授權(quán)或者弱口令連接,并且它只影響 Debian 系的 Linux 發(fā)行版系統(tǒng)(Debian、Ubuntu 等)上的 Redis 服務(wù),其他系統(tǒng)上的 Redis 服務(wù)不受影響。
2.2 <= redis < 5.0.13
2.2 <= redis < 6.0.15
2.2 <= redis < 6.2.5
連接redis-server
eval執(zhí)行l(wèi)ua代碼
1 . 開啟密碼驗(yàn)證并設(shè)置高強(qiáng)度密碼,redis的查詢速度是非常快的,外部用戶一秒內(nèi)可以嘗試多達(dá)150K個(gè)密碼;所以密碼要盡量長(zhǎng)
2 . 在redis.conf文件中綁定內(nèi)網(wǎng)ip,最好是本地ip,并且禁止公網(wǎng)訪問(wèn)
3 . 在redis.conf文件中修改redis默認(rèn)端口
4 . 低權(quán)限運(yùn)行redis服務(wù)(非root用戶)5 . 禁用高危命令,其實(shí)就是換個(gè)難猜的名字
http://snowming.me/2021/08/
https://www.leavesongs.com/PENETRATION/write-webshell-via-redis-server.html
本文原作者:may1as
轉(zhuǎn)載來(lái)自FreeBuf.COM