diff --git a/src/network-services-pentesting/pentesting-631-internet-printing-protocol-ipp.md b/src/network-services-pentesting/pentesting-631-internet-printing-protocol-ipp.md index 2f825bfc9..0e5b4bdf6 100644 --- a/src/network-services-pentesting/pentesting-631-internet-printing-protocol-ipp.md +++ b/src/network-services-pentesting/pentesting-631-internet-printing-protocol-ipp.md @@ -1,23 +1,103 @@ +# インターネット印刷プロトコル + {{#include ../banners/hacktricks-training.md}} -# インターネット印刷プロトコル \(IPP\) +**インターネット印刷プロトコル (IPP)** は、**RFC 2910** および **RFC 2911** に規定されており、ネットワーク印刷の事実上の標準です。これは **HTTP/1.1** の上に位置し(クリアテキストまたはTLS)、印刷ジョブの作成、プリンターの機能の照会、キューの管理のための豊富なAPIを提供します。**IPP Everywhere** のような現代の拡張機能は、モバイルおよびクラウド環境からのドライバなし印刷を可能にし、同じパケット形式は3Dプリンターにも再利用されています。 -**インターネット印刷プロトコル (IPP)** は、**RFC2910** および **RFC2911** に規定されており、インターネット上での印刷の基盤として機能します。**IPP Everywhere** のような開発によって拡張可能性が示されており、これはモバイルおよびクラウド印刷の標準化を目指しています。また、**3D印刷**のための拡張も導入されています。 +残念ながら、ポート **631/tcp(およびプリンター発見のための631/udp)** を公開することは、従来のオフィスプリンターや **CUPS** を実行しているLinux/Unixホストの両方で深刻なセキュリティ問題を引き起こすことがよくあります。 -**HTTP** プロトコルを活用することで、IPPは**基本/ダイジェスト認証**や**SSL/TLS暗号化**などの確立されたセキュリティプラクティスの恩恵を受けています。印刷ジョブの送信やプリンタのステータスの照会などのアクションは、**ポート631/tcp**で動作するIPPサーバーに向けた**HTTP POSTリクエスト**を通じて行われます。 - -IPPのよく知られた実装は**CUPS**であり、これはさまざまなLinuxディストリビューションやOS Xで広く普及しているオープンソースの印刷システムです。その有用性にもかかわらず、IPPはLPDと同様に、**PostScript**や**PJLファイル**を通じて悪意のあるコンテンツを送信するために悪用される可能性があり、潜在的なセキュリティリスクを浮き彫りにしています。 +--- +## クイックPoC – Pythonを使用した生のIPPの作成 ```python -# Example of sending an IPP request using Python -import requests +import struct, requests -url = "http://printer.example.com:631/ipp/print" -headers = {"Content-Type": "application/ipp"} -data = b"..." # IPP request data goes here +# Minimal IPP Get-Printer-Attributes request (operation-id 0x000B) +ipp = struct.pack( +">IHHIHH", # version 2.0, operation-id, request-id +0x0200, # 2.0 +0x000B, # Get-Printer-Attributes +0x00000001, # request-id +0x01, 0x47, # operation-attributes-tag, charset attr (skipped) +) + b"\x03" # end-of-attributes -response = requests.post(url, headers=headers, data=data, verify=True) -print(response.status_code) +r = requests.post("http://printer:631/ipp/print", headers={"Content-Type":"application/ipp"}, data=ipp) +print(r.status_code, r.content[:40]) ``` -プリンターのハッキングについてもっと学びたい場合は、[**このページを読んでください**](http://hacking-printers.net/wiki/index.php/Main_Page)。 +--- +## 列挙と偵察 +### 1. Nmap NSE +```bash +# run all CUPS/IPP scripts +nmap -sV -p631 --script=cups* +# or only basic info +nmap -p631 --script=cups-info,cups-queue-info +``` +`cups-info` スクリプトはモデル、状態、キュー統計を抽出し、`cups-queue-info` は保留中のジョブを列挙します。 + +### 2. CUPS の IPP ユーティリティ +* `ippfind` – マルチキャスト/UDP 発見 (cups-browsed に対して動作): +```bash +ippfind --timeout 3 --txt -v "@local and port=631" # プリンタのリスト +``` +* `ipptool` – *.test* ファイルで定義された任意のリクエスト: +```bash +ipptool -tv ipp:///ipp/print get-printer-attributes.test +``` +バンドルされた *get-printer-attributes.test* ファイルはファームウェアバージョン、サポートされているドキュメント形式などをクエリします。 + +### 3. Shodan / Censys dorks +```bash +shodan search 'product:"CUPS (IPP)" port:631' +``` +**70,000** 以上のホストが2025年4月にCUPSを公開していました。 + +--- +## 最近の脆弱性 (2023-2025) + +| 年 | CVE ID(s) | 影響を受けるコンポーネント | 影響 | +|------|-----------|--------------------|--------| +| 2025 | CVE-2023-50739 | Lexmarkファームウェア (IPPパーサ) | ヒープオーバーフロー → Wi-Fi/LAN経由のRCE | +| 2024 | CVE-2024-47076, 47175, 47176, 47177 | cups-browsed, libcupsfilters, libppd, cups-filters | CUPSブラウジングが有効な任意のLinuxデスクトップ/サーバーでの完全な認証なしRCEチェーン | +| 2024 | CVE-2024-35235 | cupsd 2.4.8- | シンボリックリンクトリック → 任意の **chmod 666** → 権限昇格 | +| 2023 | CVE-2023-0856 (Canon) + Pwn2Own | `sides`属性のスタックオーバーフロー → リモートコード実行 | + +### cups-browsed RCEチェーン (2024年9月) +1. `cups-browsed`は**UDP/631**でプリンタ広告をリッスンします。 +2. 攻撃者は悪意のあるIPP URLを指す単一の偽装パケットを送信します (CVE-2024-47176)。 +3. `libcupsfilters`は検証なしにリモート**PPD**を自動的に取得します (CVE-2024-47076 & 47175)。 +4. 作成されたPPDは、印刷されるたびに任意のシェルコマンドを実行するために**foomatic-rip**フィルタを悪用します (CVE-2024-47177)。 + +概念実証コードは研究者のブログで公開されており、エクスプロイトには**認証が不要**です;UDP/631へのネットワークアクセスがあれば十分です。 + +#### 一時的な緩和策 +``` +sudo systemctl stop cups-browsed +sudo systemctl disable cups-browsed +sudo ufw deny 631/udp # or equivalent firewall rule +``` +パッチは2024年10月に主要なディストリビューションによってリリースされました – **cups-filters ≥ 2.0.0** を確認してください。 + +### cupsdシンボリックリンク `Listen` の誤設定 (CVE-2024-35235) +*cupsd.conf* の `Listen` ディレクティブにシンボリックリンクを配置すると、**cupds (root)** が攻撃者が選択したパスに対して `chmod 666` を実行し、書き込み可能なシステムファイルにつながり、Ubuntuでは `FoomaticRIPCommandLine` を使用した悪意のあるPPDによるコード実行が可能になります。 + +--- +## 攻撃技術 + +* **認証されていない生印刷ジョブ** – 多くのプリンターは認証なしで `POST /ipp/print` を受け入れます。悪意のある **PostScript** ペイロードは高性能デバイス上でシェルコマンド(`system("/bin/nc ...")`)を呼び出すことができます。 +* **ジョブハイジャック** – `Cancel-Job` の後に `Send-Document` を行うことで、攻撃者は他の人のドキュメントを物理的に印刷される前に置き換えることができます。 +* **SNMP → IPP コンボ** – デフォルトのコミュニティ `public` は、IPP URL に必要な内部キュー名を漏洩することがよくあります。 + +--- +## 防御のベストプラクティス +1. CUPSとプリンターのファームウェアを迅速にパッチし、ベンダーのPSIRTフィードに登録してください。 +2. ゼロコンフィグ印刷が必要ない限り、`cups-browsed` と UDP/631 を無効にしてください。 +3. TCP/631を信頼できるサブネット/VPNに制限し、**TLS (ipps://)** を強制してください。 +4. 匿名印刷の代わりに **Kerberos/Negotiate** または証明書認証を要求してください。 +5. ログを監視してください: `/var/log/cups/error_log` を `LogLevel debug2` で表示すると、不正なPPDダウンロードや疑わしいフィルタの呼び出しが表示されます。 +6. 高セキュリティネットワークでは、印刷をハードニングされた隔離された印刷サーバーに移動し、USB経由でデバイスにジョブをプロキシするようにしてください。 + +## 参考文献 +- Akamai – “CUPSにおける重大なLinux RCE脆弱性 — 我々が知っていることと準備方法”, 2025年4月。 +- Debian Security Tracker – CVE-2024-35235の詳細。 {{#include ../banners/hacktricks-training.md}}