TP-Link TL-WR841N 設備上的漏洞分析
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 官網下載最新固件以更新。