0x01 前言
首先感謝Tenda 提供的對Tenda AX12 路由器的測評資格和提供的路由器裝置。
今天這篇文章就來講述如何對路由器裝置進行裝置分析,以及在分析裝置過程中要注意的點,在Tenda裝置上的UART串列埠中獲取shell。
0x02 Tenda AX12 硬體分析
Tenda AX12 路由器是我們的第一個目標,Tenda AX12 從外觀上看,塑膠的外殼透露著金屬的質感,中間的金黃色log在燈光下非常好看,而且這款路由器的外殼特別堅硬,在使用過程中應該不容易被一些東西砸到而產生變形,影響外觀,整體裝置有四根天線,根據裝置的官方說明,裝置支援5G和2.4G的WiFi訊號。從外觀上看,還看不出來裝置有幾根5G 的天線。需要將裝置拆下來。並且裝置的LED狀態燈只有一個,不像以前的路由器,有專門WiFi、LAN口、WAN口、和電源的狀態訊號燈。
這一款Tenda裝置拆卸開還是很輕鬆,背部只有兩顆梅花螺絲,使用螺絲刀套裝擰開螺絲,接著用塑膠卡片一點一點的從邊緣撬開,把頂上的塑膠蓋拿下來之後,這個時候就可以看到裝置開發板,我移除了最外面的散熱器,還有金屬遮蔽層沒有拆下來,從開發板上可以看到最右側貌似是一個串列埠,然後是SOP8 flash 晶片,這邊還看不清除具體是什麼型號,並且在開發板上看到兩個WiFi的晶片組,分別有2,4G和5G,並且每一個WiFi天線分別配備一個WiFi晶片,感覺WiFi的訊號穩定性應該很不錯。
用螺絲刀將晶片上的金屬遮蔽層開啟,開啟金屬遮蔽層有一個小竅門,要從遮蔽層的邊緣,可以看到一個小縫隙,用扁頭螺絲刀輕輕網上翹即可,撬開之後用棉籤蘸點洗板水清潔一下晶片,這樣能更清除的看清楚晶片型號,或者輕微的將檯燈的燈光側向一方,能看的更清楚,由於手機的渣畫素,拍的依舊還是不清楚。
1 號晶片:S0374L87 SLN23
2 號晶片:S0393N23 SLMQ3
3號晶片:winbond 25Q128JVSQ 2104
2號晶片下面的晶片:ESMT M15T1G1664A
最右邊的串列埠在板子上標註依次是 “3v3”,”OUT”,”IN”,”GND”,根據以往的路由器串列埠,大體上可以猜測出這是開發板上提供除錯的UART 串列埠。那麼根據UART 串列埠對引腳的定義,從上到下依次應該是 “VCC”、”TXD“、”RXD“、”GND“
智慧裝置的韌體存在一般flash裡,flash沒有保護韌體被非法讀取的措施。現在大多數裝置的FLASH和RAM、CPU分別獨立,這樣是特別容易被提取韌體的,拆下FLASH用程式設計器直接能讀到flash裡面的內容了。如果FLASH和RAM整合在CPU上,並且開啟了加密的話這樣就會比較難提取韌體,也使裝置更加安全。
這裡主要關心的是winbond 25Q128JVSQ 2104 晶片,在識別出了晶片型號,可以在搜尋引擎中輸入晶片型號,可以下載裝置的datasheet(晶片資料手冊)。晶片在winbond 華邦的官網中可以找到晶片的datasheet。
韌體存在flash裡,flash沒有保護韌體被非法讀取的措施。現在大多數裝置的FLASH和RAM、CPU分別獨立,這樣是特別容易被提取韌體的,拆下FLASH用程式設計器直接能讀到flash裡面的內容了。如果FLASH和RAM整合在CPU上,並且開啟了加密的話這樣就會比較難提取韌體,也使裝置更加安全
根據datasheet 手冊的資訊,可以瞭解到winbond 25Q128JVSQ 晶片是一款25系列的SPI flash 晶片,並且是128mbit 記憶體。
下圖是晶片的引腳定義,這一部分在提取flash晶片內的韌體會用到。
0x03 UART 接入
由於在路由器板子上看到的疑似UART串列埠。使用FT232 接入裝置,TXD —> IN,RXD —> OUT,GND —> GND 。由於手頭上沒有邏輯邏輯分析儀,波特率用常用的115200來嘗試。開啟SecureCRT ,裝置通電。看到裝置的啟動的log資訊,這裡放出一部分的UART log資訊。
根據log資訊中的line 20看到,按ESC可以終端boot的自啟。在line 67 的 Kernel command line 值可以瞭解到裝置的韌體檔案型別是squash,裝置的波特率是115200,和核心初始化的一些引數。在line 89 可以看到不同的分割槽所在的偏移區間,根據這些資訊,可以從韌體中提取指定偏移區間內的檔案資訊,比如可以提取 0x000000300000-0x000000f00000 偏移地址區間內的rootfs 檔案系統。
U-Boot 2016.07-INTEL-v-3.1.177 (Nov 25 2020 - 09:48:15 +0000)
interAptiv
cps cpu/ddr run in 800/666 Mhz
DRAM: 224 MiB
manuf ef, jedec 4018, ext_jedec 0000
SF: Detected W25Q128BV with page size 256 Bytes, erase size 64 KiB, total 16 MiB
*** Warning - Tenda Environment, using default environment
env size:8187, crc:d89b57c5 need d89b57c5
In: serial
Out: serial
Err: serial
Net: multi type
Internal phy firmware version: 0x8548
GRX500-Switch
Type run flash_nfs to mount root filesystem over NFS
Hit ESC to stop autoboot: 0
Wait for upgrade... use GRX500-Switch
tenda upgrade timeout.
manuf ef, jedec 4018, ext_jedec 0000
SF: Detected W25Q128BV with page size 256 Bytes, erase size 64 KiB, total 16 MiB
device 0 offset 0x100000, size 0x200000
SF: 2097152 bytes @ 0x100000 Read: OK
## Booting kernel from Legacy Image at 80800000 ...
Image Name: MIPS UGW Linux-4.9.206
Created: 2020-11-18 5:39:29 UTC
Image Type: MIPS Linux Kernel Image (lzma compressed)
Data Size: 2079952 Bytes = 2 MiB
Load Address: a0020000
Entry Point: a0020000
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK
[ 0.000000] Linux version 4.9.206 (root@ubt1-virtual-machine) (gcc version 8.3.0 (OpenWrt GCC 8.3.0 v19.07.1_intel) ) #0 SMP Fri Nov 13 09:14:24 UTC 2020
[ 0.000000] SoC: GRX500 rev 1.2
[ 0.000000] CPU0 revision is: 0001a120 (MIPS interAptiv (multi))
[ 0.000000] Enhanced Virtual Addressing (EVA 1GB) activated
[ 0.000000] MIPS: machine is EASY350 ANYWAN (GRX350) Main model
[ 0.000000] Coherence Manager IOCU detected
[ 0.000000] Hardware DMA cache coherency disabled
[ 0.000000] earlycon: lantiq0 at MMIO 0x16600000 (options '')
[ 0.000000] bootconsole [lantiq0] enabled
[ 0.000000] User-defined physical RAM map:
[ 0.000000] memory: 08000000 @ 20000000 (usable)
[ 0.000000] Determined physical RAM map:
[ 0.000000] memory: 08000000 @ 20000000 (usable)
[ 0.000000] memory: 00007fa4 @ 206d5450 (reserved)
[ 0.000000] Initrd not found or empty - disabling initrd
[ 0.000000] cma: Reserved 32 MiB at 0x25c00000
[ 0.000000] SMPCMP: CPU0: cmp_smp_setup
[ 0.000000] VPE topology {2,2} total 4
[ 0.000000] Detected 3 available secondary CPU(s)
[ 0.000000] Primary instruction cache 32kB, VIPT, 4-way, linesize 32 bytes.
[ 0.000000] Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
[ 0.000000] MIPS secondary cache 256kB, 8-way, linesize 32 bytes.
[ 0.000000] Zone ranges:
[ 0.000000] DMA [mem 0x0000000020000000-0x0000000027ffffff]
[ 0.000000] Normal empty
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000020000000-0x0000000027ffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000020000000-0x0000000027ffffff]
[ 0.000000] percpu: Embedded 12 pages/cpu s17488 r8192 d23472 u49152
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32480
[ 0.000000] Kernel command line: earlycon=lantiq,0x16600000 nr_cpus=4 nocoherentio clk_ignore_unused root=/dev/mtdblock6 rw rootfstype=squashfs do_overlay console=ttyLTQ0,115200 ethaddr=CC:2D:21:EE:D9:F0 panic=1 mtdparts=spi32766.1:512k(uboot),128k(ubootconfigA),128k(ubootconfigB),256k(calibration),2m(kernel),12m(rootfs),-(res) init=/etc/preinit active_bank= update_chk= maxcpus=4 pci=pcie_bus_perf ethwan= ubootver= mem=128M@512M
[ 0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[ 0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[ 0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[ 0.000000] Writing ErrCtl register=00000000
[ 0.000000] Readback ErrCtl register=00000000
[ 0.000000] Memory: 87656K/131072K available (5087K kernel code, 294K rwdata, 1264K rodata, 1276K init, 961K bss, 10648K reserved, 32768K cma-reserved)
[ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[ 0.000000] Hierarchical RCU implementation.
[ 0.000000] NR_IRQS:527
[ 0.000000] EIC is off
[ 0.000000] VINT is on
[ 0.000000] CPU Clock: 800000000Hz mips_hpt_frequency 400000000Hz
[ 0.000000] clocksource: gptc: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 9556302233 ns
[ 0.000010] sched_clock: 32 bits at 200MHz, resolution 5ns, wraps every 10737418237ns
[ 0.008266] Calibrating delay loop... 531.66 BogoMIPS (lpj=2658304)
[ 0.069297] pid_max: default: 32768 minimum: 301
[ 0.074090] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.080515] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.089026] CCA is coherent, multi-core is fine
[ 0.098050] [vmb_cpu_alloc]:[645] CPU vpet.cpu_status = 11
...
[ 2.636153] 7 cmdlinepart partitions found on MTD device spi32766.1
[ 2.641030] Creating 7 MTD partitions on "spi32766.1":
[ 2.646216] 0x000000000000-0x000000080000 : "uboot"
[ 2.652273] 0x000000080000-0x0000000a0000 : "ubootconfigA"
[ 2.657866] 0x0000000a0000-0x0000000c0000 : "ubootconfigB"
[ 2.663350] 0x0000000c0000-0x000000100000 : "calibration"
[ 2.668827] 0x000000100000-0x000000300000 : "kernel"
[ 2.673587] 0x000000300000-0x000000f00000 : "rootfs"
[ 2.678642] mtd: device 6 (rootfs) set to be root filesystem
[ 2.683251] 1 squashfs-split partitions found on MTD device rootfs
[ 2.689144] 0x000000d00000-0x000001000000 : "rootfs_data"
[ 2.695934] 0x000000f00000-0x000001000000 : "res"
[ 2.700477] Lantiq SoC SPI controller rev 9 (TXFS 32, RXFS 32, DMA 1)
[ 2.717456] libphy: Fixed MDIO Bus: probed
[ 2.726334] libphy: gswitch_mdio: probed
[ 2.732619] libphy: gswitch_mdio: probed
[ 2.736683] lro_sram_membase_res0 from DT: a2013000
當裝置完全啟動後,很遺憾的是裝置UART 接入設定了登入口令,並且嘗試了一眾弱口令都沒有成功,不得不說,tenda裝置的安全性還是很到位的,我分析的其他tenda裝置UART 串列埠都有登入設定。
0x04 裝置韌體獲取
由於無法獲取到裝置的UART shell,我開始考慮從晶片中獲取韌體,這裡我犯了一個經驗性的失誤,因為以前分析過一些Tenda的裝置,比較新的韌體是識別不出來,解不開,並且以前提取Tenda F6裝置flash 晶片中的韌體時,使用飛線來提取,但是晶片有過電保護,無法正常提取韌體,於是這一款裝置我直接沒有考慮從官網下載韌體,而是把flash 晶片拆卸下來讀取韌體。
由於手頭上沒有熱風槍,所以沒辦法直接把flash 晶片直接吹下來,所以採用電洛鐵滴錫的方法來拆解Flash晶片進行韌體讀取。
1、將電烙鐵加熱加上錫,對準晶片一側上錫,此時使用鑷子將上錫的一側輕輕翹起。
2、對準晶片另一側上錫,此時使用鑷子將上錫的另一側輕輕翹起,使用鑷子輕輕夾出。
然後把晶片焊到底座上,方便程式設計器提取。
到這裡,我並沒有繼續往下提取,因為我突然想起來在UART log資訊中顯示的squashfs 資訊,我聯想起來,這個裝置的韌體是squashfs檔案系統型別的,那麼就可以直接用binwalk -Me直接提取。
如果要繼續往下提取,那就是根據flash晶片datasheet 中的資訊確定晶片的1號引腳,和程式設計器一一對應,直接就可以提取了,另外winbond 的晶片,現在物美價廉的土豪金CHA341A程式設計器就可以提取出來。
這裡我在Tenda官網中下載了最新韌體進行提取,不出所料,這一款裝置的韌體很成功的就提取出來。
0x05 UART 密碼獲取
我把韌體解開之後,首先在/etc/shadow 看到使用者名稱和加密後的hash。一般來說,這一塊是裝置的UART 登入口令。但是很遺憾被MD5加密了。
hash值儲存方式為:以MD5雜湊演算法為例,儲存為$1$salt$encrypted;以SHA雜湊演算法為例,儲存為$6$salt$encrypted
接了來使用hashcat 對shadow進行爆破
hashcat -m 500 -a 0 ./test_shadow.txt ./500_passwords.txt --force
嘗試使用hashcat爆破的方式,解開密碼,但是換了許多個密碼字典一直都沒有成功,於是我想到了Tenda裝置AC15的歷史漏洞CVE-2020–10988,密碼為root/ Fireitup ,於是加入到裝置的爆破詞典裡面,如下圖所示,密碼正確。
使用獲取到的登入口令,成功獲取到裝置的shell 中。
另外,裝置的telnet 服務在UART提供的串列埠進行開啟,遠端連線,也是使用和UART 接入的登入口令是一樣的。
0x06 總結
本片文章主要是對裝置的硬體進行分析,如何來辨別裝置上的晶片,從裝置上的晶片獲取有用的資訊,還有對UART如何進行接入,並且根據Tenda的歷史漏洞資訊,獲取到了裝置的登入口令和密碼。
後續會再出一篇文章,也是以Tenda AX12 路由器為起點,講解如何分析路由器的韌體,在對韌體分析的過程中,著重關注那些點,那些檔案內容容易產生漏洞。以及分享在Tenda AX12 裝置上挖到的一些漏洞,希望能幫助一些小夥伴一起學習參考。
本文由大中午啊原創釋出
轉載,請參考轉載宣告,註明出處: https://www.anquanke.com/post/id/255290
安全客 - 有思想的安全新媒體