Disons ... juste pour le plaisir .. J'ai obtenu 2 x 3 packs de Tenda MW6 pour couvrir la grande surface (à l'intérieur et à l'extérieur). J'ai eu 3 de mon MW6 Backhauled avec Ethernet (en fait, ce sont les adaptateurs de pont PLC).
Dans la configuration "par défaut", cela fonctionne bien, mais j'ai déjà eu un bon routeur OpenWRT et plusieurs périphériques / services configurés. Par Defaul, MW6 fonctionne en mode DHCP, crée le sous-réseau 192.168.5.x et y met tout le monde. Mais ce 1) apporte une couche NAT supplémentaire, 2) brise mes services.
J'ai donc décidé de le passer en mode pont , dans lequel, selon le manuel, il désactivera tous ses services de réseau et agira simplement comme un pont.
Dès le premier coup d'œil, cela a fonctionné, mais j'ai réalisé que certains de mes appareils avaient mal à IPS et j'ai ensuite compris que le cube "principal" exécute le sien Park Luna avec blackjack et prostituées Serveur DHCP. Il n'y a absolument pas de page d'administration Web, uniquement de l'application de téléphone. Je ne vois aucun moyen de le désactiver à partir de là.
NMAP dit que le serveur DHCP est en cours d'exécution et intercepte tous les clients WiFi et donne des adresses IP à partir de son pool. Et il va sans dire que ces adresses sont erronées, pas ce dont j'ai besoin. Googled, a trouvé leur soutien - le même problème, mais la personne dit que dhcp authoritative='1' sur le routeur OpenWrt principal fonctionne pour lui, mais cela n'a jamais fonctionné pour moi.
J'ai donc commencé à enquêter - comment puis-je désactiver le serveur DHCP.
Peu de ports se sont ouverts sur le cube. Rien ne ressemble à Telnet ou SSH depuis le début, mais après avoir été connecté à UART - j'ai remarqué que Telnetd commence lorsque vous maintenez le bouton de réinitialisation pendant 3 secondes (6 secondes ramène les paramètres par défaut).
PORT STATE SERVICE
23/tcp open telnet <--- opened only after you hold Reset for 3 seconds
5500/tcp open hotline
9000/tcp open cslistener
Le serveur DHCP est en place
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 plus approfondi du firmware requis pour comprendre ce qui est ouvert et quand.
J'ai essayé root / admin / support / utilisateur avec admin / mot de passe / utilisateur / 1234/12345678 mots de passe et d'autres .. non, ne fonctionnant pas.
L'ouverture du cube est très simple. Par intéressant - socket UART et SOIC-8 SPI Flash. Chip principal fermé par radiateur - Realtek RTL8197F

115200 8N1. À partir de la broche 1 (plus proche de SPI Flash): VCC, RX, TX, GND.
Bohong BH25Q64 SPI Flash, 8 Mo. Fiche de données
Le firmware n'est pas disponible sur le Web. L'application téléphonique recherche cela dans Tenda Cloud et se télécharge. Mes cubes ont le dernier firmware, donc je ne peux pas renifler le réseau où il faut nouveau. Je peux dire que cette application a son propre protocole de communication avec Tenda Cloud.
Malheureusement, Chip Blamp n'a pas fonctionné, il alimente entier un appareil et il commence à communiquer avec la puce. Le dessemblant complètement. N'oubliez pas Capton Tape. 
Je ne lis pas les puces flash tous les jours et je ne possède pas de dispositif de programmation spécial pour cela. Cependant, j'ai trouvé le périphérique FTDI FT2232H, que j'ai utilisé comme débogueur JTAG OpenOCD pour ESP32. Cette puce a un mode SPI et peut fonctionner comme maître. Pinout est tiré de la fiche technique.
| Port FT2232H | Fonction | Épingle à puce flash |
|---|---|---|
| Adbus0 | SCK | 6 |
| Adbus1 | Mosi | 5 |
| Adbus2 | Miso | 2 |
| Adbus3 | CS | 1 |
Autres broches de puce flash 4 - GND, 8 - VCC 3.3V, 3 et 7 VOIR à VCC.

$ flashrom -p ft2232_spi:type=2232H,port=A
Et cela n'apporte que la tristesse ...
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.
J'ai regardé autour de lui et a trouvé le site Skproj avec Sketch et .NET App (en russe) qui a bien fonctionné pour moi de lire la puce flash chinoise.
J'ai utilisé la carte Nodemcu ESP8266 car elle est de 3,3 V et je ne voulais pas penser à la conversion de niveau 5V <> 3V.
IMPORTANT : La puce SPI doit être connectée aux broches HSPI GPIO12-GPIO14 conformément à la documentation officielle.
serprog pour les arduinos qui fonctionnent avec flashrom , mais je n'ai pas pu trouver rapidement son port pour ESP8266 
Pour faciliter le clignotement, je viens d'acheter un couple Winbond W25Q64FV Chips. Ils fonctionnent correctement avec flashrom et je n'ai pas besoin d'exécuter Windows sur la puce Flash. J'ai écrit Flash Dump sur une nouvelle puce avec
flashrom -p ft2232_spi:type=2232H,port=A -w image.bin
Tenda Bootloader a détecté une nouvelle puce flash et a commencé normalement.
La course droite de Binwalk donne beaucoup de résultats réguliers.
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
Cependant, avec l'espoir de pouvoir tout coller ensemble, je divise l'image Flash à 9 fichiers selon les blocs MTD dans le bootlog avec 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"
Pas clair pour moi pourquoi KernelFS et RootFS se croisent selon la table MTD.
Il unsquashfs de déballer le système de fichiers. Sa bustebox basée.
chat /etc/passwd
root:$1$nalENqL8$jnRFwb1x5S.ygN.3nwTbG1:0:0:root:/:/bin/sh
chat /etc/shadow
root:$1$OVhtCyFa$7tISyKW1KGssHAQj1vI3i1:14319::::::
chat /etc/inittab
::sysinit:/etc_ro/init.d/rcS
ttyS0::respawn:/sbin/sulogin
::ctrlaltdel:/bin/umount -a -r
::shutdown:/usr/sbin/usb led_off
Le premier essai a été très naïf: permet de mettre à jour /etc/inittab et de le remettre.
Modification de ttyS0::respawn:/sbin/sulogin en ttyS0::respawn:/bin/login -f root
Mise à jour du fichier, des fichiers emballés sur SQUSHFS Back - Ooops, c'est plus grand qu'il ne l'était. Compression examinée - c'était à l'origine XZ , mais mksquashfs a utilisé LZMA par défaut. Changé en XZ, maintenant il a la même taille et s'adapte à rootfs mtd. Fichier Newrootfs rembourré avec FF jusqu'à ce qu'il atteigne la taille de la partition MTD d'origine. Combiné tous les fichiers dans un fichier d'image, écrit à Flash, démarrant ...
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>
Comment pourrais-je oublier le CRC ... J'ai passé quelques heures à essayer de trouver un moyen approprié de calculer le CRC - trouvé RSDK, j'ai essayé de comprendre la création d'images ... trop pour mon cerveau pour l'instant.
Essayons autre chose.
Selon le journal de démarrage, il existe un processus netctrl qui démarre tôt et modifie le mot de passe racine.
argv[0] = netctrl
netctrl
prod_change_root_passwd(83)
Alors faisons la dure. Essayez de démonter et d'inverser le code. Aie. Jamais vu MIPS asm ...
En regardant les fichiers trouvés dont beaucoup utilisent prod_change_root_passwd , netctrl l'utilise et ressemble à la fonction elle-même définie dans /lib/libcommonprod.so .
Ouvert /bin/netctrl dans ida. Fonction ouverte main . Il efface d'abord les tampons, puis lit le paramètre sys.role à partir de la configuration et dépend de ce dort ou appelle la fonction externe prod_change_root_passwd sans paramètres.

Open /lib/libcommonprod.so . Fonction ouverte prod_change_root_passw . Effiche également les tampons d'abord, puis lit certains paramètres à partir de config et appelle Encode64() avec la valeur soit wl2g.ssid0.wpapsk_psk ou TD_WLAN1_SSID0_PWD .
Et puis définit simplement le mot de passe racine via la ligne de commande (echo %s;sleep 1;echo %s) | passwd root -a s> /dev/null

Le tour est joué!
Base64 calculé de mon mot de passe par défaut de l'autocollant, connecté via Serial ...
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
Fondamentalement, rien d'intéressant à voir encore ici. Aucun utilisateur, à l'exception de la racine, n'est enregistré dans le système.
~ # 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
Et voici des processus en cours d'exécution
~ # 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
J'ai un accès en profondeur à New Tenda MW6, qui me rend heureux car je déteste avoir des boîtes noires.
Le mot de passe racine n'est que votre mot de passe wifi actuel, encodé avec Base64.
(Merci à @crees pour terminer la recherche DHCP. Testé sur MW5, mais il a un logiciel similaire)
L'utilitaire cfm peut être découvert dans les scripts dans /usr/sbin , et est utilisé pour manipuler les paramètres qui persistent à travers les redémarrages (vous pouvez inspecter le magasin directement avec 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
Généralement, vous devrez d'abord configurer le transfert de port, car sinon l'interface utilisateur peut ne pas reconnaître votre appareil.
Pour dhcps.listnum , si vous le définissez sur 0, il n'écrit pas a /etc/dhcps.conf sur le redémarrage, désactivant ainsi DHCPS.
~ # cfm set dhcps.listnum 0
Cela persistera à travers les redémarrages et peut être facilement annulé en changeant dhcps.listnum à sa valeur d'origine, et une réinitialisation d'usine l'inversera également.
Vous n'êtes autorisé que 8 règles de transfert de port dans l'application, ce qui est assez limitatif. La configuration d'un DMZ fonctionne (ou vous pouvez également jouer avec les règles de transfert en utilisant CFM - les règles VirtualSer semblent assez simples.
~ # cfm set wan1.dmzip ip.address.here
~ # cfm set wan1.dmzen 1
~ # reboot
On dirait que de nombreuses logiques commerciales se font en C / C ++ et compilées (vs fabriquant beaucoup de scripts). Une autre complication n'est pas une superposition FS, toutes R / O montées à l'exception de /dev/mtdblock7 sur /tmp/log/crash type jffs2 (rw,relatime) - les paramètres sont stockés directement dans /dev/mtd5 et manipulés à l'aide de cfm .
C'était amusant.