hacktricks/network-services-pentesting/pentesting-printers/accounting-bypass.md

12 KiB
Raw Blame History

<details>

<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</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**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する。

</details>


# **はじめに**

**許可なく印刷する**ことは、セキュリティリスクや会社のポリシー違反になる可能性があります。印刷ジョブに課金される環境では、内部攻撃者が会計システムをバイパスする動機があります。さらに、ほとんどのネットワークプリンターに対する攻撃では、「印刷」ができることが前提条件です。

印刷ジョブの会計には、大きく分けて2つのアプローチがあります**プリンターが直接処理するか、プリントサーバーを介して処理するか**です。最初のアプローチはベンダー固有で、通常は特別な「プリンタードライバー」が関与し、ここでは詳しくは説明しません。もう一方のアプローチでは、[CUPS](https://en.wikipedia.org/wiki/CUPS)や[LPRng](https://en.wikipedia.org/wiki/LPRng)のようなソフトウェア実装を使用して会計を処理する別のプリントサーバーが関与し、企業や機関で一般的です。プリントサーバーはLPD、IPPなどの印刷プロトコルを使用し、ジョブを実際のプリンターに転送します。**直接プリンターへのネットワークアクセスを制限することが重要です**。そうでなければ、攻撃者は**簡単にプリントサーバーをバイパス**し、その会計メカニズムを回避することができます。これは、LPD、IPP、raw、HTTP、SMB、FTP、SNMPなどの典型的および非典型的なポートへのアクセスをフィルタリングすることを意味します。

印刷ジョブの会計システムを回避する基本的なアプローチは2つあります**他のユーザーになりすますか、印刷ページのカウンターを操作する**かです。以下では、学術および企業環境で使用される人気のあるオープンソース印刷システムであるLPRngv3.8.BとCUPSv2.1.4)のインストールについて、両方のオプションが議論されます。以下に、両システムのセキュリティ機能の比較を示します。

| 印刷システム | プロトコル | 暗号化 | 認証 | ページカウンター |
| --------------- | -------- | ---------- | -------------- | ------------ |
| **LPRng**       | LPD      | SSL/TLS    | Kerberos, PGP  | ハードウェア     |
| **CUPS**        | IPP      | SSL/TLS    | Kerberos, HTTP | ソフトウェア     |

# 認証バイパス

LPRngとCUPSは、SSLベースのチャネル暗号化と、[Kerberos](https://en.wikipedia.org/wiki/Kerberos\_\(protocol\))、[PGP](https://en.wikipedia.org/wiki/Pretty\_Good\_Privacy)署名された印刷ジョブ、またはHTTP [basic](https://en.wikipedia.org/wiki/Basic\_access\_authentication)/[digest](https://en.wikipedia.org/wiki/Digest\_access\_authentication)認証のような安全な認証スキームを提供します。**適切に設定されている**場合、攻撃者がプリンターに直接アクセスできない場合、彼女は**他のユーザーになりすますことはできません**。しかしながら、これらのセキュリティ機能は**オプションで、実際のプリントサーバーではほとんど適用されていません**。代わりに、**LPDLPRngまたはIPPCUPSパラメータとして与えられたユーザー名がログに記録され、会計されます**  これはクライアント側で任意の値に設定できます。これは、ほとんどの機関での単純なコストベネフィットの考慮によるものです:**Kerberosは各クライアントで特別なセットアップが必要**であり、**HTTP**認証は、何かを印刷したいときにユーザーが**パスワードを入力する必要があります**が、数枚の未計上の印刷物のコストは許容できます。

次のように**カスタムユーザー名**で印刷して、**適切な認証**を**確認**できます:
lp -U nobody test.ps

ページカウンターの操作

ハードウェアページカウンター

正確な会計のために、印刷されたページ数を決定する必要があります。これは印刷システムにとって簡単な作業ではありません。LPRngの著者は、プリンターに電源のオン/オフサイクルに影響されない信頼性のある不揮発性ページカウンターメカニズムがあると仮定しています。このようなハードウェアページカウンターはほとんどのプリンターでサポートされており、LPRngは印刷ジョブの後にPJLを使用して読み取ります。HPは、プリンターをサービスモードに設定することで、ページカウンター変数に書き込む機能さえ文書化しています。この方法では、HP LaserJet 1200, HP LaserJet 4200N および HP LaserJet 4250Nページカウンターを印刷ジョブ内で操作できます。印刷される文書の最後に、UELで区切られたカウンターを元の値(例えば、2342)にリセットするだけです。

\x1b%-12345X@PJL JOB
This page was printed for free
\x1b%-12345X@PJL EOJ
\x1b%-12345X@PJL JOB
@PJL SET SERVICEMODE=HPBOISEID
@PJL SET PAGES=2342
\x1b%-12345X@PJL EOJ

攻撃者は印刷ページ数を負の数に設定することがあります。工場出荷時の設定にリセットすると、テストされたデバイスの一部でページカウンターがゼロにリセットされることに注意してください。
ページカウンターを下げることは、中古車の購入時に走行距離計と比較されるように、プリンターをその価格以上で販売するためにも使用されます。しかし、ページカウンターをリセットすることが必ずしも悪意のある目的であるわけではないことを強調する価値があります:低コストのインクジェットデバイスに高価なインクを販売し、特定のページ数の後に印刷を拒否することでサードパーティのリフィルキットをブロックするというビジネスモデルはよく知られています - そのような非倫理的な慣行を扱うためには、ページカウンターをリセットすることは完全に正当です。

古いHPレーザージェットでは、PRETpagecountコマンドを使用して、簡単にハードウェアページカウンターを設定できます:

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

Welcome to the pret shell. Type help or ? to list commands.
printer:/> pagecount 10
Old pagecounter: 53214
New pagecounter: 10

ソフトウェアページカウンター

CUPS は、すべての主要なページ記述言語に対して実装されたソフトウェアページカウンターを使用しています。PostScriptの場合、アカウンティングをバイパスする簡単な方法は、以下に示すように、実際に文書を印刷する前に、PageCountシステムパラメータが存在するかどうかをチェックすることです これはCUPS/Ghostscriptで解釈されるとfalseを返します。

currentsystemparams (PageCount) known {
<@\textit{[...] code which is only executed on a printer device [...]}@>
} if

CUPSが使用する会計ソフトウェアは、プリンターとは異なるドキュメントをレンダリングします。CUPSは1ページのみを計算します - これはハードコードされた最小限のようです - 一方、実際の印刷ジョブには数百ページが含まれる可能性があります。IPPの「raw」キュー/オプションを使用することが必須であることに注意してください。そうでない場合、CUPSはコードをページカウンターに到達する前にPostScript-to-PostScriptフィルターGhostscriptのps2writeで解析します。

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

上記のコードに任意の複数ページのPostScriptドキュメントラップして印刷します。その後、http://printserver:631/jobs?which_jobs=all にアクセスし、この印刷ジョブに対するCUPSのページカウンターを確認します。rawキューを設定する必要があることに注意してください。これは、フィルタリングシステムが関与せず、印刷ジョブが直接プリンターに送られるキューです。CUPSの場合、これはコンテンツタイプをapplication/vnd.cups-rawに設定することで行われます。テストするプリントサーバーを既に使用するようにシステムが設定されている場合は、単に使用してください:

lp -o raw test.ps
AWSハッキングをゼロからヒーローまで学ぶには htARTE (HackTricks AWS Red Team Expert)をチェック!

HackTricksをサポートする他の方法: