TP-Link TL-WR841N 裝置上的漏洞(CVE-2022-30024)分析

語言: CN / TW / HK

TP-LINK 型號為 TL-WR841N V10 的路由器裝置上的漏洞被分配 ID CVE-2020-8423。該漏洞允許經過身份驗證的攻擊者通過向 wifi 網路配置傳送 GET 請求來遠端執行裝置上的任意程式碼。

發現韌體的版本:3.16.9 Build 150310。

漏洞分析

在深入之前,我將分析 Dispatcher(), 以理解程式如何分配函式來正確地處理它的函式。

當一個 REQUEST 被提交時,httpGenListDataGet() 函式將被呼叫以返回一個 LIST_ENTRY 指標,該指標指向一個列表,該列表依次包含處理每個先前分配的 URL 的函式的函式指標。接下來,程式將呼叫函式httpGenListFuncGet()返回列表中的函式指標,並找出分配給處理函式的URL是否在提交的REQUEST中找到。如果有一個函式將被呼叫,否則將繼續檢查列表中的下一個函式指標。

該程式將使用 httpRpmConfigAdd() 函式為每個 URL 字串分配一個處理函式。

所以,只要找到一個地方呼叫這個函式,使用src緩衝區作為使用者輸入,這個漏洞是完全可能的。

在逆向跟蹤中,我得到一個 writePageParamSet() 函式,該函式具有 gen page 函式將值返回給使用者,其中建立緩衝區 dst[512] 並傳遞給 stringModify() ,以接收控制代碼轉義字元中的值。

此外,我們得到一個回撥函式,它處理包含地址 0x45FA94 的 /userRpm/popupSiteSurveyRpm.htm 的 URL 字串。

這個函式將接受GET請求的引數,並呼叫包含漏洞的函式。

我們可以根據輸入的可選ssid引數來控制這個漏洞。

漏洞驗證

使用Payload = “/%0a” * 0x55 + “A” * 100。設定斷點並觀察。

因此驗證了漏洞,修改了$ra暫存器值,覆蓋了3個暫存器$s0, $s1, $s2。

漏洞利用

檢查並檢視是否啟用保護機制,這樣我們就可以將shellcode傳遞給堆疊來執行任意程式碼。

MIPS架構有一個問題,我們需要在執行shellcode之前清除Icache快取,為了解決這個問題,我們將控制程式跳轉到Sleep()函式中。檢視程式的庫,我發現了與舊漏洞利用庫匹配的 Ropchain,這需要一些除錯和調整。

修復shellcode

我在這裡有一個 shellcode 參考,但它不起作用。通過除錯發現,當shellcode傳遞給stringModify()函式時,如果包含位元組\x3c, \x3e, \x2f, \x22, \x5c,程式將新增1位元組的\x5c在\x5c\x3c或\x5c\x3e前,並破壞shellcode。檢查這個shellcode包含2個壞位元組\x3c和\x2f。我將通過替換其他命令來修復一些命令以刪除這些壞位元組。

修復位元組 0x3c

這個位元組在lui指令中,開發者的邏輯將在堆疊上儲存4個位元組。

我將把lui指令改為li指令,以儲存堆疊上的2位元組,而不是4位元組。

修復位元組0 x2f

在這個命令字串中,shellcode包含2個壞位元組,0x3c和0x2f,此時開發者想把字串//bin/sh放到堆疊上時。

我將使用 li 指令刪除 0x3c,並使用帶有中間值的 xori 指令來修復 0x2f 位元組。

這樣,當我們修改shellcode時,我們就可以控制路由器。

我的下一個任務是評估這個裝置的整個韌體,這裡我發現有更多的一日漏洞和零日漏洞。

CVE-2022-24355

我發現的第一個漏洞 (一日漏洞) 是一個嚴重漏洞 CVE-2022-24355,它允許網路攻擊者在沒有基於緩衝區溢位的身份驗證的情況下執行任意程式碼。具體分析請 點此

CVE-2022-30024

這是執行在二進位制httpd上的Web服務的ipAddrDispose函式中存在的一個基於堆疊的緩衝區溢位漏洞。該漏洞發生在將GET請求的引數值賦值給堆疊變數的過程中,允許使用者向堆疊記憶體中輸入大量資料,從而使攻擊者獲得控制權限。

漏洞發現過程

首先,輸入一個我覺得很容易理解的函式,ping。

通過傳送字串 aaaaaaaaa....aaa 開始檢查程式是否允許溢位導致任何錯誤,結果,只能在 UI 上輸入 50 個字元並收到訊息 ping request could not find host .....請檢查名稱並重試。

似乎什麼也沒發生,我們一直在尋找處理程式並逆向。結果,我們打開了 burp 套件,得到了包含 /userRpm/PingIframeRpm.htm 的 的請求。

開啟 IDA 查詢此 URL 字串,並在 0x44A530 處找到處理此 URL 的函式。

這裡呼叫httpGetEnv函式來獲取通過get REQUEST引數傳遞的值ping_addr, doType, isNew …

通過一個程序,呼叫 ipAddrDispose 函式並傳遞 ping _addr 引數。此時,漏洞就會出現。

初始化一個大小為52位元組的堆疊變數buf_ip,並接收來自ping_addr的每個字元值,直到字串結束。問題是ping_addr的長度在程式碼的驗證中沒有被處理,而是被限制在web UI中,使用Burp Suite可以很容易地繞過這個問題。

使用 Burp Suite 進行測試,輸入長度為 200 位元組左右的 ping_addr,結果。程式崩潰了。返回地址暫存器$ra被覆蓋,此時可以確認是漏洞。

我編寫了一個快速的python指令碼來啟用這個漏洞。

漏洞利用

下一個目標是RCE是裝置,因為裝置沒有啟用任何保護機制,ASLR也被關閉,所以我們可以控制$ra暫存器跳到shellcode中,執行程式碼並獲得控制權。

檢視程式開頭和程式結尾的彙編語句,堆疊變數buf_ip的位置,我們可以計算出要覆蓋到$ra的偏移量:(0xD4 + 8) - (0xD4 - 0xA0) = 168位元組,同時可以控制另外兩個暫存器 $s0 和 $s1。

為了建立一個漏洞利用模型,我製作了一個圖。

在 MIPS 架構中,我們不能直接跳轉到 shellcode 中執行程式碼,我們必須先跳轉到 sleep() 函式中清除 Icache(指令快取)記憶體。由於它在同一個韌體上,我將在上述漏洞利用中再次使用 ROP。

構建完整的ROP鏈,我們將得到如下所示的堆疊模型。

因此,我們成功地利用了帶有Stack Overflow漏洞的裝置,因為我們正在進行韌體模擬,所以逆向shell將列印日誌,不過在真實的裝置上,這種情況不會出現。

我發現此漏洞存在於 TL-WR841N V12 及以下版本中,該漏洞的ID為CVE-2022-30024。使用者應從 TP-Link 官網下載最新韌體以更新。