原文作者:Juan Carlos Jiménez

翻譯者:光棍節

原文地址:http://jcjc-dev.com/2016/05/23/reversing-huawei-3-sniffing/

前文回顧:

前兩節已經找到了硬件pcb板上的串口,并了解了uboot和busybox的運行。

這一節從通信的流量出發,分析更多的信息。

一、PCB電路板中的數據流

存放在存儲單元的數據是沒有用的,它需要被讀、寫和傳輸才會有價值,粗略的看一下電路板,就可以看到電路板上的布局以及線路,進而得到數據流的流向,如圖一所示。

圖一 線路板的數據通信線路

在這里,我們不是去找硬件的后門信息,而主要是關心Ralink與flash之間的SPI數據傳輸。電路板上芯片的datasheet文檔可以很容易的從互聯網上獲取,本文中主要關心下面兩個芯片的文檔資料,CPU 芯片Ralink RT3352F和flash芯片Spansion FL064PIF。

此時,我們已經得到芯片資料,協議等資料,接下來就就是要研究與之最相關的數據塊。

二、flash芯片介紹

我們關心的是CPU與flash之間通信的數據流,首先是需要知道如何與邏輯分析儀連接,通過查看datasheet就可以分析出flash芯片的每一個引腳作用,如圖二所示。

標準的SPI通信使用4個引腳:

MISO:數據線,從FlashàRalink MOSI:數據線,從RalinkàFlash SCK:時鐘信號,因為SPI使用的是串行通信協議,MISO和MOSI是基于時鐘信號完成數據傳輸的 CS#:片選線,控制芯片是否被選中,在這個flash芯片中,當設置為0的時候,表示有效。

圖二 Flash芯片引腳意義圖

知道了引腳意義之后,將這四個引腳連接到邏輯分析儀上,隨機的抓取其中的數據。連接如圖三所示。

圖三 引腳與邏輯分析儀連接圖

接下來是了解SPI配置選項,包括:

l 傳輸的字節順序,即大小端(MSB和LSB),標準的是首先使用MSB l 傳輸的比特位數,標準的是8位 l CPOL:時鐘極性,定義SPI時鐘的活動狀態 l CPHA:時鐘相位,定義相對于SO-數據位的時鐘相位

其中最后兩個參數在datasheet中定義了僅有兩種組合(CPOL=0, CPHA=0)或者(CPOL=1, CPHA=1)。如圖四所示。

圖四 SPI flash CPOL和CPHA模式

下圖五是嗅探的部分數據。

圖五 嗅探的數據圖

這些信號需要對照datasheet了解代表的詳細含義。

圖六 datasheet數據意義解釋

下圖七是對抓取數據的分析。

圖七 抓取數據解釋

Datasheet中說明flash芯片具有較快的讀寫速度,這是依靠多路復用器實現的,在這個路由器中沒有使用,當使用了多路復用器以后抓到的數據會比較沒有規律。

如果邏輯分析儀的功能不夠多的時候,傳輸模式下需要額外的引腳的時候將會是個麻煩。

三、抽樣率的重要性

邏輯分析儀是個簡單的設備,映像顯示是將存儲器中的全部內容以點圖形式一次顯示出來。它將每個存儲器字分為高位和低位兩部分,分別經X,Y方向D/A變換器變換為模擬量,送入顯示器的X與Y通道,則每個存儲器字點亮屏幕上的一個點。而圖解顯示是將屏幕的X方向作為時間軸,將Y方向作為數據軸進行顯示的一種方式。將欲顯示的數字量通過D/A變換器轉變成模擬量,將此模擬量按照存儲器中取出的數字量的先后順序顯示在屏幕上形成一個圖像的點陣,然后分析數據之后發送到計算機上面。也就是邏輯分析儀將被測數據信號用數字形式寫入存儲器后,可以根據需要通過控制電路將內存中的全部或部分數據穩定的顯示在屏幕上,所以會得到分析精確的數據,如果輸出出現問題,得到的波形也會出現問題。邏輯分析儀無論采樣頻率,存儲空間,觸發深度等資源都是有限的,我們只有充分組合協議相關的組件才能發揮其最大的效用,所以選的那款設備不是很給力的話,接口也會成為一個問題。

我記錄了Ralink-Flash SPI總線,這里我使用的是saleae邏輯分析儀,最大的采樣率為24 MS/s,如圖八所示。

圖八 24MS/s邏輯分析儀采樣的數據

從上圖可以看出,所示時鐘信號由低到高(8個部分),而這種波形可能會導致數據沖突問題,雖然允許完全的數據傳輸正確,但是也需要注意這一點,這一步和計劃步驟沒有太大關系。 用分析儀再一次分析(100 MS/s),如圖九所示。

圖九 100MS/s邏輯分析儀采樣數據

從圖中可以看出,即使采樣率很高的時候,時鐘信號還是滿足要求的。

如果你發現在你的采樣中,有些信號丟失,你就要考慮丟失的數據是否影響你的分析,如果有影響的話,就要考慮換個高級的更貴的邏輯分析儀了。

四、數據流查看

第二節中已經分析了系統,接下來我們將用示波器鏈接flash的MISO和MOSI引腳來獲取傳輸的信號。連接如圖十所示。

圖十 示波器連接示意圖

下面鏈接的視頻顯示了數據的變化情況。 http://static.video.qq.com/TPout.swf?vid=w0303365imd&auto=0

從中可以很容易的看到讀/寫的動作,這些將有助于我們何時使用邏輯分析儀和使用多久。

五、分析SPI通信流

在第二節中的ATP中有一個save命令,是保存一些東西到flash中,但是幫助文檔并沒有說明具體做了什么,僅僅顯示了進度條。接下來就是我們自己去發現save命令到底做了什么。

1、重啟知道啟動完成,此時路由器處于空閑狀態,SPI數據流將為空 2、如第一節中那樣開啟ATP 3、將flash的MISO/MOSI連接到示波器上,運行save命令,計算出需要抓取的時間長 4、使用enable命令,里喲個邏輯分析儀分析閃存 5、保存并分析記錄的數據

其中步驟3和步驟4可以結合使用,這樣可以保證沒有數據丟失。數據線連接如圖十一所示。

圖十一 邏輯分析儀連接圖
當抓取到數據時,數據如圖十二所示。

圖十二 開始抓取的數據圖

這里就需要分析里面的數據哪些有用,因為我們是在測試存儲芯片,所以我們能夠獲取到讀/寫的數據情況以及地址屬于哪里。這里采用兩種方法:第一種可以考慮使用之前的時間順序,還有一種是創建可讀、寫二進制文件(內存部分)。邏輯分析儀導出的是csv格式文件,我編寫了python腳本,幫助我分析和搜尋文件。所以整個的分析如下:

1、輸出獲取的數據(CSV) 2、運行腳本程序、搜尋目標CSV文件、確定第一個命令(第一字節處)、處理參數信息(地址)、讀/寫分析、ASCII編碼與二進制轉換(payload 字節)、不同二進制文件讀/寫(MISO (read) 或 MOSI (write)) 3、Traffic Map效果分析(hexdump -C output.bin | less) 通過上述分析,發現Traffic Map、 MOSI和MISO、地址等信息,發現save命令還是有效的。

結合第二部分的映射表,圖十三所示。

圖十三 地址映射表

通過上面的分析,可以知道save命令的數據流比較簡單:

1、從保護區域讀取64kb的數據 2、覆蓋掉剛剛讀取的64kb數據

MISO的二進制中可以看出,主要傳輸的都是1:如圖十四所示。

圖十四 MISO數據

而MOSI的內容更像是明文的數據,非常像第二節中發現的/var/curcfg.xml文件,包含了wifi密碼等數據信息。 Flash中存在保留區是通用的做法,這些區域是為了保存各種各樣的數據,以便在重啟或者用戶配置、恢復出廠等時候使用,save命令就是負責保存數據到這些區域的。也許是為了保留一些出廠信息,這也許就是為什么會在/var/文件夾下發現了XML文件。

六、固件

在整個挖掘過程中,目標是促進你不斷深挖的動力。

我們的目標是找到生成默認wifi密碼的算法,如果我們得到了這個算法并且從公開信息中獲取某些參數,那么我們可能就能夠獲取所有的HG533路由器的默認密碼。

此類安全問題已經被多次發現,通常的公開數據是從MAC地址或者SSID中獲取。

當然,并不是所有的路由器設備都是這樣的,通常情況下,在嵌入式工程中,需要有某段數據既能被固件知道,同時又是每一個設備都不同而且從外面的實體中可以獲取的,這段數據的獲取是個經常性的問題,存在于工業界的所有的物聯網設備中。

七、標簽的問題

在今天這個時代,你會遇到一個問題就是路由器連接到網絡,而目前就是在路由器的一面可以發現一張貼紙,而上面就有路由器的默認管理密碼,然后配置好后連接網絡。如圖十五所示。

圖十五 路由器后面的標簽
這個WIFI密碼就是一個特定的數據塊,工長生產的時候,固件和電腦都需要知道這個默認的WIFI密碼,通常情況下開發人員會采用兩種可行的方案:

1、設備和電腦采用相同的生成算法,而且輸入的參數都知道 2、電腦為每一個設備生成一個密碼,然后分別保存到設備中

除了不能讓硬件廠商向每一個設備中存入不同的參數或者不愿承擔這個額外寫入的成本之外,第一種方法通常被視為最后的手段。第二種方法從設計上看更合理,但是通常情況下,公司不會直接隨機的生成這個密碼,而是會使用一種算法得到一個可預測的輸出。

八、恢復出廠設置嗅探

接下來我們就要弄清楚那些動作將會啟動PCB相關的數據流,有一個特殊的動作,即長按10s復位鍵,就會是路由器恢復出廠設置,這其中會重置wifi的密碼,當然也會執行默認wifi的生成算法。如果生成算法或者參數要從flash中獲取,那么我們就能獲取讀取的通信數據。

在長按復位鍵的時候,我們觀察UART接口的數據,邏輯分析儀和示波器的數據,和之前的ATP的save過程一樣,得到的結果如圖十六、圖十七所示。

圖十六 UART輸出結果

圖十七 邏輯分析儀的數據流

同樣,我們分析數據流,可以看出從保護區讀取了如下的數據。

___________________
|Transmission  Map|
|  MOSI  |MISO  |
|        |0x7e0000| Size: 12    //Part of the Protected area
|        |0x7e0000| Size: 1782
|        |0x7e073d| Size: 63683
| ERASE 0x7e073d  | Size: 64kB
|0x7e073d|        | Size: 195
|0x7e0800|        | Size: 256
|0x7e0900|        | Size: 256
---------//--------
       [...]
---------//--------
|0x7e0600|        | Size: 256
|0x7e0700|        | Size: 61
|        |0x7d0008| Size: 65529 //Part of the Protected area
| ERASE 0x7d0008  | Size: 64kB
|0x7d0008|        | Size: 248
|0x7d0100|        | Size: 256
---------//--------
       [...]
---------//--------
|0x7dff00|        | Size: 256
|0x7d0000|        | Size: 8
|        |0x1c3800| Size: 512   //Part of the Filesystem
|        |0x1c3a00| Size: 512
---------//--------
       [...]
---------//--------
|        |0x1c5a00| Size: 512
|        |0x1c5c00| Size: 512
-------------------

我決定結合之前的二進制文件作進一步的分析,讀取閃存信息( ATP_LOG),這里有出廠重置以及遠程訪問信息,這部分是在0xff(1s ),改寫內存(1s),創建新的ATP_LOG信息以及當前配置文件(curcfg.xml ),從文件系統中讀取壓縮數據信息。系統文件中有一部分數據是在讀取( AFTER)過程中得到的,另外需要說明的就是這個和密碼加密算法沒有關系,可能算法已經加載到內存中了,但SPI通信方式也沒有確定這一點。

在 MOSI部分可以看到新的WiFi密碼(閃存)以XML字符串形式出現,如圖十八所示。

圖十八 新的wifi密碼明文(MOSI)
如果想要獲取到默認的密碼,那就需要分析MISO 部分,也許內存中已經加載了,而在下一部分將會對這個深挖。而這里也需要對SPI通信在做分析( HTTP認證),主要是看新的WiFi密碼,即Map、 MISO、 MOSI。下面就是在閃存分析到的信息,如圖十九所示。

圖十九 分析閃存得到信息

從中可以看出,這些都是明文信息,也就是說沒有加密算法在里面,但這也不是決定性的,因為這也有可能是生成的憑證,或者延遲算法出現的時間也就是限制訪問算法。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/158/