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