當前位置:
首頁 > 新聞 > ISPsystem漏洞分析

ISPsystem漏洞分析

ISPsystem panel是一款管理web伺服器、VPS和計費軟體的含有友好介面的知名軟體。全球上百家託管服務提供商都在使用ISPsystem軟體產品,包括1Cloud, King Servers, Ru-Center。ISPsystem的安裝量超過1萬。

圖1: ISPmanager安裝量估計

本文介紹研究人員發現的ISPsystem軟體中的關鍵漏洞,攻擊者利用該漏洞利用劫持另一個登入用戶的session,並控制用戶的站點、虛擬機等。因為所有的ISPsystem都使用相同內核,所以都受到該漏洞的影響。

ISPsystem允許用戶免費下載和設置其軟體。要使用軟體用戶首先要購買license,但也可以免費獲取試用的license。研究人員下載和安裝了用於VPS管理的ISPsystem panel實例:

圖2: VMmanager安裝

腳本設置了必要的環境,包括MYSQL資料庫和HTTP伺服器。默認情況下,HTTP伺服器運行在TCP 1500埠。

圖3: VMmanager HTTP伺服器進程

在完成必要的設置步驟後,就可以通過web瀏覽器訪問panel,下面是登陸頁截圖:

圖4: VMmanager panel登陸介面

下面進行不影響其他用戶體驗的本地試驗。

認證過程

首先看一下認證過程,認證是使用下面的HTTP POST請求執行的:

圖5: VMmanager HTTP認證請求

認證成功後,伺服器可以設置session cookie,這是web瀏覽器保存的一個唯一字元串。Session cookie可以讓系統無須每次都輸入用戶名和密碼來進行認證。Session cookie的name是與產品名有關,含有2個部分,分別是產品名(比如 「vmmgr」或「vemgr」)和「ses5」。本例中,session cookie name為vmmgrses5,另一個cookie vmmgrlang5用來選擇用戶介面的模板和語言。

圖6: VMmanager成功認證響應

可以看出,cookie的值是十六進位編碼的6位元組字元串,字元串中含有12個字元,範圍為[0-9a-z]。cookie的過期時間設備為1年。

因此,攻擊者只需要找出準確的6位元組值就可以劫持另一個用戶的有效會話。對於session id有256^6種可能的組合。

可預測的Session Identifier漏洞

對遠程暴力破解攻擊來說,256^6是一個龐大的數字。因此,研究人員決定查看是否可能減少該值的範圍。

為此,需要了解session cookie生成的演算法。

業務邏輯是用C 實現的。資料庫操作、用戶認證、用戶會話管理都是用C 代碼實現的,並且在ihttpd進程環境中執行。

因為想要了解cookie session的生成方法,研究人員在二進位文件中搜索了字元串ses5,發現該字元串在以下庫中:

/usr/local/mgr5/lib/libispapi.so

/usr/local/mgr5/lib/libmgr.so

/usr/local/mgr5/lib/libispcgi.so

/usr/local/mgr5/lib/libostemplate.so

/usr/local/mgr5/libexec/ihttpd.so

在檢查了這些文件後,研究人員發現密碼認證是在libispapi.so庫中執行的:

在認證過程中,isp_api::Session類中創建了一個新對象:

圖7: 反編譯認證路徑部分:創建Session class實例

最後,調用 isp_api::Authen::Data::generate_id 來生成session id。代碼如下:

圖8: 生成session cookie值

Session id的長度為6位元組。同樣長度的位元組從libmgr.so庫傳遞給了 str::Random。最後一個需要做的就是str::Random實現。該函數並不應該用庫函數std::rand混淆,因為有完全不同的實現。

為了生成隨機位元組序列,str::Random方法中使用了rand()函數:

圖9: str::Random實現部分:生成隨機序列

為了生成長度為N的隨機字元串,rand()函數被調用了N次。調用的結果就是分配給一個變數char類型。這樣,rand()函數產生的值被分成8位元組的段。但rand()函數並沒有生成真隨機數,因為使用的是偽隨機數生成演算法。

而偽隨機數生成器生成的序列完全是由於初始狀態也就是seed決定的,因此,seed相同的話,生成的偽隨機數序列也相同。str::Random方法生成session cookie的過程如下圖所示:

圖10: 用str::Random生成session cookies示例

在本例中,在少於400個偽隨機數生成後會設置新的seed。Seed是一個32位的證書。負責設置隨機seed的函數str::Random實現如下所示:

圖11: str::Random實現部分:設置隨機seed

在上面的偽代碼中,g_rnd_reset_counter 變數用來確定偽隨機數生成器的seed更新的時間。g_rnd_reset_counter的初始值會被設置為rand()%5 128。也就是說該值的範圍為128~382。str::Random方法沒調用1次,生成的隨機字元串的長度就會從變數g_rnd_reset_counter中減去。當變數變小或等於0,生成器的seed就會重置。

str::Random的實現過程讓確定偽隨機數初始化的最後一個seed值變成了可能。最簡單的方法就是查找偽隨機生成器對每個seed值產生的session cookie:

圖12: seed lookup過程

如果知道session cookie,就可以計算出生成器的seed值,並預測生成器用該seed產生的完整的序列。

如果獲取了session cookie,就可以有382次嘗試暴力破解的計劃。

圖13:偽隨機session identifier預測

潛在攻擊場景

在潛在的攻擊場景中,攻擊者要遵循以下步驟:

·在T時間內,用有效用戶名和密碼登陸,保存分配的session cookie的值;

·用rand函數為所有seed(0到232)生成382位元組值的數組,在生成的數組中搜索保存的session cookie序列。

·從用所有seed生成的382位元組數組中提取所有6位元組的子序列,找出是否有已知的session cookies。

·嘗試用所有提取的6位元組的子序列的session cookie來登陸。

·如果攻擊過程中有其他用戶登陸,那麼會話就會被劫持。

T的範圍應該盡量小來確保對生成器使用的每個新seed都可以獲取至少一個session cookie。T的最優取值於時間和活動用戶數量有關。如果活躍用戶較多,T應該減小。

在本例中,seed lookup在16核CPU上花費了不到20分鐘。而且時間可以通過多種方式來減少。

攻擊PoC

攻擊的第一步使用python和urllib2庫來實現。下面的選項用來登陸攻擊的panel:

圖14: PoC:創建登陸請求並建立HTTPS連接(Python)

session identifier是從「vemgrses5」 cookie中獲取的:

圖15: PoC: 提取session cookie 值(Python)

首先,執行腳本來檢查單點登陸時rand()查詢的頻率和有無其他活動用戶。

為了找出與腳本獲取的session id匹配的seed值,可以使用下面的C代碼:

圖16: PoC: 用特定seed生成隨機數序列 (C, Linux)

上面的代碼設置了特定的seed,生成了已知session cookie的偽隨機序列。使用函數srandom_r()和random_r() 而不是srand和rand來多個線程並行。

下面是執行的結果:

圖17: 在生成的隨機序列和偏移量中找出session identifiers

Session cookie 列中含有伺服器對每次成功嘗試登陸返回的vmmgrses5。Found seed列中含有對應session cookie的seeds值。所有的session cookie都是由相同的seed生成的偽隨機序列。Offset列表明與偽隨機序列最開始的偏移量。最後一列是相同隨機序列中相鄰session id的距離。

從中可以看出,同一序列中session cookie的偏移量的距離恆為14.也就是說每次成功登陸rand()都回被調用14次:6次來生成session cookie字元串,8次其他位置的調用。如果距離大於14,說明有其他活動用戶。

在腳本執行期間,研究人員嘗試用瀏覽器來鄧麗。伺服器分配的session cookie為vemgrses5=9e723afa5922。

圖18: 來自VMmanager伺服器的HTTP響應首部

下面來證明session cookie是可預測的。

對腳本獲得的session cookie,研究人員在實驗過程中得到了下面的結果:

圖19: Demo:來自session identifiers的Seeds lookup結果

在10:57:56到10:58:17期間,偏移量的距離增大了。這段時間恰好有用戶活動。因此,通過檢查距離,可以確定網站上用戶的活動。

下面看一下用seed 0x747777E4生成的偽隨機序列:

圖20: Demo: 預測的偽隨機序列中含有想要的identifier

可以看出用戶的session cookie存在於生成的序列中的。腳本獲取的已知值用綠色表示,研究人員預測的值有紅色表示。

最後一步就是暴力破解與已知值的距離大於14的所有6位元組的子序列:

圖21: Demo:暴力破解數據

在本例中,只需要檢查66個值就可以找出另一個用戶session cookie的正確值。

最後,因為默認設置的伺服器與含有session cookie的遠程主機的IP地址不匹配,研究人員使用含有竊取的session ID的請求來攻擊另一個用戶的session:

圖22: Demo: 劫持會話的請求

總結

根據以上分析可以看出,只要有一定的資源,攻擊者一個人也可以很容易地實現攻擊。

受影響的ISPsystem產品包括:

·ISPsystem ISPmanager

·ISPsystem BILLmanager

·ISPsystem DCImanager

·ISPsystem VMmanager

·ISPsystem DNSmanager

·ISPsystem IPmanager

·ISPsystem COREmanager

目前,官方已經發布了升級補丁,研究人員建議受影響的用戶儘快升級。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

淺談等級保護測評
BOM歸來

TAG:嘶吼RoarTalk |