技術分析
RSS

Mikrotik 漏洞揭露與通報 (CVE-2021-41987)

3.1.2022D39
Share:

前言

APT 駭客組織 Huapi 自 2007 年開始活躍至今,攻擊台灣超過 10 年的時間。TeamT5 觀察到 Huapi 所開發的惡意程式,有時會使用加殼來阻擋研究人員分析,且通常會使用修改後的 RC4 演算法來加密傳輸。Huapi 長期攻擊政府、高科技、電信或研究智庫單位,根據 TeamT5 的統計結果,超過 5 成的受害單位為政府機關,受害國家包含台灣、美國、日本及南韓,其中針對台灣政府機關進行入侵攻擊為多。
仰賴於長期的追蹤及觀察,我們在一台中繼站發現公開目錄,目錄中存在一組針對 Mikrotik SCEP 服務的 0day 攻擊程式碼。在確定弱點存在後,我們也將弱點的相關成因回報給 Mikrotik 官方,讓官方可以在第一時間內進行修補開發,以避免該弱點繼續被惡意攻擊者進行利用。
Mikrotik 官方於 2021/11/17 釋出了修正版本,請有使用到受影響版本的用戶盡速升級,以免遭受危害。這裡我們將完整揭露攻擊程式的利用細節及漏洞原理,讓我們一窺 APT 駭客組織都是怎麼為達目的、不擇手段。

攻擊程式包分析

作為一個功能強大且簡單易用的路由器,Mikrotik routerboard 也支援簡單憑證註冊通訊協定(Simple Certification Enrolling Protocol, SCEP),來讓其他終端裝置可以簡便的取得所需之憑證。在協定交互的過程中,所有二進位資訊都會使用 base64 編碼之後再進行傳送,但由於 Mikrotik SCEP 服務在進行 base64 解碼的時候計算錯誤,會導致 Heap-based buffer overflow 的發生。
攻擊程式碼(以下簡稱 exploit)總共包含了針對三個不同版本的 exploit code 分別是 mikrotik-tile-6.46.8mikrotik-vm-64.8mikrotik-vm-6.48,及其相對應版本的 shellcode 用以攻擊成功之後執行額外的惡意指令。
以下是我們針對版本 mikrotik-vm-6.46.8 進行的exploit分析。

弱點根因

透過一個簡單的 HTTP 請求:
GET /scep/{scep_server_name}?operation=PKIOperation&message={} HTTP/1.1\r\n
將可以很容易的讓 www 這個負責 HTTP 服務的 binary 崩潰,並被 watchdog 重新啟動。
經過一番逆向工程後可以發現,位於 /nova/lib/www/scep.p 中的 ScepRequest::parseRequest,在解開 base64 編碼的 message 參數時,由於計算解編碼後的資料長度出現錯誤,導致 malloc 分配出來的大小不足,進而造成 heap overflow: Mikrotik 1.png

讓 Base64 變成漏洞,是不是搞錯了什麼 ?

舉例來說,假設我們的輸入資料是 xxxxxxxxxxxxxxxxhCE 長度為 19,依照逆向後的程式邏輯來看,SCEP 計算出解編碼後的長度是12 out_len = 3 * (in_len // 4) (這邊的 // 為整數除法)。但實際上解編碼後的資料長度為 14,這就直接導致了 heap 上的資料被覆蓋的問題。

漏洞利用

透過分析 exploit code 我們可以發現,攻擊者使用上述漏洞將 bins 中的某個 chunk size 改大 (0x4121),之後再次 malloc 將會拿到這個過大的 chunk 屆時便可以覆寫 heap 上的內容。
覆蓋某個 destructor 中會用到的 vtable pointer,將 edx 改成 0x8061a74 使得 call [edx+4] 執行位於 0x8058e89 的 gadget (xchg eax, ebp; ret;)。
Mikrotik 2.png

堆噴灑

首先發起 64 個請求做 heap spray 將我們要的 gadget 與 shellcode 隨著連線請求灑到 heap 上,並將其中一些連線關閉來讓 heap chunk 可以被 overflow 覆蓋到 vtable pointer。
Mikrotik 3.png
這裡用到的 function aaaa 會將後續所需要的 ROP gadgets 組合起來,function 中的變數 sc 表示後面會被執行到的 shellcode。
Mikrotik 4.png

觸發堆溢出

透過呼叫 function bbbb 會將我們的 payload 使用前面提過的型式送出用以觸發 heap overflow。
Mikrotik 5.png Mikrotik 6.png
在 function 中的參數 message 'x'*801*4+'hCE',會在 base64 解編碼的同時由於前述的計算錯誤,將導致下一個 chunk 的 size 會剛好被覆蓋到。 Mikrotik 7.png

嘗試重新取得被覆蓋到 size 的 chunk

後續透過繼續新增請求的方式,嘗試取得被改大的 chunk,overflow 的內容可以改到在 vtable 裡的 pointer。
Mikrotik 8.png
i=3 時,會讓 edx 的值改成 0x8061a74Mikrotik 9.png

觸發 destructor

最後透過關閉連線的方式,觸發 destructor call [edx+4] Mikrotik 10.png

幸運爆擊

由於一開始的 heap spray,0x8061a74 會變成某個一連線時填入的內容,因此 call [edx+4] 會變成呼叫 0x8058e89
Mikrotik 11.png
一旦成功進到 ROP gadget,這個 ROP chain,會將 [email protected] 改成 mprotect,使用 gadgets,嘗試把 open 變成 mprotect
Mikrotik 12.png
0x804fc04: pop esp; ret; 會把 esp 改成 0x8061a74+8,接回完整 ROP chain。 最後呼叫 mprotect 使執行流進到 shellcode (0x8061674) 上執行。
該份 exploit 中 shellcode 的內容為,unlink('/nova/store/user.dat') + sync() + reboot()。 等待重新啟動之後可以發現 Web 介面可以不使用密碼直接登入。

結論

透過上面的分析可以發現這個攻擊程式碼(exploit)有幾個侷限性:
1. 穩定性較低
  • 由於 add() 沒有處理進位,又有 ASLR 的緣故,運氣不好的話將直接導致攻擊失敗。
  • 在嘗試重現的過程中我們也發現到,有時候 shellcode 已經正常執行 (/nova/store/user.dat 已經被刪除),卻未如預期般重新啟動,這部分需要改進 shellcode 來增加成功機率。
  • 在嘗試重現的同時,我們也試圖透過修改 exploit 及 shellcode 來增加其穩定性,但最後成功率仍只有約略為 5~6%。
  • 唯一值得慶幸的是,倘若攻擊失敗也只是會造成 www crash 後被 watchdog 重新啟動,並不會對使用上造成太大困擾或是引起使用者注意。
2. 攻擊前提嚴格
如根因所述,scep_server_name 須為已知,若沒有這個 path 基本上也無法進行攻擊。
3. 回報時間軸
  • 2021/07/11: 在 C2 發現 exploit code
  • 2021/10/04: 回報給 Mikrotik 官方, 保留編號 CVE-2021-41987
  • 2021/11/17: Mikrotik 官方釋出更新修正該弱點
  • 2022/03/01: 公開 CVE-2021-41987 相關細節
4. RouterOS 受影響版本
  • 6.46.8
  • 6.47.9
  • 6.47.10

關於 TeamT5 D39 漏洞研究團隊

D39 致力於弱點安全與漏洞挖掘領域,研究範圍包含 Mobile、IOT、Linux、Windows 等有機會連網的系統與裝置都是我們的目標(笑),團隊擁有多項重大(Critical)或重要(Important)之安全漏洞,並於 Blackhat、HITCON、POC 等國際會議擔任講者。
攻擊程式碼(exploit)研究一直是網路攻防裡面最高深的技術之一,TeamT5 期許投入資源來培養更多人才進入這個領域,期待台灣能有越來越多世界頂尖的弱點研究人才。歡迎勇於面對未知挑戰,致力於漏洞研究、挖掘為目標,並具有獨立研究能力者一同加入我們 🤝

參考

*首圖來源: Pixabay
3.1.2022D39
Share:

Related Post

新聞
7.1.2021

北韓駭客組織再次利用 VPN 零時差漏洞對南韓航太產業發動攻擊

supply chain attack, cyber espionage, CloudDragon, South Korea, cyber threat intelligence, threat hunting, 威脅情資, 資安情資
技術分析
1.13.2021

年度最慘漏洞!深入探究 Oracle WebLogic CVE-2020-14882

vulnerability research , Oracle, WebLogic, CVE-2020-14882, cyber threat intelligence, threat hunting, 威脅情資, 資安情資
技術分析
9.16.2020

Container Escape 101

Linux, vulnerability research , D39, container, docker