Digamos ... solo por diversión ... obtuve 2 x 3 paquetes de Tenda MW6 para cubrir un área grande (en interiores y al aire libre). Tenía 3 de mi Backhaule MW6 con Ethernet (en realidad, son adaptadores de puente PLC).
En la configuración "predeterminada" funciona bien, sin embargo, ya tenía un buen enrutador OpenWrt y varios dispositivos/servicios configurados. Por DeFaul, MW6 funciona en modo DHCP, crea una subred 192.168.5.x y pone a todos allí. Pero esto 1) trae una capa NAT adicional, 2) rompe mis servicios.
Así que decidí cambiarlo al modo puente , en el que, de acuerdo con el manual, apagará todos sus servicios de red y simplemente actuará como un puente.
Desde la primera mirada funcionó, pero luego me di cuenta de que algunos de mis dispositivos se equivocaron IPS y luego entendí que el cubo "principal" se ejecuta su propio Luna Park con blackjack y prostitutas Servidor DHCP. No hay absolutamente ninguna página de administración web, solo aplicación de teléfono. No veo formas de deshabilitarlo desde allí.
NMAP dice que el servidor DHCP se está ejecutando e intercepta todos los clientes WiFi y ofrece direcciones IP desde su grupo. Y no hace falta decir que estas direcciones están mal, no lo que necesito. Google, encontró su apoyo: el mismo problema, sin embargo, la persona dice que dhcp authoritative='1' en el enrutador principal de OpenWrt funciona para él, pero nunca funcionó para mí.
Entonces comencé a la investigación: ¿cómo puedo deshabilitar el servidor DHCP?
Pocos puertos se abrieron en el cubo. Nada se parece a Telnet o SSH desde el principio, sin embargo, después de conectarme a UART, noté que Telnetd está comenzando cuando mantiene mantenimiento del botón de reinicio durante 3 segundos (6 segundos trae la configuración predeterminada de regreso).
PORT STATE SERVICE
23/tcp open telnet <--- opened only after you hold Reset for 3 seconds
5500/tcp open hotline
9000/tcp open cslistener
El servidor DHCP está arriba
sudo nmap -sU -p 67 --script=dhcp-discover 192.168.5.1
Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-18 20:04 MSK
Nmap scan report for _gateway (192.168.5.1)
Host is up (0.0027s latency).
PORT STATE SERVICE
67/udp open dhcps
| dhcp-discover:
| DHCP Message Type: DHCPACK
| Server Identifier: 192.168.5.1
| IP Address Lease Time: 23h30m42s
| Subnet Mask: 255.255.255.0
| Broadcast Address: 192.168.5.255
| Router: 192.168.5.1
| Domain Name Server: 192.168.5.1
|_ Domain Name: tendawifi.com
MAC Address: 04:95:E6:1A:96:E0 (Tenda Technology,Ltd.Dongguan branch)
Nmap done: 1 IP address (1 host up) scanned in 0.75 seconds
PORT STATE SERVICE
1723/tcp closed pptp
Examen más detallado del firmware requerido para comprender lo que se abre y cuándo.
Probé root/admin/soporte/usuario con admin/contraseña/usuario/1234/12345678 contraseñas y alguna otra ... no, no funciona.
Abrir el cubo es muy sencillo. Fuera de interesante: enchufe UART y SOIC -8 SPI Flash. Chip principal cerrado por Radiator - Realtek RTL8197F

115200 8n1. A partir del pin 1 (más cerca del flash SPI): VCC, RX, TX, GND.
Bohong BH25Q64 SPI Flash, 8mb. Ficha de datos
El firmware no está disponible en la web. La aplicación de teléfono lo busca en Tenda Cloud y se descarga. Mis cubos tienen el último firmware, por lo que no puedo oler sobre la red, ¿dónde se necesita nuevo? Solo puedo decir que esta aplicación tiene su propio protocolo de comunicación con Tenda Cloud.
Desafortunadamente, Chip Cave no funcionó, alimenta todo el dispositivo y comienza la comunicación con el chip. Lo desoledé por completo. No olvides la cinta Capton. 
No estoy leyendo Chips Flash todos los días y no tengo un dispositivo de programación especial para esto. Sin embargo, encontré el dispositivo FTDI FT2232H, que utilicé como depurador OpenOCD JTAG para ESP32. Este chip tiene modo SPI y puede funcionar como maestro. Pinout se toma de la hoja de datos.
| Puerto ft2232h | Función | Pasador de chips flash |
|---|---|---|
| Adbus0 | Sck | 6 |
| ADBUS1 | Mosi | 5 |
| ADBUS2 | Miso | 2 |
| ADBUS3 | CS | 1 |
Otros pasadores de chips flash 4 - GND, 8 - VCC 3.3V, 3 y 7 Van a VCC.

$ flashrom -p ft2232_spi:type=2232H,port=A
Y solo trae tristeza ...
flashrom v0.9.9-r1954 on Linux 4.18.0-25-generic (x86_64)
flashrom is free software, get the source code at https://flashrom.org
Calibrating delay loop... OK.
Found Generic flash chip "unknown SPI chip (RDID)" (0 kB, SPI) on ft2232_spi.
===
This flash part has status NOT WORKING for operations: PROBE READ ERASE WRITE
The test status of this chip may have been updated in the latest development
version of flashrom. If you are running the latest development version,
please email a report to [email protected] if any of the above operations
work correctly for you with this flash chip. Please include the flashrom log
file for all operations you tested (see the man page for details), and mention
which mainboard or programmer you tested in the subject line.
Thanks for your help!
No operations were specified.
Miró a su alrededor y encontró el sitio Skproj con Sketch y .NET App (en ruso) que funcionó bien para que yo leyera chips de flash chino.
Usé la placa NodEmCu ESP8266 ya que es 3.3V y no quería pensar en la conversión de nivel de 5V <> 3V.
Importante : el chip SPI se conectará a los pines HSPI GPIO12-GPIO14 según la documentación oficial.
serprog para Arduinos que funcionan con flashrom , pero no pude encontrar rápidamente su puerto para ESP8266 
Para facilitar el flasheo, acabo de comprar chips de pareja W25Q64FV. Funcionan correctamente con flashrom y no necesito ejecutar Windows para flash. Escribí Flash Dobt a New Chip con
flashrom -p ft2232_spi:type=2232H,port=A -w image.bin
El cargador de arranque de Tenda detectó un nuevo chip de flash y comenzó normalmente.
La carrera directa de Binwalk ofrece muchos hallazgos regulares.
binwalk all.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
35096 0x8918 CRC32 polynomial table, little endian
36192 0x8D60 gzip compressed data, maximum compression, from Unix, last modified: 2018-04-20 02:17:42
206872 0x32818 LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 6890804 bytes
2261010 0x228012 Squashfs filesystem, little endian, version 4.0, compression:xz, size: 3071844 bytes, 378 inodes, blocksize: 131072 bytes, created: 1902-05-30 15:13:04
6160384 0x5E0000 JFFS2 filesystem, little endian
Sin embargo, con la esperanza de poder pegarlo todo, dividido Flash Image en 9 archivos de acuerdo con los bloques MTD en el BootLog con dd
flash vendor: BOHONG
m25p80 spi0.0: BH25Q64 (8192 Kbytes) (55000000 Hz)
m25p80 spi0.0: change speed to 55000000Hz, div 2
Kernel code size:0x1f8012
9 rtkxxpart partitions found on MTD device m25p80
Creating 9 MTD partitions on "m25p80":
0x000000000000-0x000000800000 : "ALL"
0x000000000000-0x000000020000 : "Bootloader"
0x000000020000-0x000000030000 : "CFG"
0x000000030000-0x0000005c0000 : "KernelFS"
0x000000228012-0x0000005c0000 : "RootFS"
0x0000005c0000-0x0000005d0000 : "CFM"
0x0000005d0000-0x0000005e0000 : "CFM_BACKUP"
0x0000005e0000-0x0000007f0000 : "LOG"
0x0000007f0000-0x000000800000 : "ENV"
No estoy claro para mí por qué KernelFS y RootFS se cruzan de acuerdo con la tabla MTD.
Solo unsquashfs para desempacar el sistema de archivos. Está basado en BusyBox.
Cat /etc/passwd
root:$1$nalENqL8$jnRFwb1x5S.ygN.3nwTbG1:0:0:root:/:/bin/sh
gato /etc/shadow
root:$1$OVhtCyFa$7tISyKW1KGssHAQj1vI3i1:14319::::::
Cat /etc/inittab
::sysinit:/etc_ro/init.d/rcS
ttyS0::respawn:/sbin/sulogin
::ctrlaltdel:/bin/umount -a -r
::shutdown:/usr/sbin/usb led_off
El primer intento fue muy ingenuo: actualizar /etc/inittab y volver a colocarlo.
Cambiado ttyS0::respawn:/sbin/sulogin a ttyS0::respawn:/bin/login -f root
Actualizó el archivo, los archivos empaquetados a Squshfs Back - Ooops, es más grande de lo que era. Compresión examinada: era XZ originalmente, pero mksquashfs usó LZMA de forma predeterminada. Cambiado a XZ, ahora es bastante del mismo tamaño y se ajusta a Rootfs Mtd. Archivo de NewRootfs acolchado con FF hasta que alcanzó el tamaño original de la partición MTD. Combinado todos los archivos nuevamente en un archivo de imagen, escribido para flash, arranque ...
Booting...
init_ram
00000202 M init ddr ok
DRAM Type: DDR2
DRAM frequency: 533MHz
DRAM Size: 128MB
JEDEC id EF4017, EXT id 0x0000
found w25q64
flash vendor: Winbond
w25q64, size=8MB, erasesize=64KB, max_speed_hz=29000000Hz
auto_mode=0 addr_width=3 erase_opcode=0x000000d8
=>CPU Wake-up interrupt happen! GISR=89000004
---Realtek RTL8197F boot code at 2018.04.20-10:17+0800 v3.4.11B.9 (999MHz)
Mac addr:04-95-e6-1a-96-e0
lan_wan_isolation Initing...
config: lan port mask is 0x000000f7
config: wan port mask is 0x000000e8
lan_wan_isolation Initing has been completed.
lan_wan_isolation Initing...
config: lan port mask is 0x000000f7
config: wan port mask is 0x000000e8
lan_wan_isolation Initing has been completed.
wait for upgrage
port[0] link:down
port[1] link:down
port[2] link:down
port[3] link:down
port[4] link:down
irq:0x00008080
rootfs checksum error at 00228012!
<RealTek>
¿Cómo podría olvidarme de CRC? Pasé un par de horas tratando de encontrar una forma adecuada de calcular CRC - encontré RSDK, traté de entender la creación de imágenes ... demasiado para mi cerebro por ahora.
Intentemos algo más.
Según el registro de arranque hay un proceso netctrl que inicia temprano y cambia la contraseña de root.
argv[0] = netctrl
netctrl
prod_change_root_passwd(83)
Así que hagamos el camino duro. Intente desmontar e invertir el código. Ay. Nunca vi a Mips asm ...
Mirando a través de los archivos encontrados que muchos de ellos están utilizando prod_change_root_passwd , netctrl lo usa y parece la función misma definida en /lib/libcommonprod.so .
Open /bin/netctrl en Ida. Función abierta main . Primero borra los búferes, luego lee el parámetro sys.role de la configuración y depende de esto duerme o llama a la función externa prod_change_root_passwd sin parámetros.

Open /lib/libcommonprod.so . Abrir función prod_change_root_passw . También borra los búferes primero, luego lee algunos parámetros de config y llama Encode64() con valor wl2g.ssid0.wpapsk_psk o TD_WLAN1_SSID0_PWD .
Y luego solo establece la contraseña de root a través de la línea de comandos (echo %s;sleep 1;echo %s) | passwd root -a s> /dev/null

¡Voila!
Base64 calculada de mi contraseña predeterminada de la pegatina, conectada a través de serie ...
Normal startupGive root password for system maintenance
(or type Control-D for normal startup):
System Maintenance Mode
~ #
~ # uname -a
Linux NOVA-xxxxxxxxxxxx 3.10.90 #4 Mon Jul 2 10:57:35 CST 2018 mips GNU/Linux
Básicamente, nada interesante para ver aquí todavía. No se registra los usuarios, excepto la raíz, en el sistema.
~ # cat /proc/cpuinfo
system type : RTL8197F
machine : Unknown
processor : 0
cpu model : MIPS 24Kc V8.5
BogoMIPS : 666.41
wait instruction : yes
microsecond timers : yes
tlb_entries : 64
extra interrupt vector : yes
hardware watchpoint : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa : mips1 mips2 mips32r2
ASEs implemented : mips16
shadow register sets : 4
kscratch registers : 0
core : 1
VCED exceptions : not available
VCEI exceptions : not available
~ # ls -l /sys/class/gpio/
total 0
--w------- 1 root root 16384 Jan 1 1970 export
lrwxrwxrwx 1 root root 0 Jan 1 1970 gpio18 -> ../../devices/virtual/gpio/gpio18
lrwxrwxrwx 1 root root 0 Jan 1 1970 gpio19 -> ../../devices/virtual/gpio/gpio19
lrwxrwxrwx 1 root root 0 Jan 1 1970 gpio58 -> ../../devices/virtual/gpio/gpio58
lrwxrwxrwx 1 root root 0 Jan 1 1970 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
--w------- 1 root root 16384 Jan 1 1970 unexport
~ # ls -l /sys/devices/platform/
total 0
drwxr-xr-x 2 root root 0 Jul 18 21:12 alarmtimer
drwxr-xr-x 2 root root 0 Jul 18 21:12 rtl819x_8367r_i2c_pin.1
drwxr-xr-x 2 root root 0 Jul 18 21:12 rtl819x_8367r_i2c_pin.2
drwxr-xr-x 2 root root 0 Jul 18 21:12 rtl819x_8367r_reset_pin.0
drwxr-xr-x 2 root root 0 Jul 18 21:12 rtl819x_btn.0
drwxr-xr-x 2 root root 0 Jul 18 21:12 rtl819x_led.0
drwxr-xr-x 2 root root 0 Jul 18 21:12 rtl819x_led.1
drwxr-xr-x 2 root root 0 Jul 18 21:12 rtl819x_led.2
drwxr-xr-x 3 root root 0 Jan 1 1970 serial8250
drwxr-xr-x 3 root root 0 Jan 1 1970 spi-sheipa.0
-rw-r--r-- 1 root root 16384 Jul 18 21:12 uevent
Y aquí hay procesos que se ejecutan
~ # ps
PID USER TIME COMMAND
1 root 0:01 init
2 root 0:00 [kthreadd]
3 root 0:40 [ksoftirqd/0]
4 root 0:00 [kworker/0:0]
5 root 0:00 [kworker/0:0H]
6 root 0:01 [kworker/u2:0]
7 root 0:00 [khelper]
8 root 0:00 [kworker/u2:1]
75 root 0:00 [writeback]
78 root 0:00 [bioset]
79 root 0:00 [crypto]
81 root 0:00 [kblockd]
84 root 0:01 [spi0]
102 root 0:00 [kworker/0:1]
106 root 0:00 [kswapd0]
154 root 0:00 [fsnotify_mark]
708 root 0:00 [mtdblock0]
713 root 0:00 [mtdblock1]
718 root 0:00 [mtdblock2]
723 root 0:00 [mtdblock3]
728 root 0:00 [mtdblock4]
733 root 0:00 [mtdblock5]
738 root 0:00 [mtdblock6]
743 root 0:00 [mtdblock7]
748 root 0:00 [mtdblock8]
802 root 0:00 [deferwq]
860 root 0:03 klogd -n
862 root 0:00 monitor
863 root 1:55 sh /usr/bin/ugw_watchdog.sh
869 root 0:00 syslogd -f /var/etc/syslog.conf -s 50
914 root 0:15 cfmd
1030 root 0:00 [jffs2_gcd_mtd7]
1032 root 0:11 timer
1033 root 0:00 logserver
1034 root 0:14 netctrl
1069 root 0:01 device_list
1071 root 3:20 sh /usr/bin/mesh_op.sh
1530 root 0:10 pann
1531 root 0:00 gpio_ctrl
1532 root 0:00 mesh_status_check
1534 root 0:19 network_check
1570 root 0:00 redis-server /etc_ro/redis.conf
1571 root 0:01 cmdsrv -l tcp://0.0.0.0:12598 -R tcp://127.0.0.1:6379
1572 root 0:00 [kworker/0:1H]
1573 root 0:05 confsrv
1599 root 0:01 dhcps -C /etc/dhcps.conf -l /etc/dhcps.leases -x /etc/dhc
1931 root 0:00 ucloud -l 4
1962 root 0:00 sntp 1 28800 43200
2370 root 0:00 ftd -br br0 -w wlan0 wlan1 -pid /var/run/ft.pid -c /tmp/f
2375 root 0:00 pathsel -i wlan-msh -P -t 9
2387 root 0:00 multiWAN
2488 root 0:00 dhcpcd_wan1 -c /etc/wan1.ini -m 1 eth1 -h NOVA-0495e61a96
2567 root 0:00 dnrd -t 3 -M 600 --cache=off -b -R /etc/dnrd -r 3 -s 192.
2955 root 0:00 miniupnpd -f /etc/miniupnpd.config -w
2991 root 0:00 igmpproxy
10388 root 0:00 -sh
12125 root 0:00 sleep 5
12155 root 0:00 sleep 1
12156 root 0:00 ps
Tengo acceso a la raíz al nuevo Tenda MW6, que me hace feliz ya que odio tener cajas negras.
La contraseña de root es solo su contraseña WiFi actual, codificada con Base64.
(Gracias a @crees para terminar la investigación de DHCP. Probado en MW5, pero tiene un software similar)
La utilidad cfm se puede descubrir en los scripts in /usr/sbin , y se utiliza para manipular los parámetros que persisten a través de los reinicios (puede inspeccionar la tienda directamente con cat /dev/mtd5 ).
~ # cfm get ^dhcps
dhcps.Staticip1=
dhcps.Staticnum=0
dhcps.apmode.list1=1;br1;192.168.1.31;192.168.1.254;192.168.1.1;255.255.255.0;1440;192.168.1.66;192.168.1.70;host
dhcps.apmode.list2=1;br1;192.168.1.2;192.168.1.30;192.168.1.1;255.255.255.0;1440;192.168.1.66;192.168.1.70;dev
dhcps.en=1
dhcps.list1=1;br0;192.168.1.31;192.168.1.254;192.168.1.1;255.255.255.0;1440;192.168.1.1;;host
dhcps.list2=1;br0;192.168.1.2;192.168.1.30;192.168.1.1;255.255.255.0;1440;192.168.1.1;;dev
dhcps.listnum=2
dhcps.static.list1=1 14:DA:E9:38:EC:40 192.168.1.70
dhcps.static.listnum=1
En general, primero deberá configurar el reenvío de puertos, ya que de lo contrario la interfaz de usuario puede no reconocer su dispositivo.
Para dhcps.listnum , si lo establece en 0, no escribe a /etc/dhcps.conf en reboot, deshabilitando así DHCPS.
~ # cfm set dhcps.listnum 0
Esto persistirá a través de los reinicios, y se puede deshacer fácilmente cambiando dhcps.listnum a su valor original, y un reinicio de fábrica también lo reinvertirá.
Solo se le permite 8 reglas de reenvío de puertos en la aplicación, lo cual es bastante limitante. Configuración de un DMZ Works (o también puede meterse con las reglas de reenvío utilizando CFM: las reglas VirtualSer se ven bastante directas.
~ # cfm set wan1.dmzip ip.address.here
~ # cfm set wan1.dmzen 1
~ # reboot
Parece que muchas lógicas comerciales se realizan en C/C ++ y se compilan (frente a muchos scripts). Otra complicación es que no se superponga FS, todos los R/O montados, excepto /dev/mtdblock7 ON /tmp/log/crash type jffs2 (rw,relatime) : las configuraciones se almacenan directamente en /dev/mtd5 y se manipulan usando cfm .
Eso fue divertido.