
От голой печатной платы до root: аппаратный взлом ZyXEL P-870HN (BCM6368) через UART — CVE-2025-0890 + CVE-2024-40891, на собственном оборудовании.
Две фотографии немаркированной платы роутера с телефона → последовательная консоль → обход аутентификации → root-оболочка — воспроизведение реальной, до сих пор не пропатченной цепочки CVE-2025-0890 (скрытая учётная запись supervisor) + CVE-2024-40891 (инъекция команд в CLI) на оборудовании, которым я владею.
автор damik0 · 2026-08-13 · руководство по аппаратному взлому
📷 PCB photos ─▶ 🔬 chip recon ─▶ 🏷️ model ID ─▶ 📍 find UART (J2)
└─▶ 🔌 serial console ─▶ 🚪 hidden account ─▶ ⛓️ break out of CLI
└─▶ 🐚 root shell ─▶ 🔓 dump + crack every credential
На моём столе валялась какая-то плата роутера. Без корпуса, без маркировки, и без понятия, что это. Не имея ничего, кроме двух её фотографий, я считал все чипы с PCB, точно определил модель, нашёл последовательный (UART) разъём, подключился к нему, вошёл через заводскую учётную запись-бэкдор, выбрался из запертого вендорского меню в root-оболочку Linux и вытащил с устройства все пароли — взломаны менее чем за секунду.
Ни одна из этих уязвимостей не моя. Это документированные проблемы ZyXEL, которые вендор заявил, что не будет патчить. Этот репозиторий о том, как это делается, от начала до конца, и о логике рассуждений на каждом шаге.
Я определил ID по номеру платы на шелкографии 45-402-000022 и штрихкоду, сверившись с TechInfoDepot, таблицей оборудования OpenWrt и FCC ID I88P870HN51B:
Почему номер платы — это ключ, открывающий всё: такие ODM-шлюзы — это референсные разработки. Как только номер детали на шелкографии совпадает с документированной платой, вы получаете в наследство чужую домашнюю работу — точный чип флеш-памяти, расположение и распиновку UART, учётные записи по умолчанию. Идентификация — не формальность; это то, что превращает слепое зондирование в целевую атаку.
Сначала небольшой шаг для удобства: я набросал крошечный загрузчик фотографий по LAN (только стандартная библиотека Python, ноль зависимостей), чтобы можно было снимать плату на телефон, а снимки сразу попадали на мой компьютер. Половина успешной сессии — это устранение вот таких трений.
Я прошёлся по чипам на фотографиях высокого разрешения. Типы корпусов рассказывают историю ещё до того, как вы прочитаете маркировку: BGA в центре — это мозг, TSOP-48 — почти всегда параллельная флеш-память, маленькая банка с коаксиальным хвостиком — радиомодуль. SoC прятался под RF-экраном (он там для ЭМС и в качестве теплораспределителя), поэтому я снял крышку, чтобы прочитать маркировку под ней — Broadcom BCM6368.

Плата с картой: (1) SoC BCM6368, (2) DDR2 RAM, (3) WiFi BCM43222, (4) линейный трансформатор DSL, (5) магнетики Ethernet, (6) внутренние USB-разъёмы, (7)(8) маркировка платы, (9) консольный разъём J2, (10) незапаянная посадочная площадка JTAG.
Шелкография 45-402-000022 точно совпала с документированной платой, и каждый чип — SoC, флеш, WiFi, 64 МБ RAM — сошёлся один к одному с вариантом -53b. Теперь я не просто знал, что это; я знал, где находится её UART и какая учётная запись впустит меня внутрь.
Прямо рядом с SoC находился запаянный 6-контактный угловой разъём с шелкографией J2 и треугольником, отмечающим вывод 1. Подтверждено по странице OpenWrt для этой модели:
115200 8N1, 3.3V TTL.

Как найти UART, когда никакая вики не подсказывает распиновку — вот та часть, которая показывает, что это не просто следование рецепту:
- GND — проверка целостности (писк) на земляной полигон/экран при обесточенной плате.
- VCC — шина, которая держит стабильные ~3.3 В после подачи питания.
- TX — в покое находится в высоком уровне ~3.3 В (маркерное состояние UART) и заметно проседает/мерцает в момент, когда устройство загружается и начинает вываливать свой лог. Это мерцание — консоль говорит.
- RX — обычно тихий: в воздухе или слабо подтянут, активности при загрузке нет.
А если вы не знаете скорость?
115200— значение по умолчанию для Broadcom CFE, но вслепую вы бы либо перебирали распространённые скорости (9600 → 115200), пока мусор не превратится в ASCII, либо измерили самый узкий битовый период на осциллографе и вычислили1 / t.
Я подключил USB-TTL переходник (HW-597, PL2303) с перемычкой на 3.3V. Это важно: UART у BCM6368 — это 3.3 В TTL, а не RS-232 (±12 В) — подключите настоящий последовательный порт или переходник на 5 В, и вы сожжёте вывод. Сначала земля, затем RX/TX крест-накрест, VCC оставлен в воздухе, чтобы ничто не запитывало плату в обратную сторону. Перед подачей питания я проверил GND и VCC мультиметром, затем:
screen /dev/ttyUSB0 115200
Подал питание, наблюдал, как CFE передаёт управление ядру, как поднимается BusyBox init, и оказался на приглашении login.
Логин поддался скрытой заводской учётной записи, которую ZyXEL никогда не документирует для конечного пользователя:
user: supervisor
pass: zyad1234
Полные системные привилегии. Это ядро CVE-2025-0890.
Этот логин забросил меня в закрытый вендорский CLI (consoled, приглашение >): никакого sh, ни одного обычного Linux-инструмента — тюрьма, обёрнутая вокруг реальной системы. Но в нём был доступен диагностический ping, и эта команда подставляла свой аргумент прямо в строку оболочки без какой-либо санитизации. Поэтому я скормил ей метасимвол оболочки:
> ping 127.0.0.1; sh
…и оказался в root-оболочке BusyBox (#).
Почему одной точки с запятой достаточно: обработчик CLI делает эквивалент
system("ping " + userinput). Символ;закрывает командуpingи запускает вторую —sh— которая наследует stdin/stdout консоли, так что вы получаете интерактивную оболочку. Учётная запись уже была uid 0; CLI был единственным, что стояло между мной и настоящей оболочкой, и несанитизированный ввод разрушил эту стену. Связывание аутентифицированной CLI-инъекции со скрытой учётной записью — это ровно тот паттерн, который отслеживается как CVE-2024-40891.
Имея root, я посмотрел на систему и флеш:
# cat /proc/version
Linux version 2.6.30 ... (Buildroot 2010.02) #1 Mon Jun 11 2012
# cat /proc/mtd
dev: size erasesize name
mtd0: 004f5000 004f5000 "Physically mapped flash" # 5,197,824 bytes = the whole firmware
О чём говорит
/proc/mtd: флеш — это параллельная NOR, отображаемая в память — CPU видит её как плоский диапазон адресов (примерно0xB8000000в MIPS KSEG1), представленный как единый MTD-раздел. Это отличные новости для дампа: NOR читается чисто, без запасных/OOB-байтов и странностей ECC, с которыми вы боретесь на NAND./dev/mtdblock0и есть образ прошивки.
Затем пароли. Никакого /etc/shadow нет — хэши лежат прямо в /etc/passwd с использованием древнего DES crypt:
supervisor:SuO7vycdWI/rU:0:0:Administrator:/:/bin/sh
support:xoKf506EVkGKw:1:0:Technical Support:/:/bin/sh
user:QWOftoXez8Goo:2:0:Normal User:/:/bin/sh
admin:OJGXQ9dWyb9m2:100:0:Administrator:/:/bin/sh
Я вытащил их и взломал офлайн с помощью John the Ripper (--format=descrypt). Все шесть пали меньше чем за секунду:
Почему они испаряются мгновенно: DES
crypt(3)всегда использовал только первые 8 символов пароля и 12-битную соль, прогоняя 25 раундов DES. На современном CPU bitslice-взломщик DES пережевывает десятки миллионов кандидатов в секунду — так что тривиальные заводские пароли вродеadminилиsupportдаже не воспринимаются как работа. Эта схема устарела десятилетия назад; обнаружение её в поставляемой прошивке — вот настоящая находка.
Четыре заводские учётные записи с привилегиями уровня root, тривиальные пароли, одинаковые на каждом экземпляре этой модели.
Вся цепочка одной строкой:
PCB photo → ID the SoC → find the UART (J2) → serial console
→ hidden account (F-1) → locked CLI → command injection (F-2)
→ root shell → dump + crack every credential (F-3)
Я ничего из этого не открывал. Это воспроизведение публичных и до сих пор актуальных уязвимостей при физическом доступе:
supervisor:zyad1234, на устаревшем DSL-оборудовании ZyXEL. → F-1Они поражают оборудование на исходе жизненного цикла, которое ZyXEL, по его заявлениям, исправлять не будет, и их эксплуатация наблюдалась в дикой природе — именно поэтому так важно разобраться с механикой на практике. Ценность здесь не в новой ошибке, а в полном рабочем процессе от кремния до оболочки, выполненном и задокументированном.
execve с вектором аргументов, а не system())./etc/shadow с современным хэшем (bcrypt / SHA-512-crypt), а не DES.mtd0 (/dev/mtdblock0, 5 197 824 байт) через собственный WiFi роутера + nc, затем распакуйте с помощью binwalk (ожидаются: заголовок CFE + сжатое LZMA ядро + SquashFS rootfs + nvram). Полный метод в evidence/dump-methods.md.Анализ PCB по фотографиям (ImageMagick), мультиметр, переходник USB-TTL PL2303 (HW-597) на 3.3 В, screen для последовательной консоли (115200 8N1) и John the Ripper (descrypt) для хэшей. Идентификация через OpenWrt, TechInfoDepot и базу данных FCC.
Идентификация устройства
45-402-000022, флеш MX29LV640EBTI-70G)Уязвимости
supervisorОборудование и методика
Инструменты
Выполнено на моём собственном оборудовании, изолированном от сети, без участия сторонних систем. Уязвимости публично задокументированы и указаны выше. На что я ставлю своё имя — это сквозной метод аппаратного взлома и его исполнение, а не обнаружение дефектов.
| Модель | ZyXEL P-870HN-53b — VDSL2/ADSL2+ WiFi-шлюз, произведён MitraStar |
| Эпоха | ~2013 (коды дат указывают на 21-ю неделю 2013 года); устройство, распространявшееся провайдером |
| SoC | Broadcom BCM6368UKPBG — двухъядерный MIPS (BMIPS4350), ~400 МГц |
| RAM | 2× Winbond W9425G6JH-5 — 256 Мбит DDR2 ×16 каждая = 64 МБ на 32-битной шине |
| Flash | Macronix MX29LV640EBTI-70G — 8 МБ параллельная NOR, TSOP-48 |
| WiFi | Broadcom BCM43222 (802.11n; двухдиапазонный кристалл, подключён только к 2.4 ГГц) |
| DSL AFE | Broadcom BCM6302 |
| Прошивка | Linux 2.6.30 + BusyBox v1.00, загрузчик Broadcom CFE (собран 2012-06-11) |
| Вывод | Сигнал |
|---|
| 1 | VCC 3.3V | не подключать |
| 2 | Tx | → RX переходника |
| 3 | Rx | → TX переходника |
| 4 | GND | → GND переходника |
| 5 | NC |
| Учётная запись | Пароль | UID | GID | Привилегии |
|---|
| supervisor | zyad1234 | 0 | 0 | root |
| support | support | 1 | 0 | группа root |
| user | user | 2 | 0 | группа root |
| admin | admin | 100 | 0 | группа root |
| nobody | zyad1234 | 99 | 99 | ftp |
| # | Находка | CWE | Серьёзность |
|---|
| F-1 | Скрытые заводские учётные записи с root-привилегиями (supervisor, support, user, admin) — захардкоженные учётные данные, одинаковые на каждом экземпляре. | CWE-798 | Высокая |
| F-2 | Аутентифицированная инъекция команд в диагностической команде CLI ping → побег в root-оболочку, обход границы привилегий CLI. | CWE-78 | Высокая |
| F-3 | Слабое хранение учётных данных — DES-crypt хэши в /etc/passwd (без shadow) → мгновенное офлайн-взламывание. | CWE-916 / CWE-256 | Средняя |