標籤:
引文
在第一部分,我通過UART進行了調試,並在最後利用命令列頁面利用shell 命令就可以擷取root許可權了。也就是在這一點上,我已經可以訪問路由器了,之後就可以像測試人員一樣去調試路由器了。開始的時候給人感覺這個路由器還是相對容易訪問,不需要昂貴的工具,往往也會產生非常有趣的結果。如果想要在硬體方向進行逆向工作,但是沒有什麼時間。這往往會進行不到一個更高的層次,例如網路漏洞、ISP 協議等。
本文僅代表原文作者意圖,同時文章中介紹的工具、技術帶有一定的攻擊性,請合理合法使用。
回顧
都是之前分析的結果
按下斷行符號,就會看到“Welcome to ATP Cli ”資訊以及一個登陸提示。經過嘗試之後就可以利用預設密碼 admin:admin成功登陸,然後我們得到了BusyBox。
------------------------------------Welcome to ATP Cli-------------------------------------Login: adminPassword: #Password is ‘admin‘ATP>shellBusyBox vv1.9.1 (2013-08-29 11:15:00 CST) built-in shell (ash)Enter ‘help‘ for a list of built-in commands.# lsvar usr tmp sbin proc mnt lib init etc dev bin
在這裡我們可以分析到韌體(Ralink IC)的三個層面
U-boot: 裝置引導程式。可以分析到裝置的記憶體映射,可以啟動韌體程式以及執行一些相對低層級的任務。
ATP: 可控制裸機、平行處理等。基本上可以被看做是linux核心。
Busybox:一個整合了一些最常用linux命令和工具的工具箱,它同時為我們提供了一些shell命令。
如果在整個過程中擷取低層級的存取權限,當然不會訪問所有的資料。但在這裡合理使用BusyBox是一個很好的機會。現在我把注意力集中在引導順序,而再啟動過程中顯示的一些資料也是很重要的,下面就來看看哪些能被我用到。
引導順序
在引導順序中出現了多個隨機項,當然還有一些其它的資訊,比如壓縮演算法(flash segments)
Intel的快閃記憶體很有用,在這我可以分析它。
更多的資訊
當我們訪問快閃記憶體資料的時候,就需要處理壓縮演算法,這樣可以更好地瞭解哪些是被使用的。
ATP 以及BusyBox
在路由器裡面的Ralink IC,它主要是和韌體( ATP)來控制儲存單元以及平行處理資料,同時保證了硬體的工作狀態。也就是它(ATP)可以被認為是一個Linux核心,之前所知道的ATP的CLI,但非常有局限性。
ATP>helpWelcome to ATP command line tool.If any question, please input "?" at the end of command.ATP>?clsdebughelpsave?exitATP>
在這裡的shell命令中沒提及help命令,但它通常是出現在sh以及shell。 ATP CLI裡面有少於10個命令,當然這裡面就沒有複雜的控制檔案方式以及檔案導航,這就是為什麼BusyBox出現的原因。
BusyBox含有二進位檔案以及常見的Unix命令,開發很方便,值得注意的是節約記憶體。從 ls、cd 命令到top,系統開始啟動指令碼程式,這些都可以允許我可以將Ralink IC當Linux box一樣使用。
進入BusyBox可以看到 shell命令,以及運行這些命令
ATP>shellBusyBox vv1.9.1 (2013-08-29 11:15:00 CST) built-in shell (ash)Enter ‘help‘ for a list of built-in commands.# lsvar usr tmp sbin proc mnt lib init etc dev bin## ls /binzebra swapdev printserver ln ebtables catwpsd startbsp pppc klog dns busyboxwlancmd sntp ping kill dms brctlweb smbpasswd ntfs-3g iwpriv dhcps atserverusbserver smbd nmbd iwconfig dhcpc atmcmdusbmount sleep netstat iptables ddnsc atcmdupnp siproxd mount ipp date atupg sh mldproxy ipcheck cwmp ashumount scanner mknod ip cp adslcmdtr111 rm mkdir igmpproxy console acltr064 ripd mii_mgr hw_nat cms actelnetd reg mic ethcmd clitc radvdump ls equipcmd chownswitch ps log echo chmod#
你會注意到BusyBox的不同,而分析檔案系統,如busybox的連結檔案/bin/,這不是一個很好的開始,敏感的資料不會存放在這裡(BusyBox binary)的。
分析檔案系統
現在我已經得出哪些命令是可用的了,然後再看看有什麼有用處的資料在那,所以先對系統有個大致的瞭解之後,我不想顯示每一處的詳細資料。而這裡也需要用到top命令,top命令用來顯示執行中的程式進程,使用許可權是所有使用者。雖然目前路由器閑置,但是沒有顯示更多資訊。
有一個進程顯示正在運行usbmount,而在這裡路由器的USB介面也起到了作用,插上一個隨身碟。
usb 1-1: new high speed USB device using rt3xxx-ehci and address 2[...]++++++sambacms.c 2374 renice=renice -n +10 -p 1423
插入之後,安裝位置在 /mnt/usb1_1/,然後一個samba伺服器啟動了,這些相關檔案都是在/etc/samba/
# ls -l /etc/samba/-rw-r--r-- 1 0 0 103 smbpasswd-rw-r--r-- 1 0 0 0 smbusers-rw-r--r-- 1 0 0 480 smb.conf-rw------- 1 0 0 8192 secrets.tdb# cat /etc/samba/smbpasswdnobody:0:XXXXXXXXXXXXXXXXXXX:564E923F5AF30J373F7C8_______4D2A:[U ]:LCT-1ED36884:
更多的資料
netstat -a: 查看開啟了哪些連接埠
iptables –list:我們可以設定遠程登入以及繼續串連網路,但我更願意維持裸機狀態。
wlancmd help: 遠端控制無線訊號。
/etc/profile
/etc/inetd
/etc/services
/var/:系統運行時所用到的檔案位置
/etc/: 系統設定檔等
/var/ 以及 /etc/ 這些位置都包含了大量的檔案,那麼/etc/serverkey.pem是什麼情況?
在嵌入式裝置中發現TLS認證(私匙)是很正常的一件事情,在單一型號的裝置可以擷取到私匙,這也有助於你檢測同一型號的裝置。該私匙可以從服務商獲得,另一方面獲得公用認證用於遠端伺服器通訊也很常見。我在這裡找到了兩個,這兩個都是來自“同一個人的簽名”。
/etc/servercert.pem:最有可能是伺服器密鑰
/etc/root.pem:可以串連伺服器吧(不確定)
更多的資料在/etc/ppp256/config 以及/etc/ppp258/config:
這些驗證身份憑據的資訊也會通過 HTTP介面,這也是我為什麼提出這個概念的原因,以後會提及。有了這麼多的資訊可能需要消耗更多的時間去分析,這裡需要用到之前的盤來複製資料進行分析。
收集資訊
一旦將收集到的資料資訊複製到電腦之後,可以搜尋一些檔案find . -name *.pem,但沒有出現其它的TLS認證。想要在檔案中搜尋password腫麼辦?grep -i -r password 。
在這裡我可以看到認證資訊,主要是提供給TR-069、本地服務以及STUN協議,STUN是一種網路通訊協定,它允許位於NAT(或多重NAT)後的用戶端找出自己的公網地址,查出自己位於哪種類型的NAT之後以及NAT為某一個本地連接埠所綁定的Internet端連接埠。當然這些都可以通過HTTP介面來實現,但這些通常是隱藏的。如果想要想要相信瞭解可以看 這篇文章“Beyond Your Cable Modem”,這裡有很多有關TR-069協議以及其它一些內容。我也可以擷取到BASE64格式的認證資訊,但是資料加密稍微差一點。
$ echo “QUJCNFVCTU4=” | base64 -DABB4UBMN
這是在路由器裡面設定的WiFi密碼,它向我們展示了兩個有趣的檔案,不僅僅指的是內容,而是路由器在工作時的重要組成部分
/var/curcfg.xml: 當前設定檔,主要是包括當時設定的WiFi密碼(base64格式)。
/etc/defaultcfg.xml: 預設設定檔,被用於恢復出廠預設值,但不包括路由器的預設密碼資訊。
ATP(CLI)
ATP(CLI)僅僅提供少量的命令,最有意思的是-shell-調試,但看起來並不是像真正意義的調試( debug display),而僅僅給我提供一些命令igmpproxy、 cwmp、 sysuptime以及atpversion,但這些沒有太大用。我在考慮cwmp命令是否可以起到作用,是不是和路由器的遠程配置有關?
值得注意的是,CWMP (TR-069)也是與路由器遠程有關聯的,甚至可能都沒有編碼時間。而在這一點上其餘(ATP)命令是沒有用的,清屏、協助菜單、儲存以及退出,這些貌似對於這一步作用都不大。
引導程式命令列介面
引導程式命令列介面可以訪問某些記憶體地區,但不幸的是,它沒有給我許可權讓我直接能夠訪問快閃記憶體晶片,下面就可以看到相關資訊
Please choose operation: 3: Boot system code via Flash (default). 4: Entr boot command line interface.You choosed 4Stopped Uboot WatchDog Timer.4: System Enter Boot Command Line Interface.U-Boot 1.1.3 (Aug 29 2013 - 11:16:19)RT3352 # help? - alias for ‘help‘bootm - boot application image from memorycp - memory copyerase - erase SPI FLASH memorygo - start application at address ‘addr‘help - print online helpmd - memory displaymdio - Ralink PHY register R/W command !!mm - memory modify (auto-incrementing)mw - memory write (fill)nm - memory modify (constant address)printenv- print environment variablesreset - Perform RESET of the CPUrf - read/write rf registersaveenv - save environment variables to persistent storagesetenv - set environment variablesuip - uip commandversion - print monitor versionRT3352 #
這裡需要注意的是不要啟用這些命令 erase、mm、 mw以及nm,除非你需要用到這些的時候,當然這些應該和這一步沒有關係,在某些情況下會導致裝置重啟,然後裝置變成了磚頭。在此情況下,md(記憶體顯示)以及printenv命令引起我的注意。
RT3352 # printenvbootcmd=tftpbootdelay=2baudrate=57600ethaddr="00:AA:BB:CC:DD:10"ipaddr=192.168.1.1serverip=192.168.1.2ramargs=setenv bootargs root=/dev/ram rwaddip=setenv bootargs $(bootargs) ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname):$(netdev):offaddmisc=setenv bootargs $(bootargs) console=ttyS0,$(baudrate) ethaddr=$(ethaddr) panic=1flash_self=run ramargs addip addmisc;bootm $(kernel_addr) $(ramdisk_addr)kernel_addr=BFC40000u-boot=u-boot.binload=tftp 8A100000 $(u-boot)u_b=protect off 1:0-1;era 1:0-1;cp.b 8A100000 BC400000 $(filesize)loadfs=tftp 8A100000 root.cramfsu_fs=era bc540000 bc83ffff;cp.b 8A100000 BC540000 $(filesize)test_tftp=tftp 8A100000 root.cramfs;run test_tftpstdin=serialstdout=serialstderr=serialethact=Eth0 (10/100-M)Environment size: 765/4092 bytes
我可以看到類似於UART 的傳輸速率設定資訊,以及一些有意思的儲存單元地址。這些地址資訊應該不是快閃記憶體的,雖然其儲存空間僅需要三個位元組就可以搞定:[0x00000000, 0x00FFFFFF]。
讓我們來看看這裡都有哪些有用的資訊,提供者之類的,這個kernel_addr=BFC40000怎麼樣?
出現了有關badd的資訊,也就意味著無效的地址。之前已經通過md命令來進行寫入程式碼,來讓你知道你正在試圖訪問無效的記憶體位址,這不是好的方案,但是也沒有能夠訪問之前的啟動資訊。
值得注意的是,我在之前已經通過引導程式命令列介面停止linux核心載入到記憶體的進程,那麼這個介面訪問的資訊就比較有限了。
我可以在記憶體中使用這種方法(SPI Flash 映像string編碼)尋找隨機資料,但這個沒有什麼特別含義,僅僅用它來熟悉儲存結構,例如在0x000d0000位置有明顯變化。
在使用md命令之後,就可以看到0x000d0000位置的變化了。
以後的文章將會結合韌體資訊來分析詳細資料,以及從系統方向下手來擷取更多的資料。
*參考來源:jcjc-dev
技術分享:逆向破解華為路由器第二部分