26 KiB
プリンターのペネトレーションテスト
htARTE (HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ
HackTricksをサポートする他の方法:
- HackTricksにあなたの会社を広告したい、またはHackTricksをPDFでダウンロードしたい場合は、サブスクリプションプランをチェックしてください!
- 公式PEASS & HackTricksグッズを入手する
- PEASSファミリーを発見し、独占的なNFTコレクションをチェックする
- 💬 Discordグループに参加するか、テレグラムグループに参加するか、Twitter 🐦 @carlospolopmをフォローする。
- HackTricksとHackTricks CloudのgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有してください。
プリンターのペネトレーションテストに関連するほとんどのコンテンツは、http://hacking-printers.net/で見つけることができる大規模で素晴らしい研究から取られました。ここではその情報を要約しましたが、トピックについてさらに学ぶためにはソースにアクセスしてください。
基本
プリンター言語のカプセル化に関する概念図を以下に示します:\
ネットワーク印刷プロトコル
プリンターへのデータ送信は、USB/パラレルケーブルまたはネットワーク経由で行うことができます。このwikiはネットワーク印刷に焦点を当てていますが、提示された攻撃のほとんどはローカルプリンターに対しても実行可能です。ネットワーク印刷用のさまざまな特殊なプロトコルがあります。例えば、NovellのNCPやAppleTalkなどです。Windowsの世界では、SMB/CIFS_プリンターシェアがかなり人気になっています。さらに、一部のデバイスは、FTP_や_HTTP_ファイルアップロードなどの汎用プロトコルを介して印刷をサポートしています。しかし、ネットワークプリンターが直接サポートする最も一般的な印刷プロトコルは、LPD、IPP、および_raw port 9100_印刷です。ネットワーク印刷プロトコルは直接攻撃される可能性があります。例えば、プリンターのLPDデーモンのバッファオーバーフローを悪用することができます。しかし、多くの攻撃シナリオでは、それらは単に悪意のあるプリンター言語コードを展開するためのキャリア/チャネルとして機能します。ネットワークプリンターは通常、文書を「印刷」するために複数のプロトコルをサポートしていることに注意してください。これにより攻撃面が広がります。
raw port 9100についてもっと学ぶはこちら。
LPDについてもっと学ぶはこちら。
IPPについてもっと学ぶはこちら。
プリンター制御言語
ジョブ制御言語は、現在の印刷ジョブの出力トレイなどの設定を管理します。通常、印刷プロトコルとページ記述言語の間にオプションのレイヤーとして存在しますが、機能が重複することがあります。ベンダー固有のジョブ制御言語の例には、CPCA、XJCL、EJL、そして多くのプリンターでサポートされているPJLがあります。さらに、プリンター制御および管理言語は、単一の印刷ジョブだけでなく、デバイス全体に影響を与えるように設計されています。このタスクの共通標準を定義する一つのアプローチは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
Printer Management Language (PML) は、HPプリンターを制御するための独自言語です。基本的には、SNMPとPJLの機能を組み合わせています。公開されているドキュメントはありませんが、LPRngプロジェクトによって標準の一部がリークされました。PJL Passthrough to PML and SNMP User’s GuideはPMLを「オブジェクト指向のリクエスト-リプライプリンター管理プロトコル」と定義し、構文の基本についての導入を提供しています。PMLはPJL内に埋め込まれており、プリンターデバイス上のSNMP値の読み取りと設定に使用できます。これは特に、ファイアウォールがSNMPサービス(161/udp)へのアクセスをブロックしている場合に興味深いです。以下に示すのは、プリントジョブ内でPMLを使用してhrDeviceDescr
値(OID 1.3.6.1.2.1.25.3.2.1.3、デバイスのテキスト説明)を取得する例です:
> @PJL DMINFO ASCIIHEX="000006030302010301"
< "8000000603030201030114106870204c617365724a65742034323530
UEL
ユニバーサルエグジットランゲージ(UEL)は、実際には本物のジョブコントロール「言語」ではなく、現在のデータストリームを終了するために使用される単一のコマンドです:エスケープ文字(\x1b
)、に続いて%-12345X
です。元々はHPのPCLで導入され、ほとんどの現代のレーザープリンターに対応しています。良い「プリンタードライバー」の実践は、以下に示すように、各印刷ジョブの開始と終了時にUELを呼び出すことで、プリンター言語の解釈が停止/再開され、各ジョブが独自の分離された環境を持つようにすることです:
\x1b%-12345X
@PJL SET PAPER=A4
@PJL ENTER LANGUAGE=PCL
...
[PCL datastream]
...
\x1b%-12345X
それ以外にも、例えばPJLの設定(紙のメディアサイズやPostScriptの定義など)が一つの印刷ジョブに設定されると、次のジョブに影響を与える可能性があります。**UELは、複数のジョブを単一のファイル/データストリームに連結してプリンターに送信するのに便利です**。これは、**ハードウェアページカウンター**を騙したり、進んだ**クロスサイト印刷攻撃**で印刷言語を切り替えるために使用されることがあります。
## ページ記述言語
**ページ記述言語**(PDL)は、**実際のドキュメントの外観**を指定します。ただし、一部のPDLは限定的なジョブ制御しか提供しないため、**ページ記述とプリンター/ジョブ制御言語の明確な区分は常に可能ではありません**。プリンタードライバーの機能は、印刷される**ファイル**をプリンターモデルが**理解**する**PDL**に**翻訳**することです。一部の低コストのインクジェットプリンターは、高レベルのページ記述言語をまったくサポートしていないことに注意してください。いわゆるホストベースまたは[GDI](https://en.wikipedia.org/wiki/Graphics_Device_Interface#GDI_printers)プリンターは、実際のレンダリングがプリンタードライバーによって行われる間、[ZJS](http://www.undocprint.org/formats/page_description_languages/zjstream)のような単純なビットマップデータストリームのみを受け入れます。キョセラの[PRESCRIBE](http://www.undocprint.org/formats/page_description_languages/prescribe)、[SPL](http://www.undocprint.org/formats/page_description_languages/spl)、[XES](http://www.undocprint.org/formats/page_description_languages/xes)、[CaPSL](http://www.undocprint.org/formats/page_description_languages/capsl)、[RPCS](http://www.undocprint.org/formats/page_description_languages/rpcs)、ドットマトリックスプリンターで主に使用される[ESC/P](https://en.wikipedia.org/wiki/ESC/P)、プロッター用に設計された[HP-GL](https://en.wikipedia.org/wiki/HPGL)と[HP-GL/2](https://en.wikipedia.org/wiki/HPGL#HP-GL.2F2)など、さまざまな独自のページ記述言語があります。新しいプリンターでは、直接の[PDF](https://en.wikipedia.org/wiki/Portable_Document_Format)および[XPS](https://en.wikipedia.org/wiki/Open_XML_Paper_Specification)印刷も一般的です。しかし、最も一般的な「標準」ページ記述言語はPostScriptとPCLです。
### PostScript (PS)
ただし、「ページ記述」という用語は誤解を招く可能性があります。なぜなら、**PostScriptはベクターグラフィックスの作成だけでなく、はるかに多くのことができるからです**。PostScriptはスタックベースの、**チューリング完全**なプログラミング言語であり、算術、スタック、グラフィック操作用の約400のオペレーターと、配列や辞書などのさまざまなデータ型で構成されており、Adobeによって作成されました。\
技術的に言えば、PostScriptインタープリタへのアクセスは、理論的にはPostScriptで任意のアルゴリズム関数を実装できるため、既に**コード実行**と分類されます。確かに、ネットワークスタックや追加のオペレーティングシステムライブラリへのアクセスがなければ、可能性はビットコインのマイニングのような任意の数学的計算に限定されます。しかし、PostScriptは、頻繁に使用されるコード、グラフィックス、またはフォントファイルを保存するための基本的なファイルシステムI/Oが可能です。\
もともとは機能として設計されましたが、プリンターが相互接続される前はそのような機能の危険性は**限定されていました**。リスクは主にホストベースのPostScriptインタープリターの文脈で議論されていました。この点で、Encapsulated PostScript (EPS)も注目に値します。なぜなら、[LaTeX](https://en.wikipedia.org/wiki/LaTeX)ドキュメントなど、ホスト上で解釈される他のファイル形式に含めることができるからです。**PJL**や**PCL**と同様に、**PostScript**はホストとプリンター間の**双方向通信**をサポートしています。\
以下に、標準出力にHello worldをエコーするPostScriptコードの例を示します:
%!
(Hello world) print
BrotherとKyoceraは独自のPostScriptクローンであるBr-ScriptとKPDLを使用しています。PostScript言語のこれらのフレーバーは、特にサーバーループを終了するようなセキュリティ機能に関しては100%互換性がありません。PostScriptは、無限ループを通じたサービス拒否(例えば)、プリントジョブの操作や保持、さらにはプリンターのファイルシステムへのアクセスなど、さまざまな攻撃に使用することができます。
サーバーループを終了する
通常、各プリントジョブは独自の、分離された環境にカプセル化されています。PostScriptの興味深い機能の一つは、プログラムがプリントジョブのカプセル化を回避し、後続のジョブのための初期VMを変更することができることです。これを行うために、レベル2の機能であるstartjobを使用することができます:
true 0 startjob
またはexitserver(ジョブサーバーを含むすべての実装で利用可能):
serverdict begin 0 exitserver
オペレーターの再定義
PostScript ドキュメントがオペレーターを呼び出すとき、辞書スタック上で最初に見つかったバージョンが使用されます。オペレーターは通常、systemdict 辞書に存在しますが、新しいバージョンを userdict 辞書に配置することで、ユーザー定義バージョンが辞書スタック上で最初に見つかるため、実質的にオペレーターを上書きすることができます。startjob/exitserver オペレーターを使用すると、プリンターが再起動されるまで、そのような変更を永続的にすることができます。以下に PostScript 辞書スタックの概要を示します:
オペレーターを再定義する潜在的な影響は創造力によってのみ制限されます。さらに正当なドキュメントが印刷され、再定義されたオペレーターを呼び出すと、攻撃者のバージョンが実行されます。これにより、サービス拒否、印刷ジョブの保持、操作など、さまざまな攻撃が可能になります。ただし、これは必ずしもセキュリティバグではなく、ほぼすべての PostScript プリンターと RIP で利用可能な、32年前の言語機能であることに注意してください。
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](https://en.wikipedia.org/wiki/USB)または[パラレル](https://en.wikipedia.org/wiki/IEEE_1284)ケーブルを介してローカルプリンターに送受信できます。これらのチャネルは、デバイスと通信するために**PRET**によってサポートされています。さらに、プリンターやMFPにはType-A USBポートがしばしば搭載されており、ユーザーはUSBデバイスから直接印刷できます。
USBドライブが差し込まれている間は**双方向のチャネルを提供しない**ものの、混雑したコピー室での使用は目立たないかもしれません。明らかに、USBプリンターを悪用するには、攻撃者が物理的にデバイスにアクセスする必要があります。しかし、ほとんどの機関や企業にとっては完全に非現実的ではありません。プリンターへの物理的アクセスは、サーバーやワークステーションなどの他のネットワークコンポーネントに比べて一般的には難しくないと考えられます。
### クロスサイト印刷
**クライアントのWebリクエスト**を悪用することで、攻撃者は彼の悪意のあるWebページに接続されたクライアントの内部ネットワーク内の任意のプリンターを**悪用**することができます。
[**こちらで可能性について学ぶことができます。**](cross-site-printing.md)
### AD内のスプーラーサービスの悪用
ドメイン内で**スプールサービスがリスニングしている**のを見つけることができれば、それを**悪用して新しい資格情報を取得し、権限を昇格**させることができるかもしれません。
[**スプーラーサービスを見つけて悪用する方法については、こちらで詳しく説明しています。**](../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md)
## 権限昇格
### 工場出荷時の設定
デバイスを工場出荷時の設定に**リセット**するいくつかの方法があり、これはユーザー設定のパスワードなどの保護メカニズムを**上書きする**セキュリティ上重要な機能です。
[**こちらで詳しく学ぶことができます。**](factory-defaults.md)
### **アカウンティングバイパス**
既存のユーザーや存在しないユーザーになりすまして、そのアカウントを使用してページを印刷したり、ハードウェアまたはソフトウェアの**カウンター**を**操作**して、より多くのページを印刷できるようにすることができるかもしれません。
[**こちらでその方法を学ぶことができます。**](accounting-bypass.md)
### **スキャナーとファックス**
スキャナーやファックスの機能にアクセスすることで、他の機能にアクセスできる可能性がありますが、これはすべてベンダー依存です。
[**こちらで詳しく学ぶことができます。**](scanner-and-fax.md)
## **印刷ジョブへのアクセス**
### **印刷ジョブの保持**
ジョブは**メモリに保持**され、**後でコントロールパネルから**再度**印刷**することができます。または、**PostScript**を使用して、印刷されるすべてのジョブに**リモートでアクセスし、ダウンロードして**印刷することもできます。
[**こちらで詳しく学ぶことができます。**](print-job-retention.md)
### **印刷ジョブの操作**
印刷されるページに**新しい内容を追加**したり、印刷される内容を**すべて変更**したり、特定の文字や単語を**置き換える**ことができます。
[**こちらでその方法を学ぶことができます。**](print-job-manipulation.md)
## **情報漏洩**
### **メモリアクセス**
**NVRAM**メモリを**ダンプ**して、そこからパスワードなどの**機密情報を抽出**することができるかもしれません。
[**その方法についてはこちらで読むことができます。**](memory-access.md)
### **ファイルシステムアクセス**
**PJL**や**PostScript**を悪用して**ファイルシステムにアクセス**することができるかもしれません。
[**その方法についてはこちらで読むことができます。**](file-system-access.md)
### **資格情報の漏洩/ブルートフォース**
**SNMP**や**LDAP**の設定を悪用して使用中の**パスワードを漏洩**させることができるかもしれませんし、**PJL**や**PostScript**を**ブルートフォース**してみることもできます。
[**その方法についてはこちらで読むことができます**](credentials-disclosure-brute-force.md)**。**
## **コード実行**
### **バッファオーバーフロー**
**PJL入力**や**LPDデーモン**で既にいくつかの**バッファオーバーフロー**が**見つかっており**、さらに多くの可能性があります。
[**詳しい情報はこちらで読むことができます。**](buffer-overflows.md)
### ファームウェアの更新
攻撃者が特別に作成した悪意のあるものにプリンターのドライバーを**更新させる**ことができるかもしれません。
[**詳しい情報はこちらで読むことができます。**](firmware-updates.md)
### **ソフトウェアパッケージ**
プリンターベンダーは、デバイスにカスタムソフトウェアをインストールする**可能性を導入し始めています**が、情報は公開されていません。プリンター上で実行されるカスタマイズされたソフトウェアを書く機能は、販売代理店や契約業者のために意図されており、それらに予約されています。
[**この件についてはこちらで詳しく読むことができます。**](software-packages.md)
## **サービス拒否**
### **伝送チャネル**
すべての**接続を占有**し、サーバーの**タイムアウトを増加**させることでDoSを引き起こす可能性があります。
[**この件についてはこちらで詳しく学ぶことができます。**](transmission-channel.md)
### **文書処理**
**PostScript**や**PJL**を使用して**無限ループを実行**したり、印刷を避けるためにコマンドを**再定義**したり、印刷機能を**オフに**したり、プリンターを**オフラインモードに設定**したりすることができます。
[**この件についてはこちらで詳しく学ぶことができます。**](document-processing.md)
### **物理的損傷**
**PJL**や**PostScript**を**悪用**して**NVRAM**に何十万回も**書き込む**ことで、チップを**壊す**ことや、少なくとも工場出荷時の設定に**パラメーターが固定**されることを目指すことができます。
[**この件についてはこちらで詳しく学ぶことができます。**](physical-damage.md)
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)でゼロからヒーローまでAWSハッキングを学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>こちら</strong></a><strong>をクリック!</strong></summary>
HackTricksをサポートする他の方法:
* **HackTricksに広告を掲載したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手してください。
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見してください。私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションです。
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加する**か、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォロー**してください。
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有**してください。
</details>