0×01.前言
本科所學專業就是IoT,面試安全崗位時大部分面試官都會問我寫IoT安全相關的東西,雖然最后拿到offer定的崗位都是側重web的。前幾天接到科恩的面試通知(IoT安全硬件方向),就花了半天的時間整理了下本科期間做過的有關IoT安全的技術、demo等。
0×02.廢話連篇
先說下我個人對IoT的看法,物聯網關鍵的在於“網”這個字,萬物互聯,靠的就是“網”,至於這個“網”,實現的方式多種多樣,這也是前些年的物聯網的“碎片化“問題的一部分原因,協議、標准不同,很難有一套成熟的框架或者說是體系可以用於標准、安全地給開發者使用,開發出來的東西漏洞百出,甚至同樣的一種功能實現,不同廠商的產品漏洞的危害點卻在不同的層面,比如說同樣是智能鎖的遠程開關功能,可以怎么做?
典型的應該是有兩種思路,和近場還是遠場有關系,近場的解決方案應該是直接藍牙控制或者廠商私有的協議,針對這種方案可以抓包重放等,就我接觸到的產品而言,重放攻擊針對大部分都是有效的;遠場的解決方案都離不開”雲“,可能是app端與雲端驗證,然后雲端下發指令,這種上雲的操作,攻擊可以從app端做,也可以從web端入手。App端可能需要hook不同的方法了解如何與IoT設備進行交互,也需要關注交換格式的方法,比如JSON、XML等,有些app會固化編碼自己的密鑰,攻擊者以此偽造消息傳送給雲端來偽造開關的指令,雲端基本上和傳統的web安全攻擊思路都是相同的,OWASPtop10的那些漏洞,在IoT的雲端甚至更加廣泛,平行越權、RCE、未授權訪問等都是非常常見的。
像智能鎖這一類的由傳統產品改造后的IoT設備是目前應用最典型的,應該說也是存在漏洞最多的層面。為什么?還是以智能鎖為例,本來鎖具面臨的攻擊只是物理攻擊而已(拿一些工具撬開),現在它成IoT了,增加了其他功能,比如說用app控制了,攻擊者可以從app端下手,控制了app就控制了智能鎖,再進一步,上雲了,攻擊面就更大了,web的攻擊技術也可以用來控制鎖具了。功能越多,漏洞的攻擊面越多。就像安全從業者很喜歡引用的木桶理論一樣,木桶能盛多少水,取決於最短的一塊木板。
IoT安全從業者,必然要求是文能IDA,武能示波器,軟硬方面的技能兼備。
廢話說完了,接下來進入正題。
0×03.工具篇
推薦用樹莓派吧。很多demo都是在樹莓派上開發的,然后在后期出於成本等方面的考慮,聯系專業的廠商進行硬件的定制,剪切了不必要的硬件。此外,樹莓派自身就是ARM架構,與許多IoT設備相似,當然,還有相當一部分是MIPS、PowerPC等,這些架構的話,樹莓派帶起來可能會有困難,在計算機上裝個QEMU或者FAT基本夠用了。樹莓派另一方面在於原生的raspbian,有許多的開源工具可以使用,比如OpenOCD、SPIFlash等等。
此外,還需要一些硬件工具,比如SDR、萬用表、烙鐵、熱風槍、燒錄座等等,土豪可以再買個示波器、電子顯微鏡;一些使用的命令行級別的工具,如file、hexdump、strings、dd、lzma、7z等。
0×04.接口調試篇
主要碰到的接口有UART、JTAG、I2C、SPI等,這兒詳細講講UART的,因為我用到的最多,其次就是JTAG,相對來說,I2C、SPI比較少。
1.UART(通用異步接收器發送器)
是一種硬件組件,允許兩個硬件外圍設備之間的異步串行通信。它們可以位於同一塊電路板上(例如微控制器與電機或LED屏幕通信),也可以位於兩個不同的設備之間(例如設備微控制器與PC通信)。它可以允許通過串行讀取/寫入設備。
在許多物聯網設備中,板上的UART端口保持打開狀態,任何人都可以通過串口連接和訪問以獲得shell,日志輸出等。設備通常會有一組引腳,連接到微控制器UART RX和TX引腳,用於發送和接收串行數據。
在板子上找到相應的引腳后,連接計算機前,還需要usb轉ttl:
用於轉換電氣標准,即高低電平的轉換。
連接好后打開xshell或者secureCRT,設置端口和波特率,就可以拿到shell了。
當然大部分情況下沒這么簡單,可能只是進了busybox,還需要進一步地搜集、解密root的密碼等操作,這里不再展開。
2.JTAG
JTAG屬於微控制器調試接口。微控制器具有在運行期間使用指定引腳進行調試的規定,這些引腳連接到電路板上的引腳。這些引腳(端口)由開發人員和設計人員用於調試,讀/寫固件和微控制器內部存儲器,生產后控制/測試微控制器引腳。這使得調試端口成為最關鍵的攻擊面之一,因為它為攻擊者提供了強大的功能和訪問權限。除了JTAG之外,還包括cJTAG、SWD。
JTAG的接口在PCB上基本如下圖:
JTAG協議定義了可用於測試和調試微控制器的標准接口和命令。 JTAG定義了四個引腳接口(以及一個額外的可選引腳TRST)
開發者可以使用這些引腳與微控制器上實現的TAP(測試訪問端口)進行通信。從安全角度來看,識別JTAG端口並與其連接允許攻擊者提取固件,對邏輯進行逆向工程,並在設備上種植惡意固件。通過JTAG提取固件的技術在固件提取篇有具體例子。
3.I2C
內部集成電路是一種短距離通信協議,用於同一板上芯片之間的通信。
I2C的一個用例是EEPROM芯片,它連接到微控制器I2C引腳,通常存儲數據或代碼。 典型的攻擊包括篡改數據,提取敏感信息,破壞數據等。我們分析EEPROM芯片上的靜態數據,並通過嗅探I2C通信來執行運行時分析,可以了解安全隱患。
4.SPI
串行外設接口也是一種短距離通信協議,用於同一板上芯片之間的通信。與I2C相比,具有更高的吞吐量。
它用於與各種外圍設備通信。 閃存和EEPROM芯片也使用SPI。 測試和分析的方法與I2C類似。
0×05.固件提取篇
常用的提取固件的方法有這么幾種。
最簡單的方法就是去官網下載,或者找技術售后索要,如果有的話網上一般都是可以找到的。
第二簡單的簡單的方法就是在OTA升級時進行抓包,抓取並分析通信的流量,得出升級固件的具體流程,如果可以從通信過程中直接獲取升級固件的目的地址,直接去下載就可以,或者可以模擬固件升級的過程,然后獲取固件。一般來講,ftp、http等方式進行固件升級的產品比較容易使用此種攻擊手段。
除去以上兩種,接下來的方法是硬件安全研究人員常做的。
從編程器讀取。分別連接芯片引腳和編程器,直接讀取即可;有時候可能需要把芯片拆焊下來,通過燒錄座編程器讀取。
利用調試接口導出。通過UART串口,讀取uboot啟動信息,串口輸出中可以發現具體型號,然后使用編程器讀取並保存,就獲取到固件了。
一些情況下,也會通過JTAG/SWD接口進行讀取。將提取出的芯片固件在燒錄座上,將仿真器與燒錄座的JTAG接口連接,插入計算機,打開配套的客戶端進行讀取。
獲取到固件后,之后的技術涉及偏向於軟件層面,這兒不再展開。
0×06.彩蛋
前幾天面了科恩,確實一面問的都是非常底層、基礎的東西,把我記得的給列出來吧:
1.TTL和RS232區別?
2.眼圖中“眼睛”張的越小表明什么?
3.串口通信中起始位和停止位的意思
4.IDApython的一些用法
5.SSL握手過程及其中的一些細節
0×07.參考(包括圖片來源)
https://os.mbed.com/users/4180_1/notebook/i2c-debug-for-realterm/
https://payatu.com/iot-security-part-2-101-iot-attack-surface/