從遠(yuǎn)古時(shí)代的飛鴿傳書到后來的郵政快遞,寫信人與收信人之間的物理消息傳遞方式逐漸在演變發(fā)展,之后,傳真技術(shù)的出現(xiàn)從某種程度上說,幫助人們走出了信件傳遞的黑暗時(shí)代。
然而,技術(shù)發(fā)展到今天,就通信手段而言,我們有電子郵件、社交聊天、移動(dòng)通信渠道、網(wǎng)絡(luò)服務(wù)和高大上的量子衛(wèi)星通信等等,但在這種喜新厭舊的信息時(shí)代中,傳真技術(shù)仍然沒被淘汰,且依舊被廣泛使用。根據(jù)簡單的谷歌搜索可以發(fā)現(xiàn),網(wǎng)上出現(xiàn)了超過3億個(gè)的在用傳真號碼,看來,傳真技術(shù)還是我們常用的辦公通信方式之一。
為此,CheckPoint 決定深入研究一下這種“老派”的通信方式,看看它除了具備嘈雜的傳呼機(jī)功能和官僚主義負(fù)擔(dān)之外,是否存在著嚴(yán)重的網(wǎng)絡(luò)安全風(fēng)險(xiǎn)。以下為CheckPoint 的相關(guān)研究:
研究背景
傳真通信是利用掃描和光電變換技術(shù),從發(fā)端將文字、圖像、照片等靜態(tài)圖像通過有線或無線信道傳送到接收端,并在接收端以記錄的形式重顯原靜止的圖像的通信方式。傳真是基于傳統(tǒng)電信線路電話交換網(wǎng)(PSTN)與軟交換技術(shù)(NGN)的融合。
如今的傳真技術(shù)被廣泛集成于多功能一體打印機(jī)設(shè)備中,之后,家庭或企業(yè)通過以太網(wǎng)、WiFi、藍(lán)牙等接口把這些一體機(jī)接入內(nèi)網(wǎng)使用。當(dāng)然,為了支持傳真功能,這些一體機(jī)還連接了傳統(tǒng)話務(wù)(PSTN)的電話線。
我們在研究一開始就定下了這種假設(shè),攻擊者能否僅僅通過電話線和相應(yīng)的傳真號碼,就能向多功能一體打印機(jī)發(fā)送惡意傳真來實(shí)現(xiàn)入侵呢?如果答案是“能”,那么通過這臺受控打印機(jī),就有可能深入向企業(yè)內(nèi)網(wǎng)滲透。終于,經(jīng)過漫長而乏味的研究,我們有了突破。
事實(shí)上,我們在多功能一體打印機(jī)中發(fā)現(xiàn)了幾個(gè)關(guān)鍵漏洞,利用這些漏洞,通過向其發(fā)送構(gòu)造的惡意傳真,就能實(shí)現(xiàn)對其完全的入侵控制。這樣一來,打開了企業(yè)內(nèi)網(wǎng)之門,也就什么可能都存在了,攻擊者可以潛伏在多功能一體機(jī)中,向脆弱的企業(yè)內(nèi)網(wǎng)電腦發(fā)起“永恒之藍(lán)”漏洞攻擊,或通過傳真方式竊取內(nèi)網(wǎng)電腦數(shù)據(jù)并向外回傳。
我們把這種攻擊稱之為“Faxploit”攻擊。以下為實(shí)際網(wǎng)絡(luò)環(huán)境中的PoC視頻:
演示視頻:
逆向固件
首先,在固件逆向分析過程中,我們使用IDA來識別傳真功能中實(shí)際的運(yùn)行進(jìn)程和環(huán)境,有了一些發(fā)現(xiàn):
架構(gòu)
我們測試的多功能一體機(jī)是基于ARM 32bit的CPU架構(gòu)的大端存儲模式(Big-Endian),主CPU使用共享存儲區(qū)與控制LCD屏幕的MCU元件進(jìn)行通信。
操作系統(tǒng)
操作系統(tǒng)是Green Hills的ThreadX式嵌入式實(shí)時(shí)操作系統(tǒng),它使用平面內(nèi)存架構(gòu),很多任務(wù)進(jìn)程運(yùn)行于內(nèi)核模式下,使用同一個(gè)虛擬地址空間。也是由于這種平面內(nèi)存架構(gòu)的原因,我們認(rèn)為任務(wù)進(jìn)程的通信是通過消息隊(duì)列方式進(jìn)行的(FIFO),另外,其虛擬地址空間是固定的,未部署任何地址空間布局隨機(jī)化(ASLR)保護(hù)機(jī)制。
DSID值
然而,當(dāng)我們在分析T.30狀態(tài)機(jī)任務(wù)(“tT30”)時(shí),偶然發(fā)現(xiàn)了很多使用特別ID的追蹤方法(trace),深入分析發(fā)現(xiàn),這些ID也被用于一些以“DSID_”為前綴開頭的字符串列表中。實(shí)際上,這些字符串看似是與那些使用ID的追蹤方法(trace)邏輯相匹配,這也給了我們重要的逆向提示線索。于是乎,我們從所有不同的DSID列表中創(chuàng)建了一個(gè)枚舉類型,形成了任務(wù)中的各種追蹤方法文本描述。以下為trace追蹤方法中使用的DSID值:
T.30狀態(tài)機(jī)中的DSID列表:
在追蹤方法中應(yīng)用DSID枚舉:
任務(wù)不一致性
當(dāng)我們逆向T.30狀態(tài)機(jī)和之后處理HDLC的傳真貓(“tFaxModem”)時(shí),發(fā)現(xiàn)缺少了多個(gè)函數(shù)指針表。之后我們還發(fā)現(xiàn),有兩種常規(guī)的代碼模式貌似和 allocation/deallocation路徑有些相似。每個(gè)模塊中采用的方法,是為了接收來自其它模塊的消息,或者,也可能是把緩存發(fā)送到下一模塊中,如下圖使用某個(gè)功能表從另一個(gè)任務(wù)接收數(shù)據(jù)幀:
如果我們不能定位這些模塊中采用的具體方法,也就無法弄清固件中的數(shù)據(jù)流形式,會對固件的下一步分析造成阻礙。由于我們無法定位到大多數(shù)方法指針的初始化,所以,我們需要一種動(dòng)態(tài)方法,也即調(diào)試器來進(jìn)行調(diào)試。
創(chuàng)建調(diào)試器
串行調(diào)試接口
首先,我們分析了一體機(jī)的主板,想找到上面的串行調(diào)試端口,不一會,我們就有了發(fā)現(xiàn)。下圖為連接JTAGULATOR到打印機(jī)的串行調(diào)試器:
但接入調(diào)試器之后,我們才發(fā)現(xiàn)其調(diào)試接口的默認(rèn)權(quán)限是受限的,不能有效地執(zhí)行我們的預(yù)設(shè)命令:
這看起來是需要提權(quán)才行了,但提權(quán)就得需要漏洞啊,那就來找找看吧!
匹配已知漏洞
尋找已知漏洞
當(dāng)你要exploit一種特定固件時(shí),首先的方法就是去看看它使用了哪些開源代碼,對比不同版本,盡可能地找到能用的CVE。這項(xiàng)工作1天已經(jīng)足夠了,對于調(diào)試目的來說也是綽綽有余。有兩種方法來判斷使用的開源代碼:
在固件逆向代碼中使用字符串查找,從中找出關(guān)鍵字符串
從廠商網(wǎng)站中查找一些產(chǎn)品的開源代碼認(rèn)證信息
另外,要發(fā)現(xiàn)這些開源代碼漏洞有幾種方法:
在CVE庫中查找與其代碼庫相匹配的漏洞
用熟悉的漏洞進(jìn)行驗(yàn)證
關(guān)注US-CERT每周發(fā)布的CVE更新消息
gSOAP工具包調(diào)試漏洞 - CVE-2017-9765
在開源代碼分析中,我們發(fā)現(xiàn)其中使用了gSOAP庫,經(jīng)分析確認(rèn),gSOAP庫曾存在“魔鬼綠蘿”(Devil’s Ivy)的CVE-2017-9765漏洞,是早前在監(jiān)控?cái)z像頭開源軟件中爆出的0-day漏洞,曾影響了全球大量IoT設(shè)備。以下為該漏洞代碼段的反編譯代碼:
利用該漏洞,向多功能一體機(jī)發(fā)送超過2Gb的XML數(shù)據(jù)時(shí),將造成整型下溢,最終會導(dǎo)致棧緩沖區(qū)溢出,可執(zhí)行任意代碼,能實(shí)現(xiàn)對目標(biāo)多功能一體機(jī)的完全控制。
但是,該漏洞的利用存在兩個(gè)前提限制:
漏洞利用代碼的傳輸需要耗費(fèi)大量時(shí)間,優(yōu)化后,傳輸時(shí)間還是在7分鐘左右
只能在IDA和每次嘗試失敗時(shí)產(chǎn)生的基本串行轉(zhuǎn)儲環(huán)境下來開發(fā)這個(gè)漏洞
對Devil’s Ivy的CVE-2017-9765漏洞利用
該漏洞可以觸發(fā)棧緩沖區(qū)溢出,但存在一些限制型字符。這種字符如下:
不可打印的: 0x00 – 0x19
‘?’對應(yīng)的: 0x3F
該漏洞的一個(gè)好處是溢出無限制,也就是說,我們可以把整個(gè)漏洞利用鏈發(fā)送到目標(biāo)設(shè)備的棧區(qū)中進(jìn)行攻擊。
但在嵌入式環(huán)境中,我們需要注意的是其CPU的各種緩存可能會對漏洞觸發(fā)造成影響。CPU中接收到的數(shù)據(jù)包會存放在數(shù)據(jù)存儲區(qū) Data Cache (D-Cache),而執(zhí)行指令則會在Instruction Cache (I-Cache)中進(jìn)行。也就是說,即使沒有NX位支持,由于CPU會通過 I-Cache 執(zhí)行代碼,那么我們也不能直接在棧緩沖區(qū)中實(shí)現(xiàn)漏洞Payload的觸發(fā)。
如何才能繞過以上這些各種限制呢?我們需要用到一種包含以下部分的Bootstrapping算法利用:
可以刷新D-Cache 和 I-Cache 的基本的ROP(面向返回的編程)控制
加載到調(diào)試器網(wǎng)絡(luò)加載端的解碼shellcode
整個(gè)調(diào)試器可以通過網(wǎng)絡(luò)發(fā)送到加載端
在此,我們就不展開詳談漏洞利用鏈構(gòu)造過程,如果你感興趣請自己嘗試測試。接下來,我們來說說漏洞利用的各種載體。
Scout調(diào)試器
我們構(gòu)建的調(diào)試器是一個(gè)基于指令的網(wǎng)絡(luò)調(diào)試器,它支持基本的內(nèi)存讀寫請求,還能擴(kuò)展支持特定固件指令。我們使用調(diào)試器從多功能打印機(jī)中提取了其內(nèi)存,然后對它進(jìn)行了一些擴(kuò)展測試。
一旦調(diào)試器被配置了附帶固件API函數(shù),如memcpy、sleep和send等地址后,由于它是位置無關(guān)的,所以調(diào)試器就可以加載任意地址。Scout Debugger下載地址:https://github.com/CheckPointSW/Scout
ITU T.30 - Fax協(xié)議
多功能一體機(jī)如果支持傳真功能,那么也一定能支持涉及傳真設(shè)備的ITU-T G3協(xié)議標(biāo)準(zhǔn),該標(biāo)準(zhǔn)定義了傳真發(fā)送端和接收端的基本功能,以及協(xié)議的不同實(shí)現(xiàn)階段,如下圖所示:
我們重點(diǎn)來看上圖的Phase B和Phase C,Phase B負(fù)責(zé)發(fā)送端和接收端之間的協(xié)商(握手),而Phase C則根據(jù)協(xié)商規(guī)定進(jìn)行數(shù)據(jù)幀傳輸。數(shù)據(jù)幀利用面向比特的高級數(shù)據(jù)鏈路控制協(xié)議(HDLC),通過電話線來進(jìn)行傳輸,如下圖所示:
挖掘攻擊向量
發(fā)送TIFFs
存在一種誤解,也就是傳真只是一種簡單地TIFF報(bào)文發(fā)送手段。實(shí)際上,T.30協(xié)議能發(fā)送頁面,且Phase B階段協(xié)商的參數(shù)中就已經(jīng)包括了頁面長度和寬度,而且,Phase C階段則主要是傳輸頁面的數(shù)據(jù)行。也就是說,傳真最終的輸出是一個(gè)包含IFD標(biāo)簽的TIFF文件,IFD標(biāo)簽在該過程中用于構(gòu)建協(xié)商用的元數(shù)據(jù),.TIFF文件中包含有接收到的頁面行。
盡管.tiff解析器存在很多漏洞,但很多都是在IFD標(biāo)簽的解析代碼漏洞,而且我們這里的研究用例中,這些IFD標(biāo)簽都是由多功能打印一體機(jī)自己創(chuàng)建的,這里唯一會對我們的頁面內(nèi)容執(zhí)行的處理過程就是,打印過程中打開其壓縮內(nèi)容。
TIFF壓縮
不幸的是,.tiff格式使用的壓縮機(jī)制有多個(gè)名字,因此首先需要把它們找出來。以下是它們的一個(gè)基本映射關(guān)系:
TIFF Compression Type 2 = G3 without End-Of-Line (EOL) markers
TIFF Compression Type 3 = G3 = ITU T.30 Compression T.4 = CCITT 1-D
TIFF Compression Type 4 = G4 = ITU T.30 Compression T.6 = CCITT 2-D
由于傳真基本是黑白顏色的,所以,壓縮機(jī)制實(shí)際上是一種使用了固定霍夫曼表的黑白代碼行程編碼方式(RLE)。因此,我們再對T.4 和 T.6 的代碼壓縮機(jī)制進(jìn)行分析,沒發(fā)現(xiàn)什么可以利用的漏洞。
T.30擴(kuò)展
在Pahse B階段,傳真貓會進(jìn)行功能交換,所以它可以找出能支持的最佳傳輸方式。為此,我們編寫了一個(gè)簡單腳本對這些使用ITU T.30標(biāo)準(zhǔn)的消息進(jìn)行了語法分析,下圖為對數(shù)字識別信號(DIS)的解析結(jié)果:
看似我們測試的一體機(jī)支持ITU T.81 (JPEG) 格式,也就是說,它能發(fā)送彩色傳真。而在分析彩色傳真的處理代碼過程中,我們有了另外的新發(fā)現(xiàn):接收到的數(shù)據(jù)按原樣存儲到.jpg文件中,與.tiff文件中標(biāo)頭由接收端創(chuàng)建的不同,這里的.jpg我們可以對整個(gè)文件進(jìn)行控制。
我們基于標(biāo)準(zhǔn)對這種傳真行為進(jìn)行了檢查后發(fā)現(xiàn),由于JPEG格式非常復(fù)雜,其標(biāo)頭Header(也稱為標(biāo)記maker)確實(shí)是通過電話線發(fā)送的,接收端負(fù)責(zé)處理它們并決定保留下什么。一些標(biāo)頭可能不受接收端支持,會被丟棄,如COM的其它標(biāo)頭則會被忽略。在我們對固件和開源代碼的測試檢查中,接收內(nèi)容總會被無過濾地轉(zhuǎn)儲到一個(gè)文件中保存,這也就成了攻擊者的一個(gè)很好的“獵物”。
打印彩色傳真
概括來說,當(dāng)目標(biāo)打印機(jī)接收到一個(gè)彩色傳真,它就會簡單地?zé)o安全過濾地,把其內(nèi)容轉(zhuǎn)儲到一個(gè).jpg文件中,通常來說,這個(gè)文件位于%s/jfxptemp%d%d.jpg。然而,接收傳真只是第一步,接下來還需要打印傳真,為此打印模塊需要首先確認(rèn)接收文件的長度和寬度,所以,還要進(jìn)行一個(gè)基本的語法分析。
JPEG解析器
存在一些說不清的原因,這種特定固件的開發(fā)者傾向于把主流開源項(xiàng)目中實(shí)現(xiàn)的模塊功能進(jìn)行重新編寫,改善優(yōu)化,也就是說,他們不會用開源的libjpeg標(biāo)準(zhǔn)庫,轉(zhuǎn)而是用自己的 JPEG 解析器。從攻擊者角度來說,這就是一個(gè)可以利用的點(diǎn),在開發(fā)者自己開發(fā)的復(fù)雜文件格式解析器中來發(fā)現(xiàn)可利用的漏洞,似乎也不是沒有可能。JPEG解析器原理非常簡單:
先檢查圖像開始SOI標(biāo)記:0xFFD8
循環(huán)分析各個(gè)支持標(biāo)記
完成以上步驟后向調(diào)用者返回相關(guān)數(shù)據(jù)
這不,我們就以此為突破口,發(fā)現(xiàn)了以下兩個(gè)漏洞。
CVE-2018-5925 – COM標(biāo)記解析緩沖區(qū)溢出漏洞
根據(jù)ITU T.30 standard標(biāo)準(zhǔn),COM標(biāo)記 (0xFFFE)是一種大小可變的文本字段,這種文本字段一般用來代表文本類型的注釋說明。從這個(gè)點(diǎn)上,我們希望發(fā)現(xiàn)某種解析漏洞。比較搞笑的是,根據(jù)ITU T.30 標(biāo)準(zhǔn)來看,這種COM標(biāo)記應(yīng)該要被傳真接收端丟棄才是。然而,我們卻在其中發(fā)現(xiàn)了以下漏洞:
解析模塊會解析一個(gè)低字節(jié)序或小端模式的2字節(jié)長度字段,并反復(fù)執(zhí)行從傳真文件中復(fù)制數(shù)據(jù)到一些全局?jǐn)?shù)組中的操作。貌似數(shù)組中的每個(gè)條目都有2100字節(jié)的大小,而我們的構(gòu)造的長度字段可以高達(dá)64KB,這就給了我們一個(gè)大容量的可控緩沖區(qū)溢出區(qū)域。
CVE-2018-5924 – 解析DHT標(biāo)記時(shí)的堆棧緩沖區(qū)溢出漏洞
由于上一個(gè)漏洞的發(fā)現(xiàn)是標(biāo)準(zhǔn)實(shí)現(xiàn)中不應(yīng)支持的標(biāo)記所導(dǎo)致的,所以,我們繼續(xù)把關(guān)注點(diǎn)擴(kuò)展到了其它標(biāo)記身上。在解碼文件的數(shù)據(jù)幀時(shí),DHT標(biāo)記(Difine Huffman Table) 定義了一個(gè)特定的霍夫曼表來使用。而且,這個(gè)DHT標(biāo)記漏洞涉及到的函數(shù)比上個(gè)漏洞函數(shù)還簡單容易一些:
可以看到存在一個(gè)讀取16字節(jié)的初始解析循環(huán),這是因?yàn)槊總€(gè)字節(jié)代表了一個(gè)長度字段,所有這些字節(jié)最后累積成為一個(gè)總的長度變量
存在一個(gè)全0填充的256字節(jié)本地備用堆棧
第二個(gè)解析循環(huán)會使用之前的長度字段,從傳真文件中拷貝數(shù)據(jù)到本地堆棧緩沖區(qū)中
一個(gè)簡單的計(jì)算就能知曉具體的漏洞成因:16 * 255 = 4080 > 256,也就是說,我們可以構(gòu)造一個(gè)大容量可控且無限制的堆棧緩沖區(qū)溢出,這是多好的一個(gè)漏洞啊。
創(chuàng)建漏洞利用代碼
對比以上兩個(gè)漏洞,由于DHT標(biāo)記解析漏洞相對容易實(shí)現(xiàn)。在Devil’s Ivy漏洞中,其中的調(diào)試exploit利用代碼,也是利用了一個(gè)堆棧溢出漏洞,那么這里我們也是一樣,僅只需要對調(diào)試exploit作出一些小修改即可。
自動(dòng)化Payload – 實(shí)現(xiàn)圖靈機(jī)機(jī)制
我們可以使用同樣的網(wǎng)絡(luò)加載器來構(gòu)造調(diào)試exploit。然而,當(dāng)前的攻擊向量有一個(gè)主要的優(yōu)勢:完整的攻擊Payload可以存儲在傳真發(fā)送的“JPEG”中,鑒于它不對傳真內(nèi)容執(zhí)行任何安全過濾檢查,因此我們可以把整個(gè)Payload都存儲在發(fā)送文檔中,不需要擔(dān)心它是否會被轉(zhuǎn)儲為一個(gè)非法的JPEG文件。
而且文件的fd文件描述符也存儲在可訪問的全局變量中,所以, 我們編寫了一個(gè)基于文件的加載器,該加載器會從文件中讀取Payload,然后把它加載到內(nèi)存中去。之后,每次Payload想要用輸入執(zhí)行任務(wù)時(shí),它就會從同一文件中讀取輸入并按照其中的指令實(shí)現(xiàn)任務(wù)操作。為此,我們構(gòu)建了一個(gè)基本的圖靈機(jī)機(jī)制來從發(fā)送傳真中讀取輸入并實(shí)現(xiàn)操作。
通過網(wǎng)絡(luò)傳播
入侵控制一臺企業(yè)打印機(jī)也不錯(cuò),但是我們想做的遠(yuǎn)不只這些。實(shí)際上,如果能通過打印機(jī)來控制整個(gè)企業(yè)內(nèi)網(wǎng),那影響和威脅就就非常之大了。所以,我們利用我們漏洞分析團(tuán)隊(duì)之前的研究結(jié)果,綜合了NSA武器 - “永恒之藍(lán)”( Eternal Blue)和“雙脈沖星”(Double Pulsar),應(yīng)用于此次傳真漏洞的基于文件的圖靈機(jī)中來。
我們的漏洞Payload具備以下功能特點(diǎn):
可以控制多功能一體機(jī)的LCD顯示屏 - 這是一種打印機(jī)完全控制權(quán)的體現(xiàn)
檢查多功能一體機(jī)的網(wǎng)絡(luò)是否為連通狀態(tài)
使用NSA“永恒之藍(lán)”( Eternal Blue)和“雙脈沖星”(Double Pulsar)武器,攻擊目標(biāo)內(nèi)網(wǎng)受害主機(jī),實(shí)現(xiàn)入侵控制。
由此,我們通過傳真漏洞遠(yuǎn)程實(shí)現(xiàn)企業(yè)內(nèi)網(wǎng)的多功能一體機(jī)入侵控制,并以此為據(jù)點(diǎn),可向企業(yè)內(nèi)網(wǎng)深入進(jìn)行橫向滲透。
總結(jié)
我們測試用的多功能一體機(jī)為 HP Officejet Pro 6830,研究測試表明,這種當(dāng)前的傳真實(shí)現(xiàn)協(xié)議存在安全隱患,其它啥都不用,僅需要向目標(biāo)一體機(jī)發(fā)送一份傳真就能完全控制設(shè)備,可以此為潛伏據(jù)點(diǎn),用已知的NSA漏洞exploit深入向企業(yè)內(nèi)網(wǎng)滲透。
從現(xiàn)在起,傳真機(jī)也能成為滲透入侵企業(yè)內(nèi)網(wǎng)的途徑之一。我們認(rèn)為,這種傳真技術(shù)存在的安全風(fēng)險(xiǎn)應(yīng)該被重視,因?yàn)樗由炝爽F(xiàn)代企業(yè)網(wǎng)絡(luò)的安全邊界,網(wǎng)絡(luò)打印機(jī)和傳真機(jī)都有能成為網(wǎng)絡(luò)架構(gòu)中的一個(gè)入侵風(fēng)險(xiǎn)點(diǎn)。
漏洞披露進(jìn)程
在與惠普公司(HP)進(jìn)行協(xié)商之后,有了以下的漏洞披露進(jìn)程:
2018.5.1 向HP公司上報(bào)漏洞
2018.5.1 HP公司感謝提交并著手處理漏洞
2018.5-2018.6 不停的重現(xiàn)PoC場景,修補(bǔ)漏洞
2018.6.2/3 與HP公司面對面溝通
2018.7.23 發(fā)現(xiàn)的兩個(gè)漏洞被標(biāo)記為高危
2018.8.1 HP公司公布固件升級補(bǔ)丁
2018.8.12 在 DEFCON 26 會議中首次公開