打印機(jī)作為組織內(nèi)不可缺少的資產(chǎn)設(shè)備,近年來(lái)各種打印固件漏洞越來(lái)越多,其安全性也受到關(guān)注,打印機(jī)安全和計(jì)算機(jī)安全一樣重要,不能忽視。(威廉莎士比亞,模板,打印機(jī),打印機(jī)安全,打印機(jī)安全,打印機(jī)安全,打印機(jī)安全,打印機(jī)安全,打印機(jī)安全,打印機(jī)安全)

我們注意到,惠普(HP)推崇自身的安全打印服務(wù)中有這樣一段宣傳視頻《The Wolf-狼來(lái)了》,其中美劇黑客軍團(tuán)主演克利斯汀·史萊特化身為“狼”,使用各種惡意手段入侵企業(yè)內(nèi)部打印系統(tǒng),繞過(guò)公司網(wǎng)絡(luò)防火墻,輕松獲得了大量機(jī)密文檔。

事實(shí)上,存在這樣的攻擊手段,打印機(jī)肯定會(huì)成為攻擊者間接滲透組織機(jī)構(gòu)內(nèi)網(wǎng)系統(tǒng)的攻擊向量,而且,HP的宣傳視頻也拍的非常精彩。但Foxglovesecurity公司安全研究員對(duì)這段視頻看不下去了,他們決定拿HP打印機(jī)下手,而最終,卻發(fā)現(xiàn)了多個(gè)HP打印機(jī)安全問(wèn)題,以及影響HP打印機(jī) 5個(gè)系列共50多個(gè)型號(hào)的遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2017-2750)。這一次,HP打印機(jī)確實(shí)被安全研究者給杠上了!我們一起來(lái)看這場(chǎng)好戲!

質(zhì)疑惠普打印機(jī)的安全性

在惠普HP安全打印的宣傳視頻開(kāi)篇中說(shuō)到:“世界上有數(shù)以億計(jì)的商業(yè)打印機(jī),但不到2%是安全的“,難道惠普打印機(jī)就是絕對(duì)安全的嗎?帶著這樣的疑問(wèn),我們想進(jìn)行一些驗(yàn)證。打印機(jī)入侵方面有Printer Hacking Wiki和PRET toolkit這樣的絕佳利器,但貌似沒(méi)人用它們對(duì)HP打印機(jī)進(jìn)行過(guò)深入分析研究,于是乎,我們就甩手購(gòu)買(mǎi)了HP旗下的MFP-586和M553兩臺(tái)不同型號(hào)打印機(jī),像“狼”說(shuō)的那樣,“覓食時(shí)間到了”。

(提示:文中提及的漏洞已通報(bào)給HP公司,HP已經(jīng)針對(duì)漏洞發(fā)布了補(bǔ)丁更新,請(qǐng)參考)

TL;DR

打印機(jī)攻擊向量

測(cè)試通用打印機(jī)漏洞

不安全的默認(rèn)設(shè)置

深度挖掘 – 提取打印機(jī)系統(tǒng)和固件信息

逆向固件和HP軟件解決方案框架

構(gòu)建惡意的HP解決方案

構(gòu)造惡意代碼執(zhí)行

后記

打印機(jī)攻擊向量

視頻中“狼”執(zhí)行了一系列惡意攻擊,其真實(shí)性暫且不談,但以下兩種打印機(jī)安全問(wèn)題卻的確存在:

打印任務(wù)安全 – 打印任務(wù)主要有兩種泄露方式,一是經(jīng)過(guò)打印機(jī)的人直接拿走打印完存留在打印托盤(pán)上任務(wù)文件,二是攻擊者通過(guò)網(wǎng)絡(luò)間接截獲打印任務(wù)。

未簽名代碼執(zhí)行 – 打印機(jī)通常不受一些網(wǎng)絡(luò)安全設(shè)備的直接監(jiān)視,攻擊者一旦成功在打印機(jī)上植入惡意程序,除了不受限制地獲取打印任務(wù)之外,打印機(jī)還能成為內(nèi)部網(wǎng)絡(luò)的一個(gè)安全避難所,非常難于發(fā)現(xiàn)。

圍繞以上兩種安全問(wèn)題,我們對(duì)兩款HP打印機(jī)進(jìn)行了一系列安全測(cè)試。

測(cè)試通用打印機(jī)漏洞

回顧打印機(jī)安全領(lǐng)域的一些現(xiàn)有資料, 不得不提打印機(jī)漏洞利用工具包Printer Exploitation Toolkit – PRET,其中內(nèi)置了針對(duì)不同廠商打印機(jī)的攻擊方法,它包含的通用攻擊模塊,并不是針對(duì)特定型號(hào)打印機(jī)的一些特定漏洞,因此測(cè)試過(guò)程中還需深入分析,以確定HP打印機(jī)存在的實(shí)際漏洞。以下是我們利用PRET工具包測(cè)試的一些發(fā)現(xiàn):

路徑遍歷 -遠(yuǎn)程存儲(chǔ)的打印任務(wù)泄露

PRET主要進(jìn)行PJL、PS、PCL三種打印語(yǔ)言模式測(cè)試,每種模式都對(duì)應(yīng)不同的打印語(yǔ)言,并存在相關(guān)的通用漏洞。即Printer Job Language (PJL):打印任務(wù)語(yǔ)言、PostScript(PS):打印描述語(yǔ)言、Printing Control Language(PCL):打印指令語(yǔ)言。

打印任務(wù)語(yǔ)言(PJL)用于指導(dǎo)打印機(jī)行為,利用PJL語(yǔ)言可以對(duì)打印任務(wù)執(zhí)行管理性的更改設(shè)置,對(duì)打印文件形成有限管理控制,例如,在打印機(jī)文件系統(tǒng)下用戶不經(jīng)常留意的以下特定位置中,它可對(duì)打印文件執(zhí)行存儲(chǔ)刪除操作。

觀察上圖可知,我們?cè)凇?”根目錄進(jìn)行列目錄操作后,只看到了 “PostScript” 目錄,此時(shí),在此進(jìn)行目錄切換操作時(shí),就存在一個(gè)路徑遍歷的通用漏洞,我們?cè)趦膳_(tái)HP打印機(jī)上都找到了一條路徑遍歷序列,如下所示:

但可惜的是,這樣也不能夠?qū)δ夸浿械奈募?zhí)行讀寫(xiě)操作,其它反復(fù)的強(qiáng)制嘗試手段又會(huì)引起打印機(jī)的崩潰和重啟。經(jīng)過(guò)進(jìn)一步分析,我們發(fā)現(xiàn),只有在某個(gè)特定路徑下通過(guò)修改遍歷序列才能讀取文件內(nèi)容:

“Jobs”目錄中存儲(chǔ)的就是打印任務(wù),可以通過(guò)PRET工具包讀取存儲(chǔ)在其中的任何打印任務(wù):

PRET的上述測(cè)試可以讀取具有“PIN”密碼保護(hù)和無(wú)保護(hù)的所有打印任務(wù)文件,這種PIN防護(hù)略顯多余。

PostScript打印任務(wù)控制

我們還發(fā)現(xiàn),某些類(lèi)型的打印任務(wù)在打印之前可被自動(dòng)操控,例如,內(nèi)部網(wǎng)絡(luò)中的任何人可對(duì)即將要打印的任務(wù)中植入任意圖片和字體,如我們?cè)谝粋€(gè)將要打印的原始文檔中加篡改入了水印”FOO”:

不安全的出廠重置功能

PRET工具包中內(nèi)置了兩個(gè)比較隱蔽的功能,這兩個(gè)功能可以把HP打印機(jī)進(jìn)行出廠重置,從而可將“Administrator”密碼重置為默認(rèn)的空密碼。重置操作可通過(guò)PJL或SNMP接口實(shí)現(xiàn),即使是人為在打印設(shè)備上設(shè)置的管理員密碼一樣可被重置:

除此之外,即使PJL和SNMP接口管理員防護(hù)措施,但依然可以通過(guò)啟動(dòng)時(shí),DHCP或BOOTP服務(wù)器重新配置打印機(jī)的這個(gè)鮮為人知的功能,來(lái)把SNMP團(tuán)隊(duì)字符串重置為“public”。

當(dāng)打印機(jī)啟動(dòng)時(shí),它會(huì)從DHCP服務(wù)中獲取一個(gè)IP地址,也會(huì)從DHCP響應(yīng)中接收一些特殊的配置選項(xiàng)信息,其中一個(gè)特別選項(xiàng)就指定了打印機(jī)可以從一個(gè)TFTP服務(wù)(簡(jiǎn)單文件傳輸協(xié)議)中,獲取到一個(gè)包含了各種配置設(shè)置信息的配置文件。在HP打印機(jī)的使用說(shuō)明書(shū)中,HP聲明任何手動(dòng)設(shè)置都優(yōu)先于DHCP自動(dòng)設(shè)置,但是,在實(shí)際配置中,卻存在一些DHCP設(shè)置可以清除手動(dòng)設(shè)置的選項(xiàng),如:

安全重置(security-reset) – 將打印服務(wù)的安全配置重置為出廠默認(rèn)模式

冷啟動(dòng)(cold-reset) – 該項(xiàng)操作后將會(huì)把TCP/IP配置信息重置為出廠模式

可以在我們的Github項(xiàng)目中,找到啟用這些選項(xiàng)的DHCP服務(wù)配置文件。

不安全的默認(rèn)設(shè)置

基于上述測(cè)試啟發(fā),我們嘗試在打印機(jī)中尋找是否存在一些組合的安全設(shè)置,能對(duì)上述攻擊進(jìn)行防護(hù)阻止,具體來(lái)說(shuō),也就是管理員如何設(shè)置才能避免內(nèi)部網(wǎng)絡(luò)的任何人有權(quán)重置管理員密碼。

確實(shí)有這樣的組合安全設(shè)置,但不像真實(shí)環(huán)境中那樣,管理員能有效對(duì)管理接口進(jìn)行鎖定操作,至少以下設(shè)置需要對(duì)其默認(rèn)值進(jìn)行修改,請(qǐng)注意,這些設(shè)置不會(huì)提示與安全性相關(guān)。其管理界面菜單欄顯示的完整路徑就間接表示了這些設(shè)置隱藏的深度:

設(shè)備的管理界面必須設(shè)置有密碼,這是IT資產(chǎn)的通常做法,也是唯一能在現(xiàn)實(shí)中應(yīng)用的設(shè)置;

在“Networking > Security > Mgmt. Protocols > SNMP”路徑下, “Set Community Name” 需要對(duì)默認(rèn)名稱(chēng)“public”進(jìn)行修改;

在“Security > PJL Security > Password”下,需要設(shè)置一個(gè)新密碼;

需要禁用以下功能:Networking > Other Settings > Misc Settings > Enabled Features > TFTP Configuration File”。

關(guān)鍵是,如果以上任何設(shè)置一旦被忽略,就可導(dǎo)致打印機(jī)會(huì)被攻擊者完全控制,而事實(shí)上,這些設(shè)置又總會(huì)被用戶經(jīng)常忽視。

深度挖掘 – 提取打印機(jī)系統(tǒng)和固件信息

購(gòu)買(mǎi)研究HP打印機(jī)前后花了幾千刀美元,但我們最終發(fā)現(xiàn)了一個(gè)遠(yuǎn)程代碼執(zhí)行漏洞(RCE),也算值得。首先來(lái)說(shuō),要對(duì)打印機(jī)系統(tǒng)代碼進(jìn)行逆向,但HP貌似已采取了防護(hù)措施,防止對(duì)其打印機(jī)系統(tǒng)和固件進(jìn)行信息提取,我們得想辦法繞過(guò)HP的安全防護(hù)。

首先,HP在它們的設(shè)備硬盤(pán)中加入了聯(lián)邦信息處理標(biāo)準(zhǔn)(FIPS)兼容加密保護(hù),當(dāng)任何一塊這種硬盤(pán)被加載后,所有數(shù)據(jù)都會(huì)被加密,而一旦硬盤(pán)被移除后,任何人在沒(méi)有密鑰情況下都將讀取不到其中的數(shù)據(jù)。此外,即使我們能設(shè)置或恢復(fù)其加密密鑰,在驅(qū)動(dòng)器讀取數(shù)據(jù)之前的加密細(xì)節(jié)也不太清楚。

而且,我們直接把FIPS加密硬盤(pán)移除后,再插入一個(gè)通用的不支持加密的東芝移動(dòng)筆記本硬盤(pán):

重啟打印機(jī)之后,我們能夠通過(guò)打印機(jī)電路板中的USB硬件接口,重新嘗試把打印機(jī)系統(tǒng)安裝到插入的全新東芝硬盤(pán)上去:

然后,我們關(guān)閉打印機(jī),再次移除這個(gè)東芝硬盤(pán),把它接入電腦中進(jìn)行數(shù)據(jù)讀取。我們想發(fā)現(xiàn)一些有意思的文件,如前述提及的,可用PRET通過(guò)路徑遍歷漏洞發(fā)現(xiàn),并位于“/Windows/”和“/Core/bin”目錄下的HP dll文件:

但可惜的是,當(dāng)這個(gè)東芝硬盤(pán)接入電腦之后,我們卻找不到這兩個(gè)目錄,經(jīng)過(guò)分析,我們可采用兩種方法來(lái)間接讀取這兩個(gè)目錄下的文件信息:

獲取/Windows/目錄內(nèi)容

我們利用Linux工具grep來(lái)查找/Windows/目錄下的相關(guān)文件:

文件 “NK.bin”似乎每次都會(huì)返回出現(xiàn),經(jīng)分析發(fā)現(xiàn),打印機(jī)的內(nèi)置操作系統(tǒng)為Windows CE(嵌入式操作系統(tǒng)),其內(nèi)核文件就存儲(chǔ)在 /CEKERNEL中,這樣,我們就能使用開(kāi)源工具Nkbintools來(lái)提取其內(nèi)核中的詳細(xì)信息了,通過(guò)其就可發(fā)現(xiàn)具體的Windows目錄了:

獲取/Core/bin目錄內(nèi)容

想獲取/Core/bin目錄內(nèi)容似乎有點(diǎn)難度,當(dāng)硬盤(pán)接入電腦后, /Core/bin目錄是可見(jiàn)的,但它卻是空的:

經(jīng)過(guò)一番失敗嘗試后,我們明確知道它并不是空的,于是采取了另外一種方式進(jìn)行獲取。首先,我們檢查了硬盤(pán)上與/Core/目錄相關(guān)的分區(qū)信息:

然后,我們使用linux下的數(shù)據(jù)讀取命令dd來(lái)對(duì)該分區(qū)生成一個(gè)鏡像,dd命令下文件系統(tǒng)不會(huì)產(chǎn)生限制,就這樣我們把dd生成的raw格式鏡像間接存儲(chǔ)到了一個(gè)本地文件中來(lái):

最后,我們用到了數(shù)字取證中的“文件雕刻”技術(shù), 該技術(shù)通常用于數(shù)據(jù)恢復(fù)過(guò)程中的硬盤(pán)部分發(fā)生故障或文件系統(tǒng)已損壞的情形,它直接二進(jìn)制數(shù)據(jù)集即原始磁盤(pán)映象中提取恢復(fù)文件,這里我們用到了工具scalpel,通過(guò)指定一個(gè)配置文件,它就會(huì)從raw鏡像image.bin中找出任何可疑的DLL文件,但這些DLL文件大多都是無(wú)效的,且文件名都是數(shù)字格式:

由于我們最感興趣的是在.NET DLL類(lèi)文件中的信息,因此可使用monodis工具來(lái)嘗試反匯編每個(gè)DLL文件,并只顯示出有效的DLL文件及其名稱(chēng)列表。有點(diǎn)麻煩,且最終腳本輸出雖然有些混亂,但從其中提取的信息顯示這些文件正是我們正在尋找的DLL文件:

逆向固件和HP軟件解決方案框架

通過(guò)訪問(wèn)設(shè)備上運(yùn)行的代碼,我們可以開(kāi)始深入了解打印機(jī)中可能導(dǎo)致遠(yuǎn)程代碼執(zhí)行的一些功能特性,特別是與安裝HP軟件解決方案框架和固件相關(guān)的功能更新。

HP軟件解決方案框架利用惠普的OXP平臺(tái)和SDK來(lái)擴(kuò)展打印機(jī)的功能,第三方公司可以開(kāi)發(fā)這些解決方案,但是這樣做的訪問(wèn)權(quán)限由HP嚴(yán)格控制的,并且使用SDK開(kāi)發(fā)的任何軟件的最終版本必須由HP簽署才能安裝到任何打印機(jī)上。如果能夠找到繞過(guò)HP控制措施的方法,就有可能創(chuàng)建惡意的解決方案,并把其部署運(yùn)行在所有的HP打印機(jī)上。

惡意固件更新是以前在各種廠商打印機(jī)上獲得代碼執(zhí)行的一種方法,但現(xiàn)在HP已經(jīng)應(yīng)用了新的更新平臺(tái)和文件格式來(lái)執(zhí)行固件更新,這貌似有沒(méi)有安全研究人員詳細(xì)審查過(guò)。

逆向BDL文件

HP軟件解決方案框架和固件更新中都包含了一個(gè)后綴為.BDL壓縮包格式的文件,這是一個(gè)專(zhuān)門(mén)的二進(jìn)制格式文件,我們決定對(duì)其進(jìn)行逆向,其中可能包含了一些我們能深入窺見(jiàn)HP軟件解決方案框架和固件更新的信息。

由于HP固件文件龐大且復(fù)雜,為簡(jiǎn)單起見(jiàn),我們先獲取了名為T(mén)hinPrint的第三方打印解決方案包,最后發(fā)現(xiàn),與81MB的固件更新文件相比,ThinPrint中的BDL格式包文件為2.1MB。

首先,我們?cè)贐DL包文件上利用binwalk的工具,binwalk可檢查二進(jìn)制文件并能提取出其中包含的任何已知文件格式信息,它是專(zhuān)門(mén)應(yīng)用于這類(lèi)型包文件的逆向工具。最終,利用binwalk發(fā)現(xiàn)BDL包中包含了一個(gè)以下內(nèi)容的ZIP文件:

之后,我們?cè)谑M(jìn)制編輯器中手動(dòng)檢查了zip文件和BDL包文件,以確定ZIP文件在BDL包文件中的位置,以下是用binwalk提取的zip文件的CRC-32校驗(yàn)顯示:

以下是用binwalk提取的BDL包文件中顯示包含zip文件部分的校驗(yàn)顯示:

注意上面兩個(gè)十六進(jìn)制編輯器中的截圖,第一圖是zip文件在整個(gè)文件中的CRC-32校驗(yàn)顯示,第二圖中,則為BDL包文件中我們懷疑包含zip文件部分的,基于前幾個(gè)字節(jié)匹配的CRC-32校驗(yàn)顯示,最終,可以看出,兩圖中的CRC-32校驗(yàn)和都為相同的“6D AC 9A 2F”,說(shuō)明我們的懷疑沒(méi)錯(cuò)。

上圖中紅色圈起來(lái)的部分“2F 9A AC 6D”,請(qǐng)注意,它是在zip文件之前的CRC-32校驗(yàn)和,其字節(jié)順序是與校驗(yàn)和“6D AC 9A 2F”相反的。

到此,我們對(duì)zip文件進(jìn)行了小小的修改(只修改了其中一個(gè)文件的內(nèi)容),然后計(jì)算了修改過(guò)的zip文件CRC-32校驗(yàn)和,并用新修改的這個(gè)zip文件替換了BDL中的原有zip文件,最后把整個(gè)BDL文件中CRC-32校驗(yàn)和更新,最后把這個(gè)BDL文件上傳到打印機(jī)上,可惜的是,這不起作用,顯示以下錯(cuò)誤:

這種情況下,通過(guò)對(duì)打印機(jī)的調(diào)試日志進(jìn)行分析,我們發(fā)現(xiàn)了以下信息:

以上信息說(shuō)明,當(dāng)zip文件被替換時(shí),其它的CRC校驗(yàn)和被破壞,經(jīng)過(guò)進(jìn)一步分析,我們編寫(xiě)了自定義python腳本去識(shí)別文件中的CRC-32校驗(yàn)和,重點(diǎn)推斷出了以下ThinPrint中BDL包文件的幾個(gè)重要位置字段校驗(yàn)和:

0×14-0×17 = 0×929與0×938的CRC32校驗(yàn)和 (IPKG包頭)

0×931-0×934 = IPKG包結(jié)構(gòu)長(zhǎng)度

0x94d-0×950 = 0xd76與0xe89的CRC32校驗(yàn)和 (ZIP包頭)

0×929-0x92a = 從BDL文件開(kāi)始的IPKG結(jié)構(gòu)長(zhǎng)度

0xe76-0xe77 = 從IPKG包頭開(kāi)始的ZIP結(jié)構(gòu)長(zhǎng)度

0xe7e-0xe81 =ZIP文件長(zhǎng)度

0xe86-0xe89 = 0xe8b-EOF的CRC32校驗(yàn)和 (ZIP文件二進(jìn)制)

有了這些也是不行的 – 當(dāng)BDL文件上傳到打印機(jī)時(shí),即使其中更新了上面列出的所有校驗(yàn)和和長(zhǎng)度信息,但仍然會(huì)導(dǎo)致某種校驗(yàn)和失?。?/p>

在此,我們決定采取其它替代方法,理論上說(shuō),可以構(gòu)建一個(gè)與原始長(zhǎng)度相同并具有相同CRC-32校驗(yàn)和的zip文件。如果這樣可行,就不需更新BDL文件中的任何位置字段!

我們用Python編寫(xiě)了一個(gè)自定義工具(GitHub)來(lái)完成這項(xiàng)任務(wù),該工具可用長(zhǎng)度和校驗(yàn)和相同但內(nèi)容不同的zip文件,來(lái)替換原始BDL中的zip文件,形成對(duì)BDL文件的修改,該工具只適用于ThinPrint下的BDL包文件。

最終,這種方式修改的BDL文件被上傳到打印機(jī)后,能完全被打印機(jī)兼容運(yùn)行,但對(duì)代碼的一些惡意更改卻不可行。而且,當(dāng)我們?cè)噲D替換zip中的任意DLL文件時(shí),又向我們返回了DLL簽名驗(yàn)證錯(cuò)誤。

逆向固件簽名驗(yàn)證機(jī)制

現(xiàn)在,我們對(duì)BDL文件的大概狀況有所了解,可以開(kāi)始檢查固件更新過(guò)程和其相關(guān)的安全控制措施。經(jīng)分析,與HP打印機(jī)固件更新相關(guān)的文件仍然是.bdl后綴格式的文件,首先,我們?cè)谑M(jìn)制編輯器中檢查了HP打印機(jī)的某個(gè)固件更新文件,值得注意的是,在該.bdl文件末尾存在一個(gè)簽名塊:

此簽名塊在并不存在于上述提及的ThinPrint解決方案的BDL包文件中,這表明軟件解決方案包和固件更新可能是不同的處理方式,

通過(guò)簽名塊中的信息判斷,其似乎使用了行業(yè)簽名驗(yàn)證標(biāo)準(zhǔn),如RSA with SHA256,但是,僅因?yàn)槌霈F(xiàn)了一個(gè)安全密碼算法并不能判斷該文件就能被安全驗(yàn)證,許多常見(jiàn)的實(shí)現(xiàn)錯(cuò)誤都會(huì)導(dǎo)致簽名驗(yàn)證不安全。

為了找出執(zhí)行簽名驗(yàn)證的代碼模塊,仿照上述ThinPrint解決方案的BDL包繞過(guò)方式,我們把一個(gè)精心制作的固件文件上傳到打印機(jī)中,希望其校驗(yàn)和或長(zhǎng)度都能有效通過(guò)驗(yàn)證。但在執(zhí)行上傳之后,打印機(jī)的調(diào)試日志中產(chǎn)生了以下錯(cuò)誤信息:

通過(guò)查看從打印機(jī)中提取的反編譯代碼,確定該錯(cuò)誤消息是在類(lèi)文件HP.M中生成的:

進(jìn)一步的逆向工程使我們找到了執(zhí)行簽名驗(yàn)證的代碼模塊,經(jīng)過(guò)快速代碼審查,沒(méi)有發(fā)現(xiàn)可以繞過(guò)或操縱固件簽名驗(yàn)證的嚴(yán)重漏洞:(。

逆向HP解決方案包的DLL簽名驗(yàn)證

由于我們已經(jīng)可以部分逆向設(shè)計(jì)BDL格式包文件,如果要嘗試在打印機(jī)上執(zhí)行惡意代碼,那么第一步顯然是用修改的DLL文件替換掉BDL包中的某個(gè)DLL文件。但還是不行,這種情況下,打印機(jī)調(diào)試日志中出現(xiàn)了以下錯(cuò)誤信息:

這個(gè)詳細(xì)的錯(cuò)誤信息直接指向了正在執(zhí)行簽名驗(yàn)證的代碼位置“HP.Ex”:

深入分析,我們檢查了“”下的代碼:

快速查看這段代碼后,我們懷疑可能會(huì)有一些問(wèn)題。在第11行中,代碼從DLL文件的第60個(gè)字節(jié)讀取一個(gè)數(shù)字,在第14行和第15行,從DLL文件讀取兩個(gè)或更多的數(shù)字到變量int32_2和int32_3中。在第19至22行,這兩個(gè)新變量作為DLL文件的一部分,會(huì)被加載到名為numArray2的數(shù)組中去,從第22行開(kāi)始,之后的代碼將會(huì)在數(shù)組numArray2上運(yùn)行。

仔細(xì)檢查上述過(guò)程,使得我們懷疑,可以對(duì)讀入變量int32_2和int32_3的數(shù)字進(jìn)行操控,使得簽名驗(yàn)證的DLL文件部分,可與實(shí)際將在打印機(jī)上的執(zhí)行代碼分離,進(jìn)而能深入構(gòu)造惡意代碼。

構(gòu)建惡意的HP解決方案

打破HP的DLL文件數(shù)字簽名驗(yàn)證

為了驗(yàn)證上面的懷疑,我們通過(guò)筆記本電腦的C#編程,構(gòu)造重現(xiàn)了打印機(jī)上執(zhí)行簽名驗(yàn)證的算法。然后,把該算法程序在Visual Studio調(diào)試器中運(yùn)行,并用HP簽名的有效DLL文件作為輸入。執(zhí)行在“”中的第22行停止了,也就是下圖新構(gòu)造程序中的第65行,這里就是numArray2從DLL文件中被讀取的地方:

請(qǐng)注意,在此,我們可以在上面的調(diào)試窗口中看到int32_1、int32_2、int32_3和numArray2的值,且數(shù)組numArray2的內(nèi)容會(huì)被轉(zhuǎn)儲(chǔ)到硬盤(pán)上名為“Foo.txt”的文件中:

我們沒(méi)有對(duì)其實(shí)際內(nèi)容進(jìn)行分析,接下來(lái),在HxD十六進(jìn)制編輯器中,我們使用復(fù)制/粘貼,將文件“Foo.txt”內(nèi)容簡(jiǎn)單地附加到一個(gè)自定義且未經(jīng)簽名驗(yàn)證的.NET DLL文件“HPwn.dll”末尾,下圖紅色字體字節(jié)即為復(fù)制“Foo.txt”插入的字節(jié):

接下來(lái),我們必須精心制作這個(gè)HPwn.dll文件,以便HP的簽名驗(yàn)證算法能有效將文件末尾復(fù)制插入的新字節(jié)加載到numArray2中去。

仔細(xì)分析上面的代碼,結(jié)合十六進(jìn)制編輯器中相應(yīng)的字節(jié)值可得出:

int32_2在DLL文件中被加載的偏移地址 = int32_1 + 152 = 128 + 152 = 280 = 118 hex

int32_3在DLL文件中被加載的偏移地址 = int32_1 + 156 = 128 + 156 = 284 = 11C hex

檢查我們制作的HPwn.dll,在118hex至11Chex之間的當(dāng)前值全為0:

之前說(shuō)過(guò),int32_2和int32_3最終會(huì)作為變量被從DLL中加載到數(shù)組numArray2中,那么,現(xiàn)在問(wèn)題顯而易見(jiàn),我們應(yīng)如何設(shè)置int32_2和int32_3的值,以便其將Foo.txt中粘貼在DLL文件末尾的字節(jié)讀入到numArray2中呢?

我們?cè)俅螜z查代碼,其20至22行之間是這樣定義的:

由此可見(jiàn),讀入numArray2中的字節(jié)將是DLL文件中從位置int32_2 + 8到int32_3-8之間的字節(jié)。

“Foo.txt”被插入到HPwn.dll中的起始偏移地址為0×1200,numArray2數(shù)組的總共長(zhǎng)度為11360字節(jié)(前述C#代碼調(diào)試圖中有),也就是說(shuō),我們希望簽名驗(yàn)證算法讀取HPwn.dll中,起始位置為0×1200,長(zhǎng)度為11360字節(jié)的“Foo.txt”的內(nèi)容。所以,我們先來(lái)找出int32_2和int32_3的具體數(shù)值:

int32_2 = 0×1200-0×8 = 0x11F8

int32_3 = 11360 = 0x2C68

它們?cè)谑M(jìn)制編輯器中是這樣顯示的:

現(xiàn)在,對(duì)這個(gè)新的DLL文件HPwn.dll運(yùn)行簽名驗(yàn)證算法,得到以下結(jié)果:

也就是說(shuō),我們可以成功繞過(guò)HP的簽名驗(yàn)證算法,可以任意上傳DLL文件了!

構(gòu)造惡意代碼執(zhí)行

想要在目標(biāo)HP打印機(jī)上執(zhí)行惡意代碼,一種方法是構(gòu)建我們自己的惠普軟件解決方案包,另一種方法是繞過(guò)惠普的數(shù)字簽名驗(yàn)證機(jī)制,剩下的唯一障礙就是構(gòu)建一個(gè)與惠普平臺(tái)兼容的惡意軟件。

構(gòu)建惡意軟件

為了實(shí)現(xiàn)創(chuàng)建惡意軟件的目的,我們以HP ThinPrint客戶端主類(lèi)中的反編譯代碼為例來(lái)看看:

太好了,這個(gè)代碼相對(duì)簡(jiǎn)單。只要你手上有我們能夠從打印機(jī)中提取的HP.Ex副本文件,實(shí)現(xiàn)該類(lèi)應(yīng)該不難。下圖顯示了我們對(duì)其代碼作的大部分修改,它與原有類(lèi)實(shí)現(xiàn)了相同的方法和接口,但卻執(zhí)行了不同操作:

不過(guò),你可以從我們?cè)贕ithub中的HPwn項(xiàng)目中獲取這些文件。仔細(xì)觀察其中的“DoBadStuff” 方法,我們用它來(lái)執(zhí)行以下反復(fù)的文件下載操作:

1)從我們架設(shè)的網(wǎng)站下載一個(gè)文件到目標(biāo)打印機(jī)中

2) 在打印機(jī)中執(zhí)行下載文件中的特定指令

3) 等待5秒鐘

4) 重復(fù)上述動(dòng)作

必須要克服的一個(gè)技術(shù)障礙是,項(xiàng)目需要編譯的.NET Compact Framework版本只在Visual Studio 2008 Professional中有。其具體來(lái)說(shuō),也就是其中含有針對(duì)“Windows CE”的目標(biāo)編譯設(shè)備:

測(cè)試惡意軟件

執(zhí)行上一節(jié)中介紹的新DLL文件的簽名驗(yàn)證過(guò)程,然后使用我們的GitHub存儲(chǔ)庫(kù)中的python代碼將該DLL加載到BDL中后,修改的BDL文件就成功上傳到打印機(jī)中:

回想一下,我們構(gòu)造的惡意類(lèi)會(huì)從我們架設(shè)的第一臺(tái)服務(wù)器鏈接下載文件blar。這種情況下,文件“blar”包含一個(gè)簡(jiǎn)單命令,其命令就是讓打印機(jī)“ping”第二臺(tái)我們架設(shè)的互聯(lián)網(wǎng)服務(wù)器,該命令的成功與否可以通過(guò)監(jiān)視我們架設(shè)的第二臺(tái)服務(wù)器來(lái)確認(rèn),整個(gè)過(guò)程如下:

成功部署前述的惡意類(lèi)后,可以看到打印機(jī)向遠(yuǎn)程服務(wù)器發(fā)起了文件下載請(qǐng)求:

確認(rèn)打印機(jī)分行文件blar中的命令后,其ping請(qǐng)求就傳送到第二臺(tái)遠(yuǎn)程服務(wù)器中,這種情況下,服務(wù)器被配置為返回域名為“”的響應(yīng):

當(dāng)然,這只是遠(yuǎn)程代碼執(zhí)行的一個(gè)測(cè)試而已,嚴(yán)重來(lái)說(shuō),可以把上傳到打印機(jī)中BDL文件換成惡意文件,可以在打印機(jī)請(qǐng)求下載的blar文件中加入更多惡意功能,執(zhí)行更多有針對(duì)性和破壞性的惡意命令,成功拿下打印機(jī),再深入往組織機(jī)構(gòu)內(nèi)網(wǎng)滲透。

后記

過(guò)去,對(duì)惠普打印機(jī)的安全研究可能因?yàn)槿鄙倏捎玫墓碳蚈XP SDK文件而形成阻礙,本分析報(bào)告能為進(jìn)一步的安全研究奠定基礎(chǔ),尤其是進(jìn)行深層次的代碼審查中,以下HP打印機(jī)的運(yùn)行方面可能還會(huì)存在一些問(wèn)題。

打印機(jī)開(kāi)發(fā)模式:在審查源代碼時(shí),我們注意到HP打印機(jī)可以進(jìn)入“開(kāi)發(fā)”模式。一旦啟用此模式,似乎可以自由安裝未簽名的固件更新。唯一的開(kāi)發(fā)模式代碼路徑在HP.M中;

多種固件更新機(jī)制:HP打印機(jī)中有多種固件更新方法。首先,大多數(shù)管理員都會(huì)通過(guò)打印機(jī)Web界面和“Web Jet Admin”客戶端來(lái)安裝固件更新;其次,固件也可在設(shè)備啟動(dòng)時(shí)通過(guò)BOOTP / TFTP選項(xiàng)進(jìn)行安裝,但經(jīng)過(guò)很多測(cè)試,我們也無(wú)法在該模式下有效更新。

另外,HP打印機(jī)上的“安全設(shè)置”里說(shuō)明可以通過(guò)9100的端口打印任務(wù)來(lái)更新固件,但我們?cè)谡f(shuō)明書(shū)中沒(méi)有找到該功能解釋。這些固件更新機(jī)制中可能未包含簽名驗(yàn)證措施,如某種固件更新或安裝的要求功能HP.M.RemoteInstall中,就不包含任何數(shù)字簽名驗(yàn)證模塊。后續(xù)還需要更多的研究實(shí)驗(yàn)來(lái)證實(shí)。

1.《打印機(jī)漏洞分析怎么寫(xiě)文章?總結(jié)很全面速看!惠普打印機(jī)某漏洞被黑客利用,淺析50多種惠普打印機(jī)被入侵過(guò)程》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。

2.《打印機(jī)漏洞分析怎么寫(xiě)文章?總結(jié)很全面速看!惠普打印機(jī)某漏洞被黑客利用,淺析50多種惠普打印機(jī)被入侵過(guò)程》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。

3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/why/2932421.html