말씀 드리겠습니다 ... 재미를 위해 .. 나는 큰 지역 (실내와 야외)을 덮기 위해 2 x 3 팩의 tenda mw6을 얻었습니다. MW6 중 3 개가 이더넷으로 백홀을했습니다 (실제로는 PLC 브리지 어댑터).
"Default"구성에서는 잘 작동하지만 이미 OpenWrt 라우터와 여러 장치/서비스가 설정되어 있습니다. 기본적으로 MW6은 DHCP 모드에서 작동하며 192.168.5.X 서브넷을 생성하고 모든 사람을 거기에 넣습니다. 그러나 이것은 1) 추가 NAT 레이어를 제공합니다. 2) 내 서비스를 중단합니다.
그래서 나는 그것을 브리지 모드로 전환하기로 결정했습니다. 매뉴얼에 따르면 모든 네트워크 서비스를 끄고 브리지 역할을합니다.
처음부터 그것은 효과가 있었지만, 나는 내 장치 중 일부가 잘못된 IP를 가지고 있다는 것을 깨달은 다음 "Main"Cube가 자체적으로 실행된다는 것을 이해했습니다. 블랙 잭과 후커와 루나 파크 DHCP 서버. 웹 관리자 페이지가없고 전화 앱 만 있습니다. 나는 거기에서 그것을 비활성화 할 방법이 없습니다.
NMAP는 DHCP 서버가 실행 중이며 모든 WiFi 클라이언트를 가로 채고 풀에서 IP 주소를 제공한다고 말합니다. 그리고 말할 것도 없이이 주소는 내가 필요한 것이 아니라 잘못되었다고 말합니다. Googled, 그들의 지원을 찾았습니다 - 같은 문제이지만, Main OpenWrt 라우터의 dhcp authoritative='1' 은 그를 위해 일했지만 결코 효과가 없었습니다.
그래서 조사를 시작했습니다 - DHCP 서버를 어떻게 비활성화 할 수 있습니까?
큐브에 포트가 거의 열리지 않았습니다. 처음부터 Telnet 또는 SSH처럼 보이는 것은 없지만 UART에 연결 한 후 3 초 동안 재설정 버튼을 누르면 Telnetd가 시작되고 있음을 알았습니다 (6 초가 기본 설정을 다시 가져옵니다).
PORT STATE SERVICE
23/tcp open telnet <--- opened only after you hold Reset for 3 seconds
5500/tcp open hotline
9000/tcp open cslistener
DHCP 서버가 올라갔습니다
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
열린 내용과시기를 이해하는 데 필요한 펌웨어에 대한 자세한 검사.
admin/password/user/1234/12345678 비밀번호로 루트/admin/support/user를 시도했습니다.
큐브를 열는 것은 매우 간단합니다. 흥미로운 점 - UART 소켓 및 SOIC -8 SPI 플래시. 라디에이터에 의해 닫힌 메인 칩 -ELTEK RTL8197F

115200 8N1. 핀 1에서 시작하여 (SPI 플래시에 가깝다) : VCC, RX, TX, GND.
Bohong BH25Q64 SPI Flash, 8MB. 데이터 시트
웹에서는 펌웨어를 사용할 수 없습니다. 전화 앱은 Tenda Cloud에서이를 찾고 자체를 다운로드합니다. 내 큐브에는 최신 펌웨어가 있으므로 새로 필요한 네트워크를 통해 스니핑 할 수 없습니다. 이 앱에는 Tenda Cloud와의 커뮤니케이션 프로토콜이 있다고 말할 수 있습니다.
불행히도 칩 클램프는 작동하지 않았으며 전체 장치를 강화하고 칩과의 통신을 시작합니다. 그것을 완전히 황폐했습니다. Capton 테이프를 잊지 마십시오. 
나는 매일 플래시 칩을 읽고 있지 않으며 이것을 위해 특별한 프로그래밍 장치를 소유하고 있지 않습니다. 그러나 나는 FTDI FT2232H 장치를 발견했는데,이 장치는 ESP32의 OpenOCD JTAG 디버거로 사용했습니다. 이 칩에는 SPI 모드가 있으며 마스터로 작동 할 수 있습니다. 핀아웃은 데이터 시트에서 가져옵니다.
| FT2232H 포트 | 기능 | 플래시 칩 핀 |
|---|---|---|
| adbus0 | SCK | 6 |
| adbus1 | 모시 | 5 |
| adbus2 | 된장 | 2 |
| adbus3 | CS | 1 |
다른 플래시 칩 핀 4 -GND, 8 -VCC 3.3V, 3 및 7 VCC로 이동합니다.

$ flashrom -p ft2232_spi:type=2232H,port=A
그리고 그것은 슬픔 만 가져옵니다 ...
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.
스케치와 .NET 앱 (러시아어)이있는 사이트 skproj를 둘러보고 중국 플래시 칩을 읽는 데 효과적이었습니다.
Nodemcu ESP8266 보드는 3.3V이므로 5V <> 3V 레벨 변환을 생각하고 싶지 않았습니다.
중요 : SPI 칩은 공식 문서에 따라 HSPI 핀 GPIO12-GPIO14 에 연결되어야합니다.
flashrom 과 함께 작동하는 Arduinos 용 serprog 펌웨어가 있지만 ESP8266 용 포트를 빠르게 찾을 수 없었습니다. 
깜박임을 더 쉽게하기 위해 나는 방금 커플 윈 본드 W25Q64FV 칩을 구입했습니다. 그들은 flashrom 과 제대로 작동하며 Windows를 Flash 칩으로 실행할 필요가 없습니다. 나는 새로운 칩에 플래시 덤프를 썼다
flashrom -p ft2232_spi:type=2232H,port=A -w image.bin
Tenda Bootloader는 새로운 플래시 칩을 감지하고 정상적으로 시작했습니다.
Binwalk의 스트레이트 런은 많은 정기적 인 발견을 제공합니다.
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
그러나 모든 것을 다시 붙일 수 있기를 희망하면서 dd 와 함께 부트 로그의 MTD 블록에 따라 플래시 이미지를 9 개의 파일로 나눕니다.
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"
KernelFS 와 RootFS MTD 테이블에 따라 교차하는 이유는 확실하지 않습니다.
파일 시스템을 풀기위한 unsquashfs 만. 바쁜 상자 기반.
고양이 /etc/passwd
root:$1$nalENqL8$jnRFwb1x5S.ygN.3nwTbG1:0:0:root:/:/bin/sh
고양이 /etc/shadow
root:$1$OVhtCyFa$7tISyKW1KGssHAQj1vI3i1:14319::::::
고양이 /etc/inittab
::sysinit:/etc_ro/init.d/rcS
ttyS0::respawn:/sbin/sulogin
::ctrlaltdel:/bin/umount -a -r
::shutdown:/usr/sbin/usb led_off
첫 번째 시도는 매우 순진했습니다. /etc/inittab 업데이트하고 다시 넣을 수 있습니다.
ttyS0::respawn:/sbin/sulogin ttyS0::respawn:/bin/login -f root 로 변경했습니다
파일, 포장 된 파일을 SQUSHFS BACK -OOOPS로 업데이트했습니다. 압축을 검사했습니다 - 원래 XZ 였지만 mksquashfs 기본적으로 LZMA를 사용했습니다. XZ로 변경되었습니다. 이제 크기가 매우 동일하며 Rootfs Mtd에 적합합니다. 원래 MTD 파티션 크기에 도달 할 때까지 FF가있는 패딩 된 NewRootfs 파일. 모든 파일을 하나의 이미지 파일에 다시 결합하여 플래시에 썼고 부팅 ...
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>
CRC에 대해 어떻게 잊을 수 있을까 ... 나는 CRC를 계산하는 적절한 방법을 찾기 위해 몇 시간을 보냈다 - RSDK를 찾았고, 이미지 생성을 이해하려고 노력했다.
다른 것을 시도합시다.
부트 로그에 따르면 netctrl 프로세스가 조기에 시작하여 루트 비밀번호를 변경합니다.
argv[0] = netctrl
netctrl
prod_change_root_passwd(83)
따라서 어려운 방법으로하자. 코드를 분해하고 반전 시키십시오. 아야. MIPS ASM을 본 적이 없습니다 ...
파일을 살펴보면 많은 사람들이 prod_change_root_passwd 사용하고 있으며 netctrl 를 사용하며 /lib/libcommonprod.so 에 정의 된 함수 자체처럼 보입니다.
IDA에서 Open /bin/netctrl . 오픈 기능 main . 먼저 버퍼를 지우고 구성에서 sys.role 매개 변수를 읽고이 수면 또는 호출 외부 기능 prod_change_root_passwd 에 따라 매개 변수가 없습니다.

/lib/libcommonprod.so 열십시오. 열린 기능 prod_change_root_passw . 또한 버퍼를 먼저 지우고 config에서 일부 매개 변수를 읽고 wl2g.ssid0.wpapsk_psk 또는 TD_WLAN1_SSID0_PWD 값을 가진 Encode64() 읽습니다.
그런 다음 명령 줄을 통해 루트 비밀번호를 설정합니다 (echo %s;sleep 1;echo %s) | passwd root -a s> /dev/null

짜잔!
스티커에서 기본 비밀번호의 계산 된 Base64, 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
기본적으로 아직 여기에서 볼 수있는 흥미로운 것은 없습니다. 루트를 제외한 사용자는 시스템에 등록되지 않습니다.
~ # 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
그리고 여기에 진행되는 프로세스가 있습니다
~ # 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
나는 새로운 tenda mw6에 대한 뿌리 액세스 권한이 있습니다. 블랙 박스가있는 것을 싫어하기 때문에 행복합니다.
루트 비밀번호는 Base64로 인코딩 된 현재 Wi -Fi 비밀번호입니다.
(DHCP 연구를 마치려면 @Crees에게 감사합니다. MW5에서 테스트했지만 비슷한 소프트웨어가 있습니다).
cfm 유틸리티는 /usr/sbin 의 스크립트에서 발견 될 수 있으며, 재부팅을 통해 지속되는 매개 변수를 조작하는 데 사용됩니다 ( 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
일반적으로 UI가 장치를 인식하지 못할 수 있으므로 포트 전달을 먼저 설정해야합니다.
dhcps.listnum 의 경우 0으로 설정하면 재부팅에 /etc/dhcps.conf를 작성하지 않으므로 DHCPS를 비활성화합니다.
~ # cfm set dhcps.listnum 0
이것은 재부팅에 걸쳐 지속되며 dhcps.listnum을 원래 값으로 다시 변경하여 쉽게 취소 할 수 있으며 공장 재설정도 반전됩니다.
앱에서 8 포트 전달 규칙 만 허용되므로 제한적입니다. DMZ 작업을 설정하거나 CFM을 사용하여 전달 규칙을 엉망으로 만들 수도 있습니다. 가상 세저 규칙은 매우 간단 해 보입니다.
~ # cfm set wan1.dmzip ip.address.here
~ # cfm set wan1.dmzen 1
~ # reboot
C/C ++에서 많은 비즈니스 로직이 수행되고 컴파일 된 것 같습니다 (많은 스크립트 만들기). 또 다른 합병증은 오버레이 FS가 아니며, /dev/mtdblock7 on /tmp/log/crash type jffs2 (rw,relatime) 를 제외한 모든 장착 R/O입니다. 설정은 /dev/mtd5 에 직접 저장되고 cfm 사용하여 조작됩니다.
재미있었습니다.