Закрыть
В мире Обзоры Технологии Угрозы

Анализ встроенного ПО маршрутизаторов: Введение, Часть 1

Анализ встроенного ПО маршрутизаторов: Введение, Часть 1

Введение

Прежде всего, всем привет. Это первая часть нашего блога про анализ встроенного ПО маршрутизаторов. Мы собрались здесь, чтобы обсудить роутеры, которые являются неотъемлемыми устройствами в нашей жизни. Меня всегда интересовала безопасность. Насколько они безопасны? В этом посте я расскажу о возможности извлечения прошивки и попытке ее реверса. Поверьте, это гораздо интереснее и на рынке представлены маршрутизаторы от высококлассных вроде Fortinet до бюджетных домашних брендов вроде TP-Link и Tenda, а также других китайских марок.

Что такое маршрутизатор в целом?

Анализ встроенного ПО маршрутизаторов: Введение, Часть 1

Маршрутизатор — это комплексное устройство, которое направляет сетевой трафик между сетями, чаще всего между вашей домашней сетью и Интернетом. Он объединяет несколько основных функций в одном физическом устройстве: маршрутизацию пакетов данных, обеспечение проводного и беспроводного подключения, управление безопасностью сети и назначение IP-адресов устройствам. В повседневном использовании маршрутизатор выступает в роли центрального узла, обеспечивая подключение всех ваших устройств и гарантируя, что информация будет отправлена в нужное место эффективно и безопасно.

Загрузчик, ядро и корневая файловая система

Встроенное программное обеспечение маршрутизатора обычно состоит из трех основных компонентов, которые вместе обеспечивают загрузку устройства и работу всех сетевых функций. Понимание этих уровней необходимо для анализа или реверс-инжиниринга любой встроенной системы.

Загрузчик

Загрузчик — это первая часть кода, которая запускается при включении маршрутизатора. В большинстве потребительских маршрутизаторов это U-Boot, легкий и хорошо настраиваемый встроенный менеджер загрузки. В его обязанности входит:

— Инициализация процессора, оперативной памяти, флэш-памяти и основных периферийных устройств
— Загрузка ядра Linux с флэш-памяти
— Предоставление консоли восстановления или отказоустойчивости через UART
— Проверка целостности прошивки, иногда с помощью сигнатур
— Открытие переменных окружения, которые управляют параметрами загрузки.

Загрузчик подготавливает аппаратное обеспечение и передает управление операционной системе.

Ядро

На маршрутизаторах обычно используется урезанное ядро Linux на таких архитектурах, как MIPS, ARM и Qualcomm Atheros SoCs (SoC — это интегральная схема, которая объединяет большинство или все ключевые компоненты компьютера или электронной системы на одном микрочипе.). Ядро включает в себя:

— Драйверы для коммутаторов Ethernet, радиоприемников Wi-Fi, USB и флэш-памяти.
— Поддержка файловых систем (SquashFS, JFFS2, UBIFS)
— Сетевые стеки (iptables, bridge, VLAN, NAT, QoS).
— Патчи для конкретных устройств, применяемые производителями

В роутерах почти всегда стоит не просто «какое-то Linux-ядро», а ядро, собранное под конкретную аппаратную платформу , под тот самый чип, под ту самую архитектуру, что в SoC. И именно это определяет, как быстро устройство работает, какие драйверы доступны, и что вообще можно с ним сделать. Инструкция процессора, тип памяти, наличие аппаратных блоков, всё это влияет. Если вы неправильно поймёте архитектуру, всё, что на неё собрано (веб-интерфейсы, бинарники, службы), может не работать.

Возьмём, например, MIPS. Это типичный «бюджетный» вариант: простая RISC-архитектура, компактное ядро, минимум всего, идеально для дешёвых, маломощных маршрутизаторов. Такие устройства часто лишены богатого функционала, задача просто маршрутизация + Wi-Fi, без лишнего. BIOS-подобное ядро, минимальные системные утилиты, часто всё буквально «вшито» в образ. Прошивки под MIPS легко уменьшить размер, они недороги, и их хватает для базовых задач. Минусы тоже есть, слабая вычислительная мощность, отсутствие современных удобств, и часто необходимость «тонкой» настройки при реверсе или эмуляции, потому что бинарники чувствительны к порядку байт, версиям libc и Kernel.

С другой стороны, ARM, гораздо более гибкая и мощная архитектура. Многие современные роутеры, и не только роутеры, используют ARM-чипы: SoC от MediaTek, Qualcomm, Broadcom, Realtek и другие. ARM даёт больше возможностей, память, многозадачность, и шанс запустить сервисы посложнее: HTTPS, VPN, веб-интерфейсы, криптографические функции, расширенные сетевые функции и т.д. Но и требования к ресурсу выше, а ядро и фирменные патчи могут быть сложными, особенно если используются драйверы Wi-Fi, hardware NAT, offload’ы и пр.

Сравнительная таблица особенностей

Архитектура / тип SoC Что «даёт» Типичные сильные стороны Ограничения / проблемы
MIPS дешёвый, компактный SoC низкое энергопотребление, минимальные требования, хорошо для базового Wi-Fi/маршрутизации слабая производительность, мало RAM/flash, ограниченные возможности, чувствительность к endianness (порядок байтов)
ARM современный SoC + гибкое ядро мощность, поддержка сложного ПО, большие функциональные возможности (VPN, HTTPS, сервисы) требования к ресурсам, зависимости от драйверов, сложные билды
QCA SoC (Qualcomm Atheros) SoC + Wi-Fi + NAT + аппаратное ускорение высокая сетевой throughput, Wi-Fi, аппаратный NAT, компактное решение «всё в одном» проприетарные драйверы, аппаратные блоки, сложность эмуляции, зависимость от железа

 

Корневая файловая система роутера

Корневая файловая система содержит все, что необходимо маршрутизатору для работы после запуска ядра. Обычно она включает в себя:

— /bin, /sbin, /usr/bin, /usr/sbin — системные утилиты и инструменты командной строки
— начальные скрипты, управляющие процессом загрузки
— Веб-интерфейс администрирования (HTML, исполняемые файлы CGI, Lua, PHP и т. д.)
— Конфигурационные файлы, такие как сетевые настройки, правила брандмауэра и пароли Wi-Fi.
….

Когда мы говорим о корневой файловой системе роутера, важно понимать, что именно она формирует живую среду устройства после загрузки ядра. RootFS содержит все инструменты, утилиты и конфигурации, которые позволяют прошивке работать полноценно: от сетевых интерфейсов до веб-панели управления. Внутри неё обычно можно увидеть папки вроде /bin, /sbin, /usr/bin, /usr/sbin — именно здесь лежат основные системные утилиты, которые в случае роутеров почти всегда представлены через BusyBox. Это маленький, но крайне функциональный бинарник, который объединяет десятки классических команд Linux в один файл, экономя драгоценное место во флеш-памяти.

В каталоге /etc хранятся конфигурации, ключи, параметры сети, файлы firewall’а и настройки Wi-Fi. Рядом находятся init-скрипты, которые определяют процесс загрузки,они запускают сетевой стек, веб-интерфейс, DNS/DHCP-демоны и фирменные процессы производителя. Веб-панель обычно живёт в /www и состоит из HTML, Lua, CGI или бинарных обработчиков, в зависимости от того, как реализован интерфейс конкретного вендора. В пользовательской части часто встречаются дополнительные сервисы: VPN-клиенты, родительский контроль, IPv6-службы то, что производитель добавляет в свой комплект функций.

Почти все бытовые роутеры используют SquashFS как основную корневую файловую систему. Это максимально сжатый, доступный только для чтения формат, позволяющий уместить Linux в очень маленький объём флеша. Чтобы обеспечить возможность записи например, чтобы сохранить конфигурацию Wi-Fi или логи поверх SquashFS накладывается writable-слой: JFFS2, UBIFS или overlay-раздел (это маленькая область флеш-памяти, куда система может записывать данные, в отличие от основного squashfs, который только для чтения). Таким образом, всё, что встроено в прошивку, лежит в SquashFS, а всё, что пользователь меняет, записывается в отдельное хранилище.

Если мы распаковываем firmware.bin, то первым шагом обычно идёт поиск SquashFS-образа. Это можно сделать с помощью binwalk, который покажет смещения, после чего filesystem можно извлечь:

binwalk -e firmware.bin

Анализ встроенного ПО маршрутизаторов: Введение, Часть 1

Либо вручную:

binwalk firmware.bin
dd if=firmware.bin of=rootfs.bin skip=<offset> bs=1
unsquashfs rootfs.bin

После извлечения rootfs можно изучать его как обычную файловую систему. Но если мы хотим запустить прошивку в QEMU, одной распаковки мало, роутерные бинарники ожидают присутствия /proc,/sys,/dev. Это не обычные директории, а псевдо-файловые системы, которые создаёт ядро: через них программы получают информацию об устройствах, памяти, процессах и сетевых интерфейсах. Без них прошивка “не понимает”, на каком железе она работает, и многие сервисы не стартуют.

Поэтому перед chroot в rootfs нужно смонтировать эти системные области:

mount -t /proc none proc/
mount -t /sysfs none sys/
mount --bind /dev dev/

Только после этого среда становится похожей на полноценный Linux-окружение роутера, и скрипты, которые ожидают доступ к системным данным, начинают работать правильно.

Объяснение ключевых директорий Linux в RootFS

Папка Что внутри Почему важно
/bin основные команды минимальные инструменты Linux
/sbin системные команды (ifconfig, udhcpc, init) поднимают сеть и сервисы
/etc конфиги всего устройства Wi-Fi, firewall, пароли
/lib библиотеки для программ musl/glibc/вендорные libs
/lib/modules ядреные драйверы Wi-Fi, switch, USB, NAT
/usr/bin, /usr/sbin дополнительные утилиты веб-сервер, демоны
/www веб-интерфейс HTML/JS + CGI
/tmp временные файлы в RAM DHCP leases, runtime конфиги
/var логи, PID-файлы состояние сервисов
/dev виртуальные устройства tty, flash, ethernet
/proc интерфейс к ядру информация о процессах, памяти
/sys структура устройства драйверы, шины, hardware info
/overlay изменяемая часть FS все пользовательские настройки

В следующих частях мы обсудим извлечение и эмуляцию прошивки.

Анализ встроенного ПО маршрутизаторов: Способы извлечения прошивки из маршрутизатора, Часть 2
Анализ встроенного ПО маршрутизаторов: Эмуляция прошивки TP-Link, Часть 3

 

Оставить Комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *