1. 程式人生 > >Redis未授權訪問漏洞的重現與利用

Redis未授權訪問漏洞的重現與利用

前言:

最近配置openvas的時候安裝了redis,聽說曾經曝出過一個未授權訪問漏洞,便找了一下相關資料想自己動手復現一下漏洞的利用過程,當然所有的攻擊性操作都是在虛擬機器上完成的,本文所有的操作是在Fedora26上進行的,使用的虛擬機器為Oracle VM VirtualBox。過程中遇到了不少坑,在此整理一下過程,供像我一樣懷有好奇心的小白們學習參考,如有差錯還請各位大牛們斧正。 

一、漏洞簡介以及危害:

1.什麼是redis未授權訪問漏洞:

Redis 預設情況下,會繫結在 0.0.0.0:6379,,如果沒有進行採用相關的策略,比如新增防火牆規則避免其他非信任來源 ip 訪問等,這樣將會將 Redis 服務暴露到公網上,如果在沒有設定密碼認證(一般為空)的情況下,會導致任意使用者在可以訪問目標伺服器的情況下未授權訪問 Redis 以及讀取 Redis 的資料。攻擊者在未授權訪問 Redis 的情況下,利用 Redis 自身的提供的config 命令,可以進行寫檔案操作,攻擊者可以成功將自己的ssh公鑰寫入目標伺服器的 /root/.ssh 資料夾的authotrized_keys 檔案中,進而可以使用對應私鑰直接使用ssh服務登入目標伺服器。

簡單說,漏洞的產生條件有以下兩點:

(1)redis繫結在 0.0.0.0:6379,且沒有進行新增防火牆規則避免其他非信任來源 ip 訪問等相關安全策略,直接暴露在公網;

(2)沒有設定密碼認證(一般為空),可以免密碼遠端登入redis服務。 

2.漏洞的危害:

(1)攻擊者無需認證訪問到內部資料,可能導致敏感資訊洩露,黑客也可以惡意執行flushall來清空所有資料;

(2)攻擊者可通過EVAL執行lua程式碼,或通過資料備份功能往磁碟寫入後門檔案;

(3)最嚴重的情況,如果Redis以root身份執行,黑客可以給root賬戶寫入SSH公鑰檔案,直接通過SSH登入受害伺服器

二、漏洞的復現和利用:

1.SSH免密登入原理簡介:

在正式開始介紹復現過程前,先說明一下我復現的是最嚴重的漏洞利用情況即以root身份登入redis服務寫入ssh公鑰實現使用ssh免密登入受害主機。現在先說明一下SSH免密登入的原理(已經瞭解的童靴們可以直接跳過hhh):

SSH提供兩種登入驗證方式,一種是口令驗證也就是賬號密碼登入,另一種是金鑰驗證也就是我們想要的免密登入了,這裡我只簡單說一下金鑰驗證的原理。

所謂金鑰驗證,其實就是一種基於公鑰密碼的認證,使用公鑰加密、私鑰解密,其中公鑰是可以公開的,放在伺服器端,你可以把同一個公鑰放在所有你想SSH遠端登入的伺服器中,而私鑰是保密的只有你自己知道,公鑰加密的訊息只有私鑰才能解密,大體過程如下:

(1)客戶端生成私鑰和公鑰,並把公鑰拷貝給伺服器端;

(2)客戶端發起登入請求,傳送自己的相關資訊;

(3)伺服器端根據客戶端發來的資訊查詢是否存有該客戶端的公鑰,若沒有拒絕登入,若有則生成一段隨機數使用該公鑰加密後傳送給客戶端;

(4)客戶端收到伺服器發來的加密後的訊息後使用私鑰解密,並把解密後的結果發給伺服器用於驗證;

(5)伺服器收到客戶端發來的解密結果,與自己剛才生成的隨機數比對,若一樣則允許登入,不一樣則拒絕登入。

2.漏洞環境搭建:

(一)安裝redis服務:

(1)從官網下載原始碼的壓縮包:

wget http://download.redis.io/releases/redis-3.2.11.tar.gz 

1.png

(2)下載完成後,解壓壓縮包:

tar xzf redis-3.2.11.tar.gz;

(3)然後進入解壓後的目錄:cd redis-3.2.11,輸入make並執行;

(4)make結束後,進入src目錄:cd src,將redis-server和redis-cli拷貝到/usr/bin目錄下(這樣啟動redis-server和redis-cli就不用每次都進入安裝目錄了):

2.png

(5)返回目錄redis-3.2.11,將redis.conf拷貝到/etc/目錄下:

3.png

(6)編輯etc中的redis配置檔案redis.conf,如下圖所示:

4.png

去掉ip繫結,允許除本地外的主機遠端登入redis服務:

5.png

關閉保護模式,允許遠端連線redis服務:

6.png

(7)使用/etc/目錄下的reids.conf檔案中的配置啟動redis服務:

redis-server /etc/redis.conf

(二)安裝ssh服務:

fedora26安裝有ssh服務,但預設沒有啟動,需使用systemctl start sshd命令啟動ssh服務。

(三)複製虛擬機器,一個作為靶機,一個作為攻擊端

至此漏洞環境便已經搭建完畢,此時的redis服務是可以以root使用者身份遠端免密碼登入的。

3.漏洞利用重現:

(1)我使用的虛擬機器是Oracle VM VirtualBox,首先配置網路,都設定為橋接網絡卡,介面為環回介面卡,混雜模式為全部允許,使兩臺虛擬機器之間可以互相通訊:

7.png

(2)使用ifconfig命令檢視兩臺虛擬機器的ip:

8.png

如果ip一樣,則修改一臺虛擬機器ip,我修改了右側虛擬機器ip為192.168.0.147:

ifconfig enp0s3 192.168.0.147 up

9.png

虛擬機器A(192.168.0.146)為靶機,虛擬機器B(192.168.0.147)為攻擊端;

(3)在A中開啟redis服務:redis-server /etc/redis.conf ;

(4)在主機A中執行mkdir /root/.ssh命令,建立ssh公鑰存放目錄(A是作為ssh伺服器使用的)

(5)在B中生成ssh公鑰和私鑰,密碼設定為空:

11.png

進入.ssh目錄:cd .ssh/,將生成的公鑰儲存到1.txt:

12.png

(6)ping一下目標主機ip確定能通,若不能則再執行一遍ifconfig enp0s3 192.168.0.147 up命令,我的可以ping通:

13.png

(7)將1.txt寫入redis(使用redis-cli -h ip命令連線主機A,將檔案寫入):

14.png

(8)遠端登入主機A的redis服務:redis-cli -h 192.168.0.146  並使用CONFIG GET dir命令得到redis備份的路徑:

15.png

(9)更改redis備份路徑為ssh公鑰存放目錄(一般預設為/root/.ssh):

16.png

(10)設定上傳公鑰的備份檔名字為authorized_keys:

17.png

(11)檢查是否更改成功(檢視有沒有authorized_keys檔案),沒有問題就儲存然後退出,至此成功寫入ssh公鑰到靶機:

18.png

(12)開啟主機A和主機B的ssh服務(Fedor預設ssh服務關閉),命令為systemctl start sshd.serveice:

19.png

(13)在主機B使用ssh免密登入主機A:ssh -i id_rsa [email protected],成功登入:

20.png

至此,我們就成功利用redis未授權訪問漏洞實現了ssh免密登入目標伺服器,接下來就可以使用ssh服務來進行下一步的滲透工作啦。