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
目前,官方已經發布了升級補丁,研究人員建議受影響的用戶儘快升級。
TAG:嘶吼RoarTalk |