圖片來源: 

周峻佑攝

專精於找尋漏洞的戴夫寇爾,今年舉辦的資安大會中,有2場他們在臺灣發現的資安漏洞演講,它們的共通之處,就是在許多民眾習以為常的資訊設備或系統上,發現可被濫用的弱點。我們先前整理了有關中華電信家用網路數據機的漏洞,而他們公開的另一項漏洞,則是去年網擎資訊主動與戴夫寇爾合作,由網擎資訊提供測試環境,並且同意戴夫寇爾透過逆向工程等管道,所發現Mail2000網頁郵件系統上的漏洞。這個漏洞在戴夫寇爾發現之後,網擎資訊很快於同年5月8日,針對Mail2000 6.0與7.0版推出對應的修補程式,並將相關漏洞命名為OF-ISAC-18-002OF-ISAC-18-003列管。

Mail2000是臺灣本土廠商網擎資訊所開發的解決方案,發展已經超過10年以上,有許多企業、公部門,以及教育單位採用。這套產品最新的版本為7.0,企業部署的方式相當多元,包含了硬體設備、純軟體,以及雲端服務(MailCloud)等。

負責尋找Mail2000漏洞的戴夫寇爾資安研究員Meh,揭露她當時找出網擎Mail2000網頁郵件服務CGI漏洞的過程。雖然攻擊對象是網頁應用程式,一般來說,駭客多半會從前臺下手,找尋能夠利用的漏洞。但對於專精找尋應用程式漏洞的Meh來說,她發現,網站後臺的元件,也與一般應用程式相同,是透過許多二進位執行檔(Binary)組合而成,因此,在她檢視Mail2000的系統架構後,發現還是有不少可以嘗試攻擊的地方。

戴夫寇爾資安研究員Meh發現的漏洞,來自libm2k和libm2kc等2個程式庫。(攝影/周峻佑)

而透過Binary的角度來看待網頁應用程式時,也會出現另一種的思維。由於一般的套裝軟體被發現漏洞時,所有部署相同軟體的設備,都會受到影響,企業若是沒有充分的資產盤點,逐一修補,想躲都躲不掉。Meh甚至形容,Binary漏洞的威力,有如核武般的恐怖,以這次發現的漏洞為例,紅隊演練的隊員若是發現企業環境中建置Mail2000伺服器,再加上沒有安裝修補程式,可能就直接從管理者的信件裡,找到存取企業內部環境所需的帳號密碼,而無須偵察系統其他潛藏的漏洞。

然而,和鎖定一般本機應用程式攻擊的不同點,在於網頁應用程式通常採用動態呼叫的方式運作,導致每次執行使用者的請求時,都會視為全新執行的處理程序,而取得不同的記憶體區塊,對於駭客而言,便必須在無法指向特定記憶體區塊的限制下進行攻擊。

發現漏洞後必須製作能夠利用的攻擊工具

Meh表示,越底層的漏洞越泛用,所以她決定朝程式庫下手。這次發現的漏洞,出現在libm2k與libm2kc兩個程式庫中,它們是由網擎自行開發,用來驗證連線的有效性,以及提供參數解析與檔案處理的模組。她發現的是記憶體越界寫入漏洞,在內容類型宣告為multipart的情況下,參數數量能夠超過陣列指定大小,攻擊者便能藉由使用參數的CGI程式觸發漏洞。Meh指出,若是網擎其他產品也運用這兩個程式庫,也會受到影響。

接著,他們就開始研究如何利用這個漏洞,Meh說,在Binary的滲透手法中,利用FILE結構的特性,就能挾持程式的執行流程,因為,可執行程式未必會做檔案處理,卻一定會有STDERR,也就是輸出錯誤訊息的指令。因此,她規畫了初步的滲透流程。

在擬定的攻擊方法裡,Meh先建立連線,呼叫CGI,然後使用大量參數覆寫vector指標,並且偽造POST file裡的FILE,指向偽造的FILE結構指標,最後在CGI的流程呼叫FILE執行相關操作,得以挾持程式的運作流程。但是這個時候,因為Linux作業系統內建的記憶體存取保護機制,也就是位址空間配置隨機載入(Address Space Layout Randomization,ASLR),會在應用程式每次執行時,重新分配所需的記憶體位置。也就是說,Mail2000呼叫CGI的時候,存取所需的應用程式,都會取得不同的記憶體區塊。

Meh發現了程式庫的記憶體越界寫入漏洞,但真正實際要拿來發動攻擊,必須解決Shellcode指向記憶體位置的問題。(攝影/周峻佑)

基於上述的原因,Meh說,他們必須在沒有固定記憶體位置的情況下,執行滲透攻擊,為此,先後寫出了2個專用的CGI程式。

第1個CGI攻擊程式名為msg_read,其特點是程式的功能較多,若是資安人員想要運用返回導向程式設計的手法(Return-Oriented Programming,ROP),發動記憶體堆疊溢位攻擊(Heap Spray),可用的小工具數量算是豐富。他們再搭配意外發現Mail2000的另一項弱點,也就是開發者開放了記憶體堆疊(Stack)的可執行權限,得以直接繞過系統,執行殼層程式碼(Shellcode)。

但上述CGI真正難以實際運用的問題,在於攻擊者必須登入Mail2000系統,才能發揮作用。因此,Meh又再製作了第2個CGI攻擊程式,名為cgi_api。

顧名思義,這個攻擊程式用途是呼叫程式庫的API介面,而無法像前一隻程式使用ROP攻擊,也因為第2個CGI程式的特性,Meh發現,他們只要利用CGI的特性,讓HTTP的變數存放於環境變數裡,就能直接讓殼層程式碼複製到記憶體堆疊執行,而無須透過ROP手法。

這個時候執行的問題,又回到前述與ASLR機制有關的記憶體定址。但Meh發現,Mail2000是32位元的應用程式,記憶體可能的位址,只有4,096種,透過暴力破解,僅需要幾分鐘的時間,就能得到真正的位址,進而執行殼層程式碼,取得Shell。她說,雖然資安人員總想要像狙擊手帥氣的一擊斃命,但這次的例子中,暴力破解才是務實的作法──只要拿出大砲全面掃射,打中敵人就能達標。

從這次發現漏洞的過程中,我們可以看到,駭客想要攻打目標,過程中會依據執行的結果,持續修正做法,調整思維,甚至是推翻先前的策略,進而達成目的。

熱門新聞

Advertisement