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 "
"; cat id_rsa.pub; echo -e "
") > 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文件指定可用於登錄的用戶帳戶,配置文件已經修改。參考文章:ssh.com
攻擊時刻
在攻擊機上,使用下列命令ssh連接到目標機器上:
太贊了,可以看到,我們使用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請求會成功; 否則會失敗
緩解措施
·不要綁定到0.0.0.0
·如果需要綁定,請更改默認埠(6379)
·設置密碼
※惡意宏劫持桌面快捷方式傳播後門
※深入研究VBScript—CVE-2018-8174利用分析
TAG:嘶吼RoarTalk |