Katakanlah ... hanya untuk bersenang-senang .. Saya mendapat 2 x 3-paket Tenda MW6 untuk mencakup area besar (di dalam dan di luar ruangan). Saya memiliki 3 MW6 saya yang mundur dengan Ethernet (sebenarnya, ini adalah adaptor jembatan PLC).
Dalam konfigurasi "Default" berfungsi dengan baik, namun saya sudah memiliki router openwrt yang baik dan beberapa perangkat/layanan diatur. Oleh DeFaul, MW6 bekerja dalam mode DHCP, menciptakan subnet 192.168.5.x dan menempatkan semua orang di sana. Tapi ini 1) membawa lapisan Nat ekstra, 2) merusak layanan saya.
Jadi saya memutuskan untuk beralih ke mode jembatan , di mana, menurut manual, itu akan mematikan semua layanan jaringannya dan hanya bertindak sebagai jembatan.
Dari pandangan pertama itu berhasil, tetapi kemudian saya menyadari bahwa beberapa perangkat saya salah dan kemudian memahami bahwa kubus "utama" berjalan sendiri Taman Luna dengan blackjack dan pelacur Server DHCP. Sama sekali tidak ada halaman administrato web, hanya aplikasi telepon. Saya tidak melihat cara untuk menonaktifkannya dari sana.
NMAP mengatakan server DHCP sedang berjalan, dan mencegat semua klien WiFi dan memberikan alamat IP dari kumpulannya. Dan tak perlu dikatakan alamat ini salah, bukan yang saya butuhkan. Googled, menemukan dukungan mereka - masalah yang sama, namun orang mengatakan dhcp authoritative='1' pada router openwrt utama bekerja untuknya, tetapi itu tidak pernah berhasil bagi saya.
Jadi saya mulai investigasi - bagaimana saya bisa menonaktifkan server DHCP.
Beberapa port dibuka di kubus. Tidak ada yang terlihat seperti Telnet atau SSH dari awal, namun setelah saya terhubung ke UART - saya perhatikan bahwa Telnetd mulai ketika Anda menahan tombol reset selama 3 detik (6 detik membawa kembali pengaturan default).
PORT STATE SERVICE
23/tcp open telnet <--- opened only after you hold Reset for 3 seconds
5500/tcp open hotline
9000/tcp open cslistener
Server DHCP sudah habis
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
Pemeriksaan lebih dekat dari firmware diperlukan untuk memahami apa yang dibuka dan kapan.
Saya mencoba root/admin/dukungan/pengguna dengan admin/kata sandi/pengguna/1234/12345678 kata sandi dan beberapa lainnya .. tidak, tidak berfungsi.
Membuka kubus sangat mudah. Keluar dari Soket UART yang menarik dan SOIC -8 SPI Flash. Chip utama ditutup oleh Radiator - Realtek RTL8197F

115200 8n1. Mulai dari pin 1 (lebih dekat ke flash SPI): VCC, RX, TX, GND.
Bohong BH25Q64 SPI Flash, 8MB. Lembar data
Firmware tidak tersedia di web. Aplikasi telepon mencarinya di Tenda Cloud dan mengunduh sendiri. Kubus saya memiliki firmware terbaru, jadi tidak bisa menghirup jaringan di mana itu membutuhkan yang baru. Hanya saya yang bisa mengatakan aplikasi ini memiliki protokol komunikasi sendiri dengan Tenda Cloud.
Sayangnya klem chip tidak berfungsi, itu menggerakkan seluruh perangkat dan mulai berkomunikasi dengan chip. Desoldered sepenuhnya. Jangan lupa Capton Tape. 
Saya tidak membaca chip flash setiap hari dan saya tidak memiliki perangkat pemrograman khusus untuk ini. Namun saya menemukan perangkat FTDI FT2232H, yang saya gunakan sebagai OpenOCD JTAG Debugger untuk ESP32. Chip ini memiliki mode SPI dan dapat berfungsi sebagai master. Pinout diambil dari lembar data.
| Port FT2232H | Fungsi | Flash Chip Pin |
|---|---|---|
| Adbus0 | Sck | 6 |
| Adbus1 | Mosi | 5 |
| Adbus2 | Miso | 2 |
| Adbus3 | CS | 1 |
Pin chip flash lainnya 4 - GND, 8 - VCC 3.3V, 3 dan 7 Pergi ke VCC.

$ flashrom -p ft2232_spi:type=2232H,port=A
dan itu hanya membawa kesedihan ...
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.
Melihat sekeliling dan menemukan situs Skproj dengan sketsa dan aplikasi .NET (dalam bahasa Rusia) yang bekerja dengan baik bagi saya untuk membaca chip flash Cina.
Saya menggunakan papan NODEMCU ESP8266 karena 3,3V dan saya tidak ingin memikirkan konversi level 5V <> 3V.
Penting : Chip SPI harus dihubungkan ke pin HSPI GPIO12-GPIO14 sesuai dokumentasi resmi.
serprog untuk Arduinos yang bekerja dengan flashrom , tetapi saya tidak dapat dengan cepat menemukan portnya untuk ESP8266 
Untuk membuat flash lebih mudah, saya baru saja membeli pasangan Winbond W25Q64FV. Mereka bekerja dengan benar dengan flashrom dan saya tidak perlu menjalankan Windows untuk mem -flash chip. Saya menulis flash dump ke chip baru dengan
flashrom -p ft2232_spi:type=2232H,port=A -w image.bin
Tenda Bootloader mendeteksi chip flash baru dan dimulai secara normal.
Lurus Binwalk memberikan banyak temuan rutin.
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
Namun dengan harapan dapat merekatkan semuanya kembali, saya membagi gambar flash menjadi 9 file sesuai dengan blok MTD di bootlog dengan 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"
Tidak jelas bagi saya mengapa KernelFS dan RootFS berpotongan sesuai dengan tabel MTD.
Hanya unsquashfs ke Sistem File Membongkar. Berbasis kotak sibuk.
Cat /etc/passwd
root:$1$nalENqL8$jnRFwb1x5S.ygN.3nwTbG1:0:0:root:/:/bin/sh
Cat /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
Percobaan pertama sangat naif: mari kita perbarui /etc/inittab dan kembalikan.
Diubah ttyS0::respawn:/sbin/sulogin ke ttyS0::respawn:/bin/login -f root
Memperbarui file, file dikemas ke SQUSHFS kembali - ooops, lebih besar dari sebelumnya. Periksa kompresi - awalnya XZ , tetapi mksquashfs menggunakan LZMA secara default. Diubah menjadi XZ, sekarang ukurannya cukup sama dan cocok dengan rootfs mtd. File NewRootfs empuk dengan FF sampai mencapai ukuran partisi MTD asli. Menggabungkan semua file kembali ke dalam satu file gambar, menulis ke flash, booting ...
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>
Bagaimana saya bisa melupakan CRC ... Saya menghabiskan beberapa jam mencoba mencari tahu cara yang tepat untuk menghitung CRC - menemukan RSDK, mencoba memahami penciptaan gambar ... terlalu banyak untuk otak saya untuk saat ini.
Mari kita coba sesuatu yang lain.
Menurut log boot ada proses netctrl yang dimulai lebih awal dan mengubah kata sandi root.
argv[0] = netctrl
netctrl
prod_change_root_passwd(83)
Jadi mari kita lakukan dengan cara yang sulit. Cobalah untuk membongkar dan membalikkan kode. Aduh. Tidak pernah melihat mips asm ...
Melihat melalui file yang ditemukan banyak dari mereka menggunakan prod_change_root_passwd , netctrl menggunakannya dan terlihat seperti fungsi itu sendiri yang didefinisikan dalam /lib/libcommonprod.so .
Buka /bin/netctrl di IDA. Fungsi Terbuka main . Ini membersihkan buffer terlebih dahulu, lalu membaca parameter sys.role dari konfigurasi dan tergantung pada ini baik tidur atau panggilan fungsi eksternal prod_change_root_passwd tanpa parameter.

Buka /lib/libcommonprod.so . Buka fungsi prod_change_root_passw . Juga menghapus buffer terlebih dahulu, kemudian membaca beberapa parameter dari konfigurasi dan panggilan Encode64() dengan nilai baik wl2g.ssid0.wpapsk_psk atau TD_WLAN1_SSID0_PWD .
Dan kemudian hanya mengatur kata sandi root melalui baris perintah (echo %s;sleep 1;echo %s) | passwd root -a s> /dev/null

Voila!
Basis yang dihitung 64 dari kata sandi default saya dari stiker, terhubung melalui 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
Pada dasarnya belum ada yang menarik untuk dilihat di sini. Tidak ada pengguna kecuali root yang terdaftar dalam sistem.
~ # 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
Dan di sini proses berjalan
~ # 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
Saya memiliki akses root ke baru Tenda MW6, itu membuat saya bahagia karena saya benci memiliki kotak hitam.
Kata sandi root hanyalah kata sandi wifi Anda saat ini, dikodekan dengan base64.
(Terima kasih kepada @crees untuk menyelesaikan penelitian DHCP. Diuji pada MW5, tetapi memiliki perangkat lunak yang serupa)
Utilitas cfm dapat ditemukan dalam skrip di /usr/sbin , dan digunakan untuk memanipulasi parameter yang bertahan di seluruh reboot (Anda dapat memeriksa toko secara langsung dengan 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
Secara umum Anda harus mengatur penerusan port terlebih dahulu, karena jika tidak, UI mungkin tidak mengenali perangkat Anda.
Untuk dhcps.listnum , jika Anda mengaturnya ke 0, itu tidak menulis a /etc/dhcps.conf di reboot, sehingga menonaktifkan DHCP.
~ # cfm set dhcps.listnum 0
Ini akan bertahan di seluruh reboot, dan dapat dengan mudah dibatalkan dengan mengubah DHCPS.listnum kembali ke nilai aslinya, dan reset pabrik juga akan membalikkannya.
Anda hanya diizinkan 8 aturan penerusan port di aplikasi, yang cukup terbatas. Menyiapkan pekerjaan DMZ (atau Anda juga dapat mengacaukan aturan penerusan menggunakan CFM- aturan virtualser terlihat cukup mudah.
~ # cfm set wan1.dmzip ip.address.here
~ # cfm set wan1.dmzen 1
~ # reboot
Sepertinya banyak logika bisnis dilakukan dalam C/C ++ dan dikompilasi (vs membuat banyak skrip). Komplikasi lain adalah tidak ada overlay FS, semua R/O yang dipasang kecuali untuk /dev/mtdblock7 ON /tmp/log/crash type jffs2 (rw,relatime) - Pengaturan disimpan langsung di /dev/mtd5 dan dimanipulasi menggunakan cfm .
Itu menyenangkan.