我是如何在騰達路由器韌體程式上發現漏洞的

TonyRideBike發表於2013-11-29

現在再發一個路由器製造商——Tenda——產品中帶有後門(此連結為英文連結),只要用一個UDP包就可以破解,免得大家以為我專黑D-Link。提取了Tenda的W302R無線路由器最新韌體之後,我開始檢視/bin/httpd,發現它是一個GoAhead伺服器。

router00

 /bin/httpd中的伺服器頭字串,但是騰達自己做了很多特殊的修改。在進入HTTP接收回環之前,主函式呼叫了InitMfg函式,它會把MfgThread函式衍生出一個分離的執行緒:

router05

嗯……InitMfg函式和MfgThread?是不是和加工函式有關?有意思哈……

MfgThread第一件事就是建立一個UDP套接字,然後繫結到7329埠上:

router00

建立UDP套接字,並繫結到埠7329。這個程式接著進入一個frecvfrom迴圈中,從套接字裡讀取至多128個位元組。而且要求收到的每個UDP包至少有14位元組大:

router08

從套接字中讀取資料包並檢查大小,現在進入關鍵了,收到的UDP包就誒這被這段程式碼解析:

router03

處理收到的資料包,用C語言解析這段程式碼的話是這樣的:

如果特殊字串不匹配,停止處理該資料包並等待另一個包

我們可以看出這個執行緒在等待帶有如下結構體的資料包:

只要手打的資料包以字串“w302r_mfg”開頭,程式碼就會和三個ASCII字元(’1′, ‘x’, and ‘e’)對位元殊指令字:

router06

將指令字與 ’1′, ‘x’ and ‘e’相比較,為了方便,我把剩下的反彙編程式碼(起碼是重要的部分)轉換成C程式碼:

下面的動作對應三個可接受的命令字:

  • ‘e‘用預定義的字串進行回覆,主要是ping測試
  • ’1′允許你執行iwpriv命令
  • ‘x’允許你以根使用者許可權執行任何命令

如果’x’作為命令字,資料包命令字後面的提示符(上面的程式碼中稱為command_arg)被傳遞給call_shell函式,它通過popen執行命令。

router04

不僅如此,call_shell用命令的輸出填充tx_buf,如同我們在前面的C程式碼中開到的,輸出最後會發回客戶端!在知道MfgThread的功能以及它等待的資料包結構,我們可以很容易用netcat利用這個後門:

就是這麼個小玩意,但是關鍵在於後門只能監聽LAN,因此無法從WAN上使用。然而,它可以通過無線網路來利用,前提是無線網路預設開啟WPS,且無強制速率限制。我的ReaverPro工具箱可以相對更快地破解WPS以接入WLAN,隨後獲得路由器的根許可權(路由器一般有預設WPA鑰,你可以先嚐試一下):

router02

破解WPS的PIN

router01

開啟telnetd獲取根許可權

根據那個神奇字串來看,這個後門很可能先在騰達的W302R上出現,也存在於W330R,以及重新命名的型號,比如Medialink MWN-WAPR150N,他們都是利用同樣的“W302r_mfg”這個資料包字串進行破解。

相關文章