دعنا نقول ... للمتعة فقط .. حصلت على 2 × 3 عبوات من Tenda MW6 لتغطية المساحة الكبيرة (في الداخل والخارج). كان لدي 3 من MW6 الخاص بي مع Ethernet (في الواقع ، هو محولات جسر PLC).
في التكوين "الافتراضي" ، يعمل بشكل جيد ، ومع ذلك كان لدي بالفعل جهاز توجيه OpenWrt جيدًا والعديد من الأجهزة/الخدمات التي تم إعدادها. بواسطة Defaul ، يعمل MW6 في وضع DHCP ، ينشئ الشبكة الفرعية 192.168.5.x ويضع الجميع هناك. ولكن هذا 1) يجلب طبقة NAT إضافية ، 2) يكسر خدماتي.
لذلك قررت تبديله إلى وضع الجسر ، حيث ، وفقًا للدليل ، يجب أن يقوم بإيقاف جميع خدمات الشبكات ويعمل كجسر.
من النظرة الأولى التي نجحت ، ولكن بعد ذلك أدركت أن بعض أجهزتي حصلت على IPs خاطئين ثم فهمت أن المكعب "الرئيسي" يدير خاص به Luna Park مع Blackjack و toabers خادم DHCP. لا توجد على الإطلاق صفحة إدارية على الويب ، تطبيق الهاتف فقط. لا أرى أي طرق لتعطيلها من هناك.
يقول NMAP أن DHCP Server قيد التشغيل ، ويعترض جميع عملاء WiFi ويعطي عناوين IP من تجمعه. وغني عن القول أن هذه العناوين خاطئة ، وليس ما أحتاجه. وجدت Googled دعمها - نفس القضية ، لكن الشخص يقول إن dhcp authoritative='1' على جهاز التوجيه الرئيسي OpenWrt يعمل لصالحه ، لكنه لم ينجح أبدًا بالنسبة لي.
لذلك بدأت التحقيق - كيف يمكنني تعطيل خادم DHCP.
تم فتح بعض المنافذ على المكعب. لا شيء يبدو مثل Telnet أو SSH من البداية ، ولكن بعد توصيل UART - لاحظت أن Telnetd تبدأ عند الاحتفاظ بزر إعادة الضبط لمدة 3 ثوان (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
الفحص الدقيق للبرامج الثابتة المطلوبة لفهم ما يتم فتحه ومتى.
جربت الجذر/المسؤول/الدعم/المستخدم مع كلمة مرور المسؤول/كلمة المرور/مستخدم/1234/12345678 وبعض كلمات المرور الأخرى .. لا ، لا تعمل.
فتح المكعب واضح للغاية. من المثير للاهتمام - مقبس UART وفلاش SOIC -8 SPI. رقاقة رئيسية مغلقة بواسطة المبرد - Realtek RTL8197F

115200 8n1. بدءًا من PIN 1 (أقرب إلى SPI Flash): VCC ، RX ، TX ، GND.
Bohong BH25Q64 SPI Flash ، 8MB. ورقة البيانات
البرامج الثابتة غير متوفرة على الويب. يبحث تطبيق الهاتف عن ذلك في Tenda Cloud ويقوم بتنزيلات نفسه. تحتوي مكعباتي على أحدث البرامج الثابتة ، لذلك لا يمكن استنشاق الشبكة إلى أين تتطلب الأمر الجديد. لا أستطيع إلا أن أقول أن هذا التطبيق لديه بروتوكول الاتصال الخاص به مع Tenda Cloud.
لسوء الحظ ، لم ينجح CHIP Clamp ، فهو يعمل على تشغيل جهاز كامل ويبدأ التواصل مع Chip. صفرت تماما. لا تنس شريط كابتون. 
أنا لا أقرأ رقائق الفلاش كل يوم ولا أملك جهاز برمجة خاص لهذا. ومع ذلك ، وجدت جهاز FTDI FT2232H ، والذي استخدمته كصحفية OpenOCD JTAG لـ ESP32. هذه الشريحة لديها وضع SPI ويمكن أن تعمل كماجستير. يؤخذ pinout من ورقة البيانات.
| ميناء 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.
نظرت حولي ووجد موقع Skproj مع رسم رسم وتطبيق .NET (باللغة الروسية) والذي عمل بشكل جيد بالنسبة لي لقراءة رقاقة الفلاش الصينية.
لقد استخدمت لوحة NodeMcu ESP8266 لأنها 3.3 فولت ولم أكن أرغب في التفكير في تحويل مستوى 5V <> 3V.
هام : يجب توصيل رقاقة SPI بـ HSPI Pins GPIO12-GPIO14 وفقًا للوثائق الرسمية.
serprog لـ Arduinos التي تعمل مع flashrom ، لكنني لم أتمكن من العثور بسرعة على منفذها لـ ESP8266 
لتسهيل وميض ، لقد اشتريت للتو زوجين من رقائق Winbond W25Q64FV. إنهم يعملون بشكل صحيح مع flashrom ولا أحتاج إلى تشغيل Windows إلى فلاش رقاقة. كتبت تفريغ فلاش إلى شريحة جديدة مع
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
ومع ذلك ، مع الأمل في أن تكون قادرًا على لصق كل شيء مرة أخرى ، قمت بتقسيم صورة الفلاش إلى 9 ملفات وفقًا لكتل MTD في خطوط الإرهاق مع 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"
غير واضح بالنسبة لي لماذا تتقاطع KernelFS و RootFS وفقًا لجدول MTD.
فقط unsquashfs لتفريغ نظام الملفات. لها صندوق مشغول.
Cat /etc/passwd
root:$1$nalENqL8$jnRFwb1x5S.ygN.3nwTbG1:0:0:root:/:/bin/sh
القط /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
كانت المحاولة الأولى ساذجة للغاية: دعنا نحديث /etc/inittab ووضعها مرة أخرى.
تم تغيير ttyS0::respawn:/sbin/sulogin إلى ttyS0::respawn:/bin/login -f root
تم تحديث الملف ، والملفات المعبأة إلى SQUSHFS مرة أخرى - Ooops ، أكبر مما كان عليه. تم فحص الضغط - لقد كان XZ في الأصل ، لكن mksquashfs استخدمت LZMA بشكل افتراضي. تم تغييره إلى XZ ، والآن هو نفس الحجم ويناسب ROOTFS MTD. ملف newrootfs مبطن مع FF حتى وصل إلى حجم قسم MTD الأصلي. دمج جميع الملفات مرة أخرى في ملف صورة واحد ، كتب إلى 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>
كيف يمكنني أن أنسى اتفاقية حقوق الطفل ... لقد قضيت ساعات بضع ساعات في محاولة لمعرفة الطريقة المناسبة لحساب اتفاقية حقوق الطفل - وجدت RSDK ، حاولت فهم خلق الصورة ... أكثر من اللازم لعقدي في الوقت الحالي.
لنجرب شيئًا آخر.
وفقًا لسجل التمهيد ، هناك عملية netctrl التي تبدأ مبكرًا وتغير كلمة مرور الجذر.
argv[0] = netctrl
netctrl
prod_change_root_passwd(83)
لذلك دعونا نفعل الطريق الصعب. حاول تفكيك الكود وعكسه. أوتش. لم ير MIPS ASM ...
عند النظر في الملفات التي وجدت أن العديد منها يستخدم prod_change_root_passwd ، يستخدم netctrl ويبدو أن الوظيفة نفسها محددة في /lib/libcommonprod.so .
فتح /bin/netctrl في IDA. الوظيفة المفتوحة main . يقوم بمسح المخازن المؤقتة أولاً ، ثم يقرأ معلمة sys.role من التكوين ويعتمد على هذا إما نوم أو يستدعي الوظيفة الخارجية prod_change_root_passwd دون معلمات.

open /lib/libcommonprod.so . فتح وظيفة prod_change_root_passw . يقوم أيضًا بمسح المخازن المؤقتة أولاً ، ثم يقرأ بعض المعلمات من التكوين والمكالمات Encode64() مع القيمة إما wl2g.ssid0.wpapsk_psk أو TD_WLAN1_SSID0_PWD .
ثم فقط تعيين كلمة مرور الجذر عبر سطر الأوامر (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 الجديد ، مما يجعلني سعيدًا لأنني أكره وجود صناديق سوداء.
كلمة مرور الجذر هي مجرد كلمة مرور WiFi الحالية ، مشفرة بـ BASE64.
(بفضل 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
عمومًا ، ستحتاج إلى إعداد توجيه المنفذ أولاً ، وإلا فإن واجهة المستخدم قد لا تتعرف على جهازك.
بالنسبة إلى dhcps.listnum ، إذا قمت بتعيينه على 0 ، فإنه لا يكتب a /etc/dhcps.conf على إعادة التشغيل ، وبالتالي تعطيل DHCPs.
~ # cfm set dhcps.listnum 0
سيستمر هذا عبر إعادة التشغيل ، ويمكن التراجع بسهولة عن طريق تغيير DHCPs.Listnum مرة أخرى إلى قيمته الأصلية ، وستعيد إعادة تعيين المصنع أيضًا.
يسمح لك فقط 8 قواعد إعادة توجيه المنافذ في التطبيق ، وهو محدود للغاية. إعداد DMZ يعمل (أو يمكنك أيضًا العبث بقواعد إعادة التوجيه باستخدام CFM- تبدو قواعد VirtualSer مباشرةً ومباشرة.
~ # cfm set wan1.dmzip ip.address.here
~ # cfm set wan1.dmzen 1
~ # reboot
يبدو أن العديد من منطق العمل يتم في C/C ++ وتجميعه (VS صنع الكثير من البرامج النصية). مضاعفات أخرى هي عدم تراكب FS ، جميعها مثبتة R/O باستثناء /dev/mtdblock7 على /tmp/log/crash type jffs2 (rw,relatime) - يتم تخزين الإعدادات مباشرة في /dev/mtd5 ومعالجة باستخدام cfm .
كان ذلك ممتعًا.