
От голой печатной платы до 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:
| Модель | 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) |
Почему номер платы — это ключ, открывающий всё: такие 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 для этой модели:
| Вывод | Сигнал | |
|---|---|---|
| 1 | VCC 3.3V | не подключать |
| 2 | Tx | → RX переходника |
| 3 | Rx | → TX переходника |
| 4 | GND | → GND переходника |
| 5 | NC |
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 (#).