Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
zyxel-p870hn-hardware-hacking — De una PCB desnuda a root: hackeo de hardware de una ZyXEL P-870HN (BCM6368) a través de UART — CVE-2025-0890 + CVE-2024-40891, en mi propio hardware. | Kitploit
Herramientas/GitHubGitHub/danyw24/zyxel-p870hn-hardware-hacking
Seguridad de Sistemas EmbebidosDescifrado de ContraseñasSeguridad IoTAnálisis de VulnerabilidadesExplotaciónIngeniería InversaHacking de HardwareAprendizaje y EducaciónAnálisis de Firmware

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
GitHubdanyw24/zyxel-p870hn-hardware-hacking

zyxel-p870hn-hardware-hacking

De una PCB desnuda a root: hackeo de hardware de una ZyXEL P-870HN (BCM6368) a través de UART — CVE-2025-0890 + CVE-2024-40891, en mi propio hardware.

Ver Repositorio
28hace 1 mesAún no revisado

De un PCB desnudo a root: hardware-hacking de un ZyXEL P-870HN por UART

Dos fotos de móvil de una placa de router sin etiquetar → consola serie → bypass de autenticación → shell root — reproduciendo la cadena real, aún sin parchear, CVE-2025-0890 (cuenta supervisor oculta) + CVE-2024-40891 (inyección de comandos en la CLI) en hardware que poseo.

por damik0 · 2026-08-13 · una guía paso a paso de hardware-hacking

  📷 PCB photos ─▶ 🔬 chip recon ─▶ 🏷️  model ID ─▶ 📍 find UART (J2)
       └─▶ 🔌 serial console ─▶ 🚪 hidden account ─▶ ⛓️  break out of CLI
              └─▶ 🐚 root shell ─▶ 🔓 dump + crack every credential

TL;DR

Tenía una placa de router cualquiera sobre mi mesa. Sin carcasa, sin etiqueta, sin idea de qué era. Partiendo de nada más que dos fotos, leí cada chip del PCB, identifiqué el modelo exacto, encontré el conector serie (UART), me conecté a él, entré a través de una cuenta backdoor de fábrica, escapé de un menú de fabricante restringido hacia una shell root de Linux, y extraje todas las contraseñas del equipo — crackeadas en menos de un segundo.

Ninguno de estos fallos es mío. Son problemas documentados de ZyXEL que el fabricante ha dicho que no va a parchear. De lo que trata este repo es del cómo, de principio a fin, y del razonamiento en cada paso.


Primero lo primero: esto es hardware mío

  • El objetivo es una placa de router que poseo.
  • La entrada fue a través del puerto serie físico del PCB — sin ataque remoto, sin red de terceros, nada expuesto a internet.
  • Estuvo en mi banco de trabajo, aislada de la red, todo el tiempo.
  • El objetivo era ejecutar el ciclo completo de hardware-hacking de principio a fin y documentarlo para que sea reproducible.

Lo que estaba trasteando

Identifiqué el modelo a partir del número de serigrafía de la placa 45-402-000022 y del código de barras, contrastándolo con TechInfoDepot, la tabla de hardware de OpenWrt y el ID de la FCC I88P870HN51B:

ModeloZyXEL P-870HN-53b — pasarela VDSL2/ADSL2+ WiFi, fabricada por MitraStar
Época~2013 (los códigos de fecha apuntan a la semana 21 de 2013); una unidad distribuida por un ISP
SoCBroadcom BCM6368UKPBG — MIPS de doble núcleo (BMIPS4350), ~400 MHz
RAM2× Winbond W9425G6JH-5 — 256 Mbit DDR2 ×16 cada una = 64 MB en un bus de 32 bits
FlashMacronix MX29LV640EBTI-70G — NOR paralelo de 8 MB, TSOP-48
WiFiBroadcom BCM43222 (802.11n; silicio de doble banda, conectado solo a 2.4 GHz)
AFE DSLBroadcom BCM6302
FirmwareLinux 2.6.30 + BusyBox v1.00, bootloader CFE de Broadcom (compilado el 2012-06-11)

Por qué el número de placa es la clave que lo desbloquea todo: las pasarelas ODM como esta son diseños de referencia. Una vez que el número de pieza de serigrafía coincide con una placa documentada, heredas el trabajo de otro — el chip de flash exacto, la ubicación y el pinout de la UART, las cuentas por defecto. La identificación no es una formalidad; es lo que convierte el sondeo a ciegas en un ataque dirigido.


Cómo se desarrolló

Paso 0 — sacando las fotos del móvil

Primero, una pequeña mejora de calidad de vida: monté un minúsculo subidor de fotos por LAN (stdlib de Python, cero dependencias) para poder fotografiar la placa con el móvil y que las imágenes aterrizaran directamente en mi máquina. La mitad de una buena sesión consiste en eliminar fricciones como esta.

Paso 1 — leyendo la placa

Fui chip por chip a partir de las fotos en alta resolución. Los tipos de encapsulado te cuentan la historia antes incluso de leer las marcas: el BGA del centro es el cerebro, el TSOP-48 casi siempre es flash paralelo, la pequeña lata con el latiguillo coaxial es la radio. El SoC estaba oculto bajo un escudo RF (presente por EMI y como disipador de calor), así que desmonté la lata para leer la marca de debajo — un Broadcom BCM6368.

Mapa de la placa anotado

La placa, mapeada: (1) SoC BCM6368, (2) RAM DDR2, (3) WiFi BCM43222, (4) transformador de línea DSL, (5) magnéticos de Ethernet, (6) cabeceras USB internas, (7)(8) marcas de la placa, (9) la cabecera de consola J2, (10) una huella JTAG sin poblar.

Paso 2 — poniéndole nombre

La serigrafía 45-402-000022 coincidía exactamente con la placa documentada, y cada chip — SoC, flash, WiFi, los 64 MB de RAM — encajaba pieza a pieza con la variante -53b. Ahora no solo sabía qué era; sabía dónde vivía su UART y qué cuenta me dejaría entrar.

Paso 3 — cazando la UART

Justo al lado del SoC había una cabecera poblada de 6 pines en ángulo recto, con la serigrafía J2 y un triángulo que marca el pin 1. Lo confirmé con la página de OpenWrt para el modelo:

PinSeñal
1VCC 3.3Vdéjalo desconectado
2Tx→ RX del adaptador
3Rx→ TX del adaptador
4GND→ GND del adaptador
5NC

115200 8N1, 3.3V TTL.

Tarjeta de cableado J2

Cómo encuentras una UART cuando no hay ninguna wiki que te diga el pinout — la parte que demuestra que esto no es solo seguir una receta:

  • GND — continuidad (pitido) con el plano de tierra / escudo, con la placa sin alimentar.
  • VCC — un riel que se mantiene estable en ~3.3 V una vez alimentada.
  • TX — se mantiene en alto a ~3.3 V (estado de marca UART) y visiblemente baja/parpadea en el instante en que el dispositivo arranca y empieza a escupir su log. Ese parpadeo es la consola hablando.
  • RX — normalmente la tranquila: flotante o con pull débil, sin actividad de arranque.

¿Y si no sabías el baudrate? 115200 es el valor por defecto del CFE de Broadcom, pero a ciegas barrerías las velocidades habituales (9600 → 115200) hasta que la basura se convirtiera en ASCII, o medirías el periodo de bit más estrecho en un osciloscopio y harías 1 / t.

Paso 4 — obteniendo una consola

Conecté un adaptador USB-TTL (HW-597, PL2303) con el jumper en 3.3V. Esto importa: la UART del BCM6368 es TTL de 3.3 V, no RS-232 (±12 V) — si le cuelgas un puerto serie real o un adaptador de 5 V, fríes el pin. Primero tierra, luego RX/TX cruzados, VCC flotante para que nada realimente la placa. Antes de aplicar alimentación confirmé GND y VCC con un multímetro, y luego:

screen /dev/ttyUSB0 115200

Lo encendí, vi al CFE pasar el control al kernel, vi arrancar el init de BusyBox y aterricé en un prompt de login.

Paso 5 — la puerta principal estaba abierta de par en par · CVE-2025-0890

El login cedió ante una cuenta oculta de fábrica que ZyXEL nunca documenta para el usuario final:

user:     supervisor
pass:     zyad1234

Privilegio total del sistema. Este es el núcleo de CVE-2025-0890.

Paso 6 — fugándose de la jaula del fabricante · CVE-2024-40891

Ese login me dejó en una CLI de fabricante bloqueada (consoled, un prompt >): sin sh, sin ninguna de las herramientas habituales de Linux — una jaula alrededor del sistema real. Pero exponía un diagnóstico ping, y ese comando insertaba su argumento directamente en una cadena de shell con cero sanitización. Así que le pasé un metacarácter de shell:

> ping 127.0.0.1; sh

…y caí en una shell root de BusyBox (#).

Descargar herramienta