Redis未授權訪問漏洞復現
Redis是一種開源的,記憶體中的資料結構儲存系統,可用作資料庫,訊息代理或快取。由於它是在在受信任的環境中訪問,因此不應在Internet上公開。但是,一些Redis服務繫結到公共介面,甚至沒有密碼身份驗證保護。
在某些情況下,如果Redis使用root帳戶執行,攻擊者可以將SSH公鑰檔案寫入root帳戶,直接通過SSH登入到受害伺服器。這會允許黑客獲得伺服器許可權,刪除或竊取資料,甚至導致加密勒索,嚴重危及正常的業務服務。
漏洞利用的簡化流程
·登入不受保護的Redis
· 將其備份位置更改為.ssh目錄 – 將SSH金鑰寫入新的備份位置
· 使用SSH金鑰遠端連線並登入目標伺服器
我們應該已經熟悉如何使用私鑰+公鑰進行SSH自動登入了。
漏洞復現
現在我們來開始實戰,設定一臺目標機器。我們需要兩臺機器,可以是物理機,虛擬機器,也可以是遠端VPS。
只要攻擊端能夠ping通目標就行。
本次示例的環境配置:
目標機器:Ubuntu上的Redis-3.2.11
攻擊機:kali
配置目標機器
首先,在目標機器上安裝Redis。通過下面這個命令來下載原始碼:
wget http://download.redis.io/releases/redis-3.2.11.tar.gz
解壓和編譯,命令如下:
tar xzf redis-3.2.11.tar.gz cd redis-3.2.11 make
make之後,我們使用nano來開啟redis-3.2.11目錄下的redis.conf配置檔案。為了能夠進行遠端訪問,我們需要註釋掉 bind 127.0.0.1這一行,並禁用protected-mode,如圖所示:
現在使用我們剛才編輯的配置檔案啟動Redis服務。注意:redis-server在redis-3.2.11/src目錄下,啟動命令如下:
src/redis-server redis.conf
現在,我們已經完成了目標伺服器的設定。此外,我們還應檢查是否有 .ssh資料夾。如果沒有,我們應該建立一個,一會兒攻擊時會用到。
攻擊機配置
首先,確定我們可以ping通目標。然後,我們將生成一個私鑰和公鑰,以便稍後SSH到目標機器中。執行以下命令以生成SSH金鑰並將密碼保留為空:
ssh-keygen -t rsa
然後,進入.ssh目錄,如果你是root使用者,請輸入/.ssh,不是root使用者,輸入~/.ssh,然後將私鑰複製到temp.txt中:
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > temp.txt
有人可能會奇怪,為什麼我們在公鑰前後放兩個空行?如果你不知道的話,我們這裡先賣一個關子,下面自會解答。
很好,現在我們已經生成了一對金鑰對,現在我們需要找到一個方法將公鑰上傳到Redis伺服器中(目標機器)。
我們將使用redis-cli向Redis伺服器傳送命令,並且直接在終端中讀取伺服器的響應。
在redis-3.2.11/sct目錄下執行以下命令:
cat /.ssh/temp.txt | redis-cli -h 203.137.255.255 -x set s-key
這裡,我們來看看命令。我們使用-h引數來指定遠端Redis伺服器IP,這樣redis-cli就可以進行連線併發送命令。-x引數後的語句意思是,設定redis中s-key金鑰的值為temp.txt。
這裡,我們有了一個隱藏著ssh祕鑰的金鑰!現在我們再來連線到Redis並檢視它的配置檔案。使用redis-cli再次連線到Redis伺服器,如圖所示:
檢視上面的截圖,我們首先使用get s-key命令來驗證s-key金鑰的值,這個值正是我們想要的 – 前後有兩個空行的公鑰。我們這裡真正要做的就是獲取儲存在.ssh資料夾中的“s-key”(SSH公鑰)的值, 這樣我們就可以不用輸入密碼而遠端SSH登入到目標機器了。
我們需要執行如下操作:
備註:SSH中的authorized_keys檔案指定可用於登入的使用者帳戶,配置檔案已經修改。參考文章: ofollow,noindex">ssh.com
攻擊時刻
在攻擊機上,使用下列命令ssh連線到目標機器上:
# command: private key username@server IP ssh -i id_rsa [email protected]
太讚了,可以看到,我們使用SSH金鑰已經成功自動登入到伺服器上!到此,我們已經完成了漏洞復現。
最後,我想展示Redis的備份檔案是什麼樣的,如圖:
注意不可讀的字元?在關鍵內容之前和之後新增“\ n \ n”只是為了安全起見並將其與其他內容分開,以便可以正確解析。上面賣的關子,其實就是這個意思,很簡單。
使用搜索引擎查詢易受攻擊的Redis伺服器
我們將使用Shodan來搜尋具有Redis特徵的伺服器。
我們通過Redis的預設埠進行簡單搜尋。
共計75,665條搜尋結果。而且你知道嗎,這些結果中,有大量的主機都沒有密碼保護(截圖中沒有顯示,但是我們向下滾動的話,能夠看到)!!
這個漏洞是在幾年前發現的,仍有無數機器沒有設定密碼,還暴露在公網中,這對攻擊者來說,拿下伺服器簡直是探囊取物,不費吹灰之力。不得不說,這些人心真是大啊。
根據shadon顯示,2015年有大約56,000個未受保護的 Redis伺服器。
根據ZoomEye顯示,分佈的範圍如圖所示:
據ZoomEye稱,漏洞主機數量排名最高的國家是:中國,美國,德國……
OK,言歸正傳。我們如何使用Python指令碼驗證伺服器是否受到保護呢?其實,非常簡單。
1.使用socket連線到目標IP
2.執行GET請求
3.如果伺服器不受保護,GET請求會成功; 否則會失敗