たとえば、楽しみのために..私は大きなエリア(屋内と屋外)をカバーするために2 x 3パックのTenda MW6を手に入れました。 MW6のうち3つがイーサネットでバックホールされていました(実際、PLCブリッジアダプターです)。
「デフォルト」構成では正常に動作しますが、すでに優れたOpenWrtルーターといくつかのデバイス/サービスが設定されていました。 Defaulによると、MW6はDHCPモードで動作し、192.168.5.xサブネットを作成し、全員をそこに置きます。しかし、これは1)余分なNAT層をもたらし、2)私のサービスを破ります。
そこで、私はそれをブリッジモードに切り替えることにしました。そこでは、マニュアルによれば、すべてのネットワークサービスをオフにし、ブリッジとして機能するだけです。
一見したところ、それはうまくいきましたが、私は自分のデバイスのいくつかが間違っていることに気付きました。ブラックジャックとフッカーを備えたルナパークDHCPサーバー。 Web Administratoinページはまったくありません。電話アプリのみです。そこから無効にする方法はありません。
NMAPによると、DHCPサーバーは実行されており、すべてのWiFiクライアントをインターセプトし、プールからIPアドレスを提供します。言うまでもなく、これらのアドレスは間違っていますが、私が必要とするものではありません。グーグルでサポートを見つけました - 同じ問題を見つけましたが、メイン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パスワードなど、root/admin/support/support/userを試しました。
キューブを開くことは非常に簡単です。興味深い - UARTソケットとSOIC -8 SPIフラッシュ。メインチップはラジエーターで閉じています-RealTek RTL8197F

115200 8N1。ピン1から始まる(SPIフラッシュに近い):VCC、RX、TX、GND。
Bohong BH25Q64 SPIフラッシュ、8MB。データシート
ファームウェアはWebで利用できません。電話アプリはTenda Cloudでそれを探し、それ自体をダウンロードします。私の立方体には最新のファームウェアがあるので、ネットワークを嗅ぎ、どこで新しいかを嗅ぐことはできません。このアプリには、Tenda Cloudとの通信の独自のプロトコルがあると言えるだけです。
残念ながら、チップクランプは機能しませんでした。デバイス全体に電力を供給し、チップとの通信を開始します。それを完全に破壊しました。カプトンのテープを忘れないでください。 
私は毎日フラッシュチップを読んでいませんし、これのために特別なプログラミングデバイスを所有していません。しかし、ESP32のOpenOCD JTAGデバッガーとして使用したFTDI FT2232Hデバイスが見つかりました。このチップには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.
周りを見回して、Sketchと.Netアプリ(ロシア語)でサイトSkprojを見つけました。
Nodemcu ESP8266ボードは3.3Vであり、5V <> 3Vレベルの変換を考えたくありませんでした。
重要:SPIチップは、公式ドキュメントに従って、HSPIピンGPIO12-GPIO14に接続するものとします。
serprogファームウェアはflashromで動作しますが、ESP8266のポートをすぐに見つけることができませんでした
フラッシュを簡単にするために、私はちょうどカップルのウィンボンドW25Q64FVチップを購入しました。彼らはflashromで適切に動作し、Flashチップを使用するためにWindowsを実行する必要はありません。新しいチップにフラッシュダンプを書きました
flashrom -p ft2232_spi:type=2232H,port=A -w image.bin
Tenda Bootloaderは新しいフラッシュチップを検出し、正常に開始しました。
ビンウォークのまっすぐな走りは、多くの定期的な調査結果を提供します。
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を使用してBootlogの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"
MTDテーブルによれば、 KernelFSとRootFS交差する理由は明確ではありません。
ファイルシステムを開梱するためのunsquashfs使用できません。 Busyboxベース。
猫/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に戻しました - oooops、それは以前よりも大きくなりました。調べた圧縮 - 元々はXZでしたが、 mksquashfsデフォルトでLZMAを使用しました。 XZに変更されましたが、現在はかなり同じサイズで、Rootfs Mtdに適合しています。元のMTDパーティションサイズに達するまで、FFを備えたPadded NewRootfsファイル。すべてのファイルを1つの画像ファイルに戻し、Flashに書き込み、起動...
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 netctrlそれを使用しており、 /lib/libcommonprod.soで定義されている関数自体のように見えます。
IDAのOpen /bin/netctrl 。オープン関数main 。最初にバッファをクリアし、次に構成からsys.roleパラメーターを読み取り、これに依存するか、パラメーターなしで外部関数prod_change_root_passwd呼び出します。

Open /lib/libcommonprod.so 。オープン関数prod_change_root_passw 。また、最初にバッファをクリアし、次にwl2g.ssid0.wpapsk_pskまたはTD_WLAN1_SSID0_PWDのいずれかの値でconfigと呼び出しEncode64()からいくつかのパラメーターを読み取ります。
そして、コマンドライン(echo %s;sleep 1;echo %s) | passwd root -a s> /dev/null

出来上がり!
シリアルで接続されたステッカーからデフォルトのパスワードのBase64を計算しました...
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でエンコードされた現在のWiFiパスワードにすぎません。
(@creesに感謝します。DHCPの調査を終了してください。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に設定すると、再起動時にa /etc/dhcps.confを書き込むことはないため、DHCPを無効にします。
~ # 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ではありません/tmp/log/crash type jffs2 (rw,relatime)の/dev/mtdblock7を除くすべてのr/oはすべてマウントされています。設定は/dev/mtd5に直接保存され、 cfmを使用して操作されます。
それは楽しかったです。