Sagen wir ... nur zum Spaß ... ich habe 2 x 3 Packs Tenda MW6, um große Flächen (drinnen und draußen) abzudecken. Ich hatte 3 von meinem MW6 -Backhaud mit Ethernet (eigentlich sind es Plc Bridge -Adapter).
In der "Standard" -Konfiguration funktioniert es in Ordnung, aber ich hatte bereits einen guten OpenWRT -Router und mehrere Geräte/Dienste eingerichtet. Von Defaul arbeitet MW6 im DHCP -Modus, erstellt 192.168.5.x Subnetz und setzt alle dorthin ein. Aber dies 1) bringt zusätzliche NAT -Schicht mit, 2) bricht meine Dienste.
Deshalb habe ich mich entschlossen, es in den Bridge -Modus zu wechseln, in dem es laut Handbuch alle Networkdienste ausschalten und einfach als Brücke fungiert.
Aus dem ersten Blick hat es funktioniert, aber dann wurde mir klar Luna Park mit Blackjack und Nutten DHCP -Server. Es gibt absolut keine Web -Administratoin -Seite, nur eine Telefon -App. Ich sehe keine Möglichkeiten, es von dort aus zu deaktivieren.
Laut NMAP wird der DHCP -Server ausgeführt, der alle WLAN -Clients abfängt und IP -Adressen aus seinem Pool angibt. Und unnötig zu sagen, dass diese Adressen falsch sind, nicht das, was ich brauche. Googled, fand ihre Unterstützung - das gleiche Problem, aber Person sagt, dass dhcp authoritative='1' auf dem Hauptrouter von OpenWrt für ihn arbeitet, aber es hat nie für mich funktioniert.
Also habe ich mit der Untersuchung begonnen - wie kann ich den DHCP -Server deaktivieren?
Nur wenige Häfen wurden am Würfel geöffnet. Nichts sieht von Anfang an aus wie Telnet oder SSH, aber nachdem ich mich mit UART angeschlossen hatte, bemerkte ich, dass Telnetd beim Halten von 3 Sekunden lang die Button -RESET -Taste startet (6 Sekunden bringt die Standardeinstellungen zurück).
PORT STATE SERVICE
23/tcp open telnet <--- opened only after you hold Reset for 3 seconds
5500/tcp open hotline
9000/tcp open cslistener
Der DHCP -Server ist auf
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
Genauere Prüfung der Firmware, die erforderlich ist, um zu verstehen, was und wann geöffnet wird.
Ich habe Root/Admin/Support/Benutzer mit admin/password/user/1234/12345678 Passwörtern und einem anderen ausprobiert. Nein, nicht funktionieren.
Das Öffnen des Würfels ist sehr einfach. Aus interessantem - UART Socket und SOIC -8 SPI Blitz. Hauptchip von Kühler geschlossen - Realtek RTL8197f

115200 8n1. Ausgehend von Pin 1 (näher am SPI -Flash): VCC, RX, TX, GND.
Bohong BH25Q64 SPI Flash, 8MB. Datenblatt
Firmware ist im Web nicht verfügbar. Die Telefon -App sucht das in Tenda Cloud und lädt sich selbst herunter. Meine Würfel haben die neueste Firmware, kann also nicht über das Netzwerk schnüffeln, wo es neu ist. Ich kann nur sagen, dass diese App ein eigenes Kommunikationsprotokoll mit Tenda Cloud hat.
Leider hat Chip Clamp nicht funktioniert, es führt das ganze Gerät auf und beginnt mit der Kommunikation mit Chip. Völlig entleert. Vergessen Sie nicht Capon Tape. 
Ich lese nicht jeden Tag Flash -Chips und besitze dafür kein spezielles Programmiergerät. Ich fand jedoch das FTDI FT2232H -Gerät, das ich als OpenOCD -JTAG -Debugger für ESP32 verwendet habe. Dieser Chip verfügt über den SPI -Modus und kann als Master funktionieren. Pinout stammt aus dem Datenblatt.
| FT2232H -Port | Funktion | Flash -Chip -Stift |
|---|---|---|
| Adbus0 | Sck | 6 |
| Adbus1 | Mosi | 5 |
| Adbus2 | Miso | 2 |
| Adbus3 | CS | 1 |
Andere Flash -Chip -Pins 4 - GND, 8 - VCC 3,3 V, 3 und 7 gehen nach VCC.

$ flashrom -p ft2232_spi:type=2232H,port=A
Und es bringt nur Traurigkeit ...
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.
Ich habe mich umgesehen und die Site SKProj mit Sketch und .NET -App (in Russisch) gefunden, die für mich gut geeignet war, chinesischen Flash -Chip zu lesen.
Ich habe NodeMcu ESP8266 -Board verwendet, da es 3,3 V ist und ich nicht an eine 5 -V -3 -V -Konvertierung nachdenken wollte.
Wichtig : SPI-Chip ist gemäß offizielle Dokumentation mit HSPI-Pins GPIO12-GPIO14 angeschlossen.
serprog -Firmware für Arduinos, die mit flashrom arbeiten, aber ich konnte seinen Port für ESP8266 nicht schnell finden 
Um das Blinken zu erleichtern, habe ich das Paar Winbond W25Q64FV Chips gekauft. Sie arbeiten richtig mit flashrom und ich muss keine Windows zum Flash -Chip ausführen. Ich schrieb Flash Dump zu einem neuen Chip mit
flashrom -p ft2232_spi:type=2232H,port=A -w image.bin
Tenda Bootloader erkannte einen neuen Flash -Chip und startete normal.
Gerade Binwalk liefert viele regelmäßige Erkenntnisse.
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
In der Hoffnung, alles wieder zusammenkleben zu können, trenne ich das Flash -Image in 9 Dateien gemäß MTD -Blöcken im Bootlog mit 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"
Nicht klar für mich, warum sich KernelFS und RootFS gemäß der MTD -Tabelle kreuzen.
Nur unsquashfs um das Dateisystem auszupacken. Es basiert auf viel Besuch.
Katze /etc/passwd
root:$1$nalENqL8$jnRFwb1x5S.ygN.3nwTbG1:0:0:root:/:/bin/sh
/etc/shadow
root:$1$OVhtCyFa$7tISyKW1KGssHAQj1vI3i1:14319::::::
Katze /etc/inittab
::sysinit:/etc_ro/init.d/rcS
ttyS0::respawn:/sbin/sulogin
::ctrlaltdel:/bin/umount -a -r
::shutdown:/usr/sbin/usb led_off
Der erste Versuch war sehr naiv: Aktualisieren wir /etc/inittab und setzen Sie es zurück.
Geändert ttyS0::respawn:/sbin/sulogin zu ttyS0::respawn:/bin/login -f root
Aktualisierte die Datei, gepackte Dateien an SQUSHFS zurück - ooops, es ist größer als sie war. Untersuchte Komprimierung - ursprünglich war es XZ , aber mksquashfs verwendete lzma standardmäßig. In XZ geändert, jetzt ist es ziemlich gleich und passt zu Rootfs MTD. Die gepolsterte Newrootfs -Datei mit FF bis sie die ursprüngliche MTD -Partitionsgröße erreichte. Kombinierte alle Dateien wieder in eine Bilddatei, schrieb an Flash, Booten ...
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>
Wie konnte ich CRC vergessen? Ich habe ein paar Stunden damit verbracht, die richtige Möglichkeit zu finden, um CRC zu berechnen - RSDK gefunden, versuchte, Bilderstellung zu verstehen ... für mein Gehirn zu viel zu viel.
Versuchen wir etwas anderes.
Laut dem Boot -Protokoll gibt es netctrl -Prozess, der frühzeitig beginnt und das Stammkennwort ändert.
argv[0] = netctrl
netctrl
prod_change_root_passwd(83)
Also lass uns die harte Tour machen. Versuchen Sie, den Code zu zerlegen und umzukehren. Autsch. Ich habe MIPS NIEMALS ASM gesehen ...
Wenn Sie durch die Dateien suchen, die gefunden wurden, verwenden viele von ihnen prod_change_root_passwd . netctrl verwendet sie und sieht aus wie die Funktion selbst in /lib/libcommonprod.so .
Öffnen /bin/netctrl in IDA. Offene Funktion main . Zuerst löscht es Puffer, dann liest sich der Parameter sys.role aus der Konfiguration und hängt davon ab, dass dies entweder schläft oder die externe Funktion aufruft prod_change_root_passwd ohne Parameter.

Open /lib/libcommonprod.so . Öffnen Sie die Funktion prod_change_root_passw . Löscht auch Puffer zuerst, liest dann einige Parameter aus der Konfiguration und ruft Encode64() mit Wert entweder wl2g.ssid0.wpapsk_psk oder TD_WLAN1_SSID0_PWD auf.
Und legt dann nur das Root -Passwort über die Befehlszeile fest (echo %s;sleep 1;echo %s) | passwd root -a s> /dev/null

Voila!
Berechnet Basis64 meines Standardkennworts aus dem Aufkleber, das über serielle ...
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
Grundsätzlich noch nichts Interessantes hier zu sehen. Keine Benutzer außer dem Root sind im System registriert.
~ # 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
Und hier sind Prozesse, die ausgeführt werden
~ # 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
Ich habe einen Root -Zugang zu neuen Tenda MW6, das mich glücklich macht, da ich es hasse, schwarze Kisten zu haben.
Root -Passwort ist nur Ihr aktuelles WLAN -Passwort, das mit Base64 codiert ist.
(Vielen Dank an @Crees, um die DHCP -Forschung zu beenden. Getestet auf MW5, aber es hat eine ähnliche Software)
Das cfm -Dienstprogramm kann in den Skripten in /usr/sbin entdeckt werden und wird verwendet, um die Parameter zu manipulieren, die über Neustarts hinweg bestehen (Sie können den Speicher direkt mit cat /dev/mtd5 überprüfen).
~ # 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
Im Allgemeinen müssen Sie zuerst die Portweiterleitung einrichten, da die Benutzeroberfläche Ihr Gerät ansonsten möglicherweise nicht erkennen.
Wenn Sie es für dhcps.listnum auf 0 festlegen, schreibt es nicht a /etc/dhcps.conf beim Neustart, wodurch DHCPS deaktiviert wird.
~ # cfm set dhcps.listnum 0
Dies bleibt über Neustarts hinweg bestehen und kann leicht rückgängig gemacht werden, indem DHCPs.Listnum wieder in den ursprünglichen Wert geändert wird, und ein Werksreset wird es ebenfalls umkehren.
Sie werden nur 8 Portweiterleiterregeln in der App zugelassen, was ziemlich einschränkend ist. Das Einrichten einer DMZ-Funktionen (oder Sie können auch mit den Weiterleitungsregeln mit CFM- Die VirtualSer-Regeln aussehen, sieht ziemlich einfach aus.
~ # cfm set wan1.dmzip ip.address.here
~ # cfm set wan1.dmzen 1
~ # reboot
Sieht so aus, als würden viele Geschäftslogik in C/C ++ und kompiliert (gegen viele Skripte machen). Eine weitere Komplikation ist kein Overlay FS, alle montiertes R/O, außer für /dev/mtdblock7 on /tmp/log/crash type jffs2 (rw,relatime) - die Einstellungen werden direkt in /dev/mtd5 gespeichert und mit cfm manipuliert.
Das hat Spaß gemacht.