hacktricks/network-services-pentesting/pentesting-printers
2023-07-07 23:42:27 +00:00
..
accounting-bypass.md Translated to Japanese 2023-07-07 23:42:27 +00:00
buffer-overflows.md Translated to Japanese 2023-07-07 23:42:27 +00:00
credentials-disclosure-brute-force.md Translated to Japanese 2023-07-07 23:42:27 +00:00
cross-site-printing.md Translated to Japanese 2023-07-07 23:42:27 +00:00
document-processing.md Translated to Japanese 2023-07-07 23:42:27 +00:00
factory-defaults.md Translated to Japanese 2023-07-07 23:42:27 +00:00
file-system-access.md Translated to Japanese 2023-07-07 23:42:27 +00:00
firmware-updates.md Translated to Japanese 2023-07-07 23:42:27 +00:00
memory-access.md Translated to Japanese 2023-07-07 23:42:27 +00:00
physical-damage.md Translated to Japanese 2023-07-07 23:42:27 +00:00
print-job-manipulation.md Translated to Japanese 2023-07-07 23:42:27 +00:00
print-job-retention.md Translated to Japanese 2023-07-07 23:42:27 +00:00
README.md Translated to Japanese 2023-07-07 23:42:27 +00:00
scanner-and-fax.md Translated to Japanese 2023-07-07 23:42:27 +00:00
software-packages.md Translated to Japanese 2023-07-07 23:42:27 +00:00
transmission-channel.md Translated to Japanese 2023-07-07 23:42:27 +00:00

プリンタのペンテスト

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

プリンタのペンテストに関連する情報のほとんどは、http://hacking-printers.net/で見つけることができる 巨大で素晴らしい研究から取得されました。ここではその情報を要約しましたが、トピックについて詳しく学ぶためには常にソースにアクセスできます。

基礎知識

プリンタ言語のカプセル化に関する関係の概要は以下の通りです:\

プリンタ言語のカプセル化

ネットワーク印刷プロトコル

プリンタデバイスにデータを送信する方法は、USB/パラレルケーブルまたはネットワークを介して行うことができます。このウィキではネットワーク印刷に焦点を当てていますが、ほとんどの攻撃はローカルプリンタに対しても実行することができます。ネットワーク印刷には、NovellのNCPAppleTalkなどのさまざまなエキゾチックなプロトコルがあります。Windowsの世界では、SMB/CIFS_プリンタ共有が非常に人気があります。さらに、一部のデバイスは_FTP_や_HTTP_ファイルのアップロードなどの一般的なプロトコルを介して印刷をサポートしています。ただし、ネットワークプリンタが直接サポートしている最も一般的な印刷プロトコルは、LPD**、IPP、およびraw port 9100_です。ネットワーク印刷プロトコルは直接攻撃されることがあります。たとえば、プリンタのLPDデーモンでバッファオーバーフローを悪用することができます。ただし、多くの攻撃シナリオでは、これらのプロトコルは悪意のあるプリンタ言語コードを展開するためのキャリア/チャネル**としてのみ機能します。ネットワークプリンタは通常、ドキュメントを「印刷」するために複数のプロトコルをサポートしているため、攻撃面が広がります。

raw port 9100について詳しくはこちら

Pentesting 515でのLPDについて詳しくはこちら

Petesting 631でのIPPについて詳しくはこちら

プリンタ制御言語

ジョブ制御言語は、現在の印刷ジョブの出力トレイなどの設定を管理します。通常、印刷プロトコルとページ記述言語の間にオプションのレイヤーとして存在しますが、機能は重複する場合があります。ベンダー固有のジョブ制御言語の例には、CPCAXJCLEJL、およびPJLがあります。PJLはさまざまなプリンタでサポートされており、以下で詳しく説明します。また、プリンタ制御および管理言語は、単一の印刷ジョブだけでなく、デバイス全体影響を与えるように設計されています。このタスクのために共通の標準を定義するアプローチの1つは、NPAPです。ただし、これは確立されておらず、Lexmarkのみがサポートしています。他のプリンタメーカーは代わりにSNMPまたはそのPJLベースのメタ言語PMLを使用します。

PJL

プリンタジョブ言語PJLは、元々HPによって導入されましたが、すぐに印刷ジョブ制御の事実上の標準となりました。'PJLは他のプリンタ言語の上に存在し、用紙トレイやサイズなどの設定を変更するために使用できます。ただし、PJLは現在の印刷ジョブに限定されるわけではなく、一部の設定は永続的に行うことができます。PJLはまた、プリンタの表示を変更したり、デバイス上のファイルを読み書きしたりするためにも使用できます。ベンダーはPJLリファレンスにリストされているコマンドのサブセットのみをサポートし、独自のコマンドを追加することが多いため、多くの方言があります。PJLは、実際の印刷データのファイル形式を設定するためにも使用されます。このような明示的な言語の切り替えがない場合、プリンタはマジックナンバーに基づいてページ記述言語を識別する必要があります。以下に、PostScriptモードにインタプリタを切り替える前に用紙サイズとコピーの数を設定するための典型的なPJLコマンドの例を示します。

@PJL SET PAPER=A4
@PJL SET COPIES=10
@PJL ENTER LANGUAGE=POSTSCRIPT

**ポート9100 'raw port'**のページでは、PJLの列挙方法についての詳細情報が見つかります。

PML

プリンタ管理言語PMLは、HPプリンタを制御するための専用言語です。これは基本的にSNMPの機能をPJLと組み合わせたものです。公開されているドキュメントは存在しませんが、LPRngプロジェクトによって一部の標準が漏洩されました。PJL Passthrough to PML and SNMP Users Guideでは、PMLを「オブジェクト指向の要求応答型プリンタ管理プロトコル」と定義し、構文の基本について紹介しています。PMLはPJL内に埋め込まれており、プリンタデバイス上のSNMP値の読み取りと設定に使用することができます。これは特に、ファイアウォールがSNMPサービス161/udpへのアクセスをブロックしている場合に興味深いです。以下に、プリントジョブ内でhrDeviceDescrOID 1.3.6.1.2.1.25.3.2.1.3、デバイスのテキスト説明を取得するためにPMLを使用する例を示します

> @PJL DMINFO ASCIIHEX="000006030302010301"
< "8000000603030201030114106870204c617365724a65742034323530

プリンターからの応答である6870204c617365724a65742034323530は、16進数でhp LaserJet 4250を表しています。これにより、PMLを介してSNMPコマンドの一部の呼び出しが可能であることがわかります。PMLのセキュリティに関連する使用法は、通常の印刷ジョブを介してHPプリンターを工場出荷時のデフォルトにリセットすることであり、ユーザーが設定したパスワードなどの保護機構が削除されます。

UEL

Universal Exit LanguageUELは、実際にはジョブ制御の「言語」ではなく、現在のデータストリームを終了するために使用される単一のコマンドです:エスケープ文字(\x1b)の後に%-12345Xが続きます。これは元々HPのPCLで導入され、ほとんどの最新のレーザープリンターでサポートされています。『プリンタードライバー』の良い慣行は、各印刷ジョブの開始時と終了時にUELを呼び出すことで、プリンター言語の解釈が停止/再開され、各ジョブには独自の環境があります。以下に示します:

\x1b%-12345X
@PJL SET PAPER=A4
@PJL ENTER LANGUAGE=PCL
...
[PCL datastream]
...
\x1b%-12345X

それ以外の場合、たとえば、1つの印刷ジョブで設定されたPJL設定用紙メディアサイズやPostScriptの定義などは、次のジョブに影響を与える可能性があります。UELは、複数のジョブを単一のファイル/データストリームにまとめてプリンタに送信するのに便利です。これは、ハードウェアのページカウンターをだますために使用したり、クロスサイト印刷攻撃で印刷言語を切り替えるために使用することができます。

ページ記述言語

ページ記述言語PDLは、実際のドキュメントの外観を指定します。ただし、一部のPDLは制御が制限されているため、ページ記述とプリンタ/ジョブ制御言語の明確な区別が常に可能ではありません。『プリンタドライバ』の機能は、印刷するファイルをプリンタモデルで理解できるPDL変換することです。なお、一部の低価格インクジェットプリンタは、高レベルのページ記述言語をサポートしていません。いわゆるホストベースまたはGDIプリンタは、ZJSのような単純なビットマップデータストリームのみを受け入れますが、実際のレンダリングはプリンタドライバによって行われます。KyoceraのPRESCRIBESPLXESCaPSLRPCSESC/Pなど、さまざまなプロプライエタリなページ記述言語があります。これらは、ドットマトリックスプリンタで主に使用されるHP-GLおよびHP-GL/2、直接のPDFおよびXPS印刷のサポートも、新しいプリンタで一般的です。ただし、最も一般的な「標準」のページ記述言語はPostScriptとPCLです

PostScriptPS

「ページ記述」という用語は誤解を招くかもしれませんが、PostScriptは単なるベクターグラフィックを作成するだけでなく、さらに多くの機能を持っています。PostScriptは、アドビによって作成されたスタックベースのチューリング完全プログラミング言語であり、算術、スタックおよびグラフィックの操作、配列や辞書などのさまざまなデータ型を含む約400の演算子から構成されています。
技術的には、PostScriptインタプリタへのアクセスはすでにコードの実行と分類されることができます。なぜなら、理論的にはどんなアルゴリズム関数でもPostScriptで実装することができるからです。もちろん、ネットワークスタックや追加のオペレーティングシステムライブラリにアクセスできない場合、ビットコインのマイニングなどの任意の数学的計算に限定されます。ただし、PostScriptは、コード、グラフィック、またはフォントファイルを頻繁に使用するための基本的なファイルシステムI/Oも行うことができます。
元々は機能として設計されたため、このような機能の危険性は、プリンタが相互接続される前には制限されていました。リンクされたPostScriptEPSも注目に値します。これは、LaTeXドキュメントなどのホストで解釈される他のファイル形式に含まれることができます。PJLPCLと同様に、PostScriptはホストとプリンタ間の双方向通信をサポートしています。
以下に、Hello worldをstdoutにエコーするためのPostScriptコードの例を示します。

%!
(Hello world) print

BrotherとKyoceraは独自のPostScriptクローン、Br-ScriptKPDLを使用しています。これらのPostScriptのバリエーションは、セキュリティ機能サーバーループの終了などに関しては100互換性がありません。PostScriptは、サービス拒否攻撃(無限ループによるものなど)、印刷ジョブの操作および保持、およびプリンタのファイルシステムへのアクセスなど、さまざまな攻撃に使用できます。

サーバーループの終了

通常、各印刷ジョブは独自の環境でカプセル化されます。PostScriptの興味深い機能の1つは、プログラムが印刷ジョブのカプセル化を回避し、後続のジョブのための初期VMを変更できることです。これを行うには、レベル2の機能であるstartjobを使用できます。

true 0 startjob

またはexitserverジョブサーバーを含むすべての実装で利用可能

serverdict begin 0 exitserver

この機能は、デフォルトで 0 のStartJobPasswordによって制御されます資格情報の漏洩を比較してください。ジョブサーバーループは通常、ジョブ間でインタプリタの状態をクリーンアップする責任がありますので、サーバーループの外で行われた変更は、すべての後続のジョブの永続的なインタプリタの状態の一部として残ります。言い換えれば、印刷ジョブは他のジョブにアクセスして変更することができます。ビンゴ

オペレータの再定義

PostScriptドキュメントがオペレータを呼び出すとき、辞書スタックで最初に見つかったバージョンが使用されます。オペレータは通常、systemdict辞書に存在しますが、userdict辞書に新しいバージョンを配置することで、オペレータを実質的に上書きすることができます。なぜなら、ユーザー定義のバージョンが辞書スタックで最初に見つかるからです。startjob/exitserverオペレータを使用することで、このような変更を永続的に行うことができますが、プリンタが再起動されるまでです。以下にPostScript辞書スタックのスキームを示します


The PostScript dictionary stack


オペレータの再定義の潜在的な影響は、創造力によってのみ制限されます。さらに正当なドキュメントが印刷され、再定義されたオペレータが呼び出されると、攻撃者のバージョンが実行されます。これにより、サービス拒否、印刷ジョブの保持、および操作など、さまざまな攻撃が行われる可能性があります。ただし、これは必ずしもセキュリティのバグではなく、32年前の言語機能であり、ほとんどのPostScriptプリンターとRIPで利用可能です。

PCL

PCL 3およびPCL 4は、フォントとマクロのサポートを追加しましたが、これらはデバイスに永久的にダウンロードされます。ただし、ファイルシステムへの直接アクセスは意図されていませんので、ファイル名ではなく数値IDで参照されます。PCL 1から5は、エスケープシーケンスに続いて解釈されるコマンドを表す1つ以上のASCII文字で構成されています。PCL 6 Enhancedまたは「PCL XL」は、バイナリエンコードされたオブジェクト指向プロトコルを使用します。以下に「Hello world」を印刷するための例となるPCLドキュメントが示されています

<Esc>Hello world

PCLはセキュリティの観点からは攻撃が難しいため、特定のプリンタメーカーのPCLフレーバーにおいて興味深いプロプライエタリコマンドを発見しない限り、悪用することは困難です。PRETツールは、仮想のPCLベースのファイルシステムを実装しており、マクロを使用してファイルの内容とメタデータをプリンタのメモリに保存します。このハックは、PCLのような最小限のページ記述言語のみをサポートするデバイスでも、著作権侵害物などの任意のファイルを保存するために使用できることを示しています。プリンタをファイル共有サービスに変えること自体はセキュリティ上の脆弱性ではありませんが、企業のポリシーによっては「サービスの誤用」として適用される場合があります。

その他の攻撃

USBドライブまたはケーブル

データはUSBまたはパラレルケーブルを介してローカルプリンタに送信および受信することができます。PRETは、デバイスと通信するためにこれらの両方のチャネルをサポートしています。さらに、プリンタやMFPには、ユーザーがUSBデバイスから直接印刷できるType-A USBポートが搭載されていることがよくあります。
USBプリンタの悪用には、攻撃者がデバイスに物理的にアクセスする必要がありますが、これはほとんどの機関や企業にとって完全に現実的ではありません。プリンタへの物理的アクセスを獲得することは、サーバーやワークステーションなどの他のネットワークコンポーネントに比べて一般的には難しいとは言えません。

クロスサイト印刷

攻撃者は、クライアントの内部ネットワークに接続されたクライアントの悪意のあるウェブページを介して任意のプリンタを悪用することができます。
ここでそれが可能になる方法を学びましょう。

ADのスプーラーサービスの悪用

ドメイン内でスプーラーサービスがリッスンしている場合、それを悪用して新しい資格情報を取得し、特権をエスカレートすることができるかもしれません。
スプーラーサービスの悪用方法の詳細についてはこちらを参照してください。

特権エスカレーション

工場出荷時設定

デバイスを工場出荷時の設定にリセットするためのいくつかの方法があります。これは、ユーザーが設定したパスワードなどの保護メカニズムを上書きするなど、セキュリティ上重要な機能です。
詳細はこちらを参照してください。

会計バイパス

既存のユーザーまたは存在しないユーザーをなりすまして彼らのアカウントを使用してページを印刷したり、ハードウェアまたはソフトウェアのカウンタ操作してより多くのページを印刷したりすることができるかもしれません。
ここでそれを行う方法を学びましょう。

スキャナとファックス

スキャナやファックスの機能にアクセスすることで、他の機能にアクセスすることができるかもしれませんが、これはすべてベンダーに依存します。
詳細はこちらを参照してください。

印刷ジョブへのアクセス

印刷ジョブの保持

ジョブはメモリに保持され、コントロールパネルから後で再印刷することができます。また、PostScriptを使用すると、印刷される予定のすべてのジョブにリモートでアクセスし、ダウンロードして印刷することもできます。
詳細はこちらを参照してください。

印刷ジョブの操作

印刷されるページに新しいコンテンツを追加したり、印刷されるすべてのコンテンツを変更したり、特定の文字や単語だけを置換したりすることができます。
ここでそれを行う方法を学びましょう。

情報の漏洩

メモリアクセス

NVRAMメモリをダンプし、そこから(パスワードなどの)機密情報を抽出することができるかもしれません。
ここでその方法を読んでください。

ファイルシステムアクセス

PJLまたはPostScriptを悪用して、ファイルシステムにアクセスすることができるかもしれません。
ここでその方法を読んでください。

資格情報の漏洩/ブルートフォース

SNMPLDAPの設定を悪用してパスワードを漏洩することができるかもしれません。また、PJLPostScriptブルートフォースすることもできます。
ここでその方法を読んでください。

コード実行

バッファオーバーフロー

PJL入力LPDデーモンで既にいくつかのバッファオーバーフローが見つかっており、さらに存在する可能性があります。
詳細についてはこちらを読んでください。

ファームウェアの更新

プリンタに対して特別に作成した悪意のあるドライバでドライバを更新させることができるかもしれません。
詳細についてはこちらを読んでください。

ソフトウェアパッケージ

プリンタベンダーは、デバイスにカスタムソフトウェアをインストールする可能性を導入し始めましたが、情報は一般には公開されていません。プリンタ上で実行されるカスタマイズされたソフ