hacktricks/network-services-pentesting/pentesting-printers/cross-site-printing.md
2023-07-07 23:42:27 +00:00

12 KiB
Raw Blame History

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

複数のIPに対して、ユーザーにHTTP POSTリクエストを送信させることができます。このリクエストは、オープンな生のプリントポートに到達しようとします。見つかった場合、プリンタの設定に応じて、HTTPヘッダはプレーンテキストとして印刷されるか、破棄されます。ただし、POSTデータには、PostScriptPJLコマンドなどの任意の印刷ジョブが含まれる可能性があります。

強化されたクロスサイトプリンティング

内部プリンタに対してHTTP POSTリクエストを実行するために、XMLHttpRequestXHRJavaScriptオブジェクトを使用することができます。これまでに議論されたクロスサイトプリンティングのアプローチの制限は、同一オリジンポリシーのため、データをデバイスに送信することしかできないことです。同一オリジンポリシーの制限を回避するために、サーバーが偽のが有効なHTTPレスポンスを返し、CORSリクエストAccess-Control-Allow-Origin=*を含む)を許可するようにすることができます。攻撃の概要は以下のとおりです:

CORSスプーフィングを使用した高度なクロスサイトプリンティング

このような強化されたXSPのバリアントでは、CORSスプーフィングと組み合わせて、Web攻撃者はプリンタデバイスからキャプチャされた印刷ジョブなどの任意の情報を抽出することができます。以下にJavaScriptのコンセプト実証のスニペットを示します

job = "\x1B%-12345X\r\n"
+ "%!\r\n"
+ "(HTTP/1.0 200 OK\\n) print\r\n"
+ "(Server: PostScript HTTPD\\n) print\r\n"
+ "(Access-Control-Allow-Origin: *\\n) print\r\n"
+ "(Connection: close\\n) print\r\n"
+ "(Content-Length: ) print\r\n"
+ "product dup length dup string cvs print\r\n"
+ "(\\n\\n) print\r\n"
+ "print\r\n"
+ "(\\n) print flush\r\n"
+ "\x1B%-12345X\r\n";

var x = new XMLHttpRequest();
x.open("POST", "http://printer:9100");
x.send(job);
x.onreadystatechange = function() {
if (x.readyState == 4)
alert(x.responseText);
};

クロスサイトプリンティングの制限事項

注意ページ記述言語であるPCLはCORSスプーフィングには適用されません。なぜなら、PCLは1つの単一の数値のみをエコーすることができるからです。同様に、PJLも使用できません。残念ながら、PJLはすべてのエコーされた文字列の前に@PJL ECHOを追加するため、有効なHTTPヘッダをシミュレートすることができません。ただし、これは拡張されたXSP攻撃PostScriptジョブに限定されるわけではありません。PostScriptはスプーフィングされたHTTPヘッダで応答するために使用できますし、UELはプリンタ言語を切り替えるためにさらに呼び出すことができます。これにより、Web攻撃者はPJLコマンドの結果も取得できます。2つの実装上の落とし穴が存在し、言及する価値があります。まず、PostScriptで応答するデータの正しいContent-Lengthを決定する必要があります。攻撃者が応答の全体サイズを予測できず、チャンクエンコーディングも選択肢にない場合、非常に高い値を設定してパディングを使用する必要があります。2つ目は、Connection: closeヘッダフィールドを追加することが重要です。そうしないと、HTTP/1.1接続はウェブクライアントまたはプリンタデバイスがタイムアウトをトリガーするまでアクティブなままになり、プリンタは一時的にアクセスできなくなります。

もしプリンタデバイスがプレーンテキスト印刷をサポートしている場合、XHRのHTTPリクエストヘッダがハードコピーとして印刷されます。これには、悪意のあるJavaScriptを呼び出したURLを含むOriginヘッダフィールドも含まれます。したがって、攻撃者が沈黙するのは難しいです。これは避けられないことです。なぜなら、私たちはプリンタを制御することはできず、HTTPボディが処理され、HTTPヘッダがプリンタデバイスによってプレーンテキストとして解釈されるまで待たなければならないからです。イズを減らすことが優先事項である場合、攻撃者はプロプライエタリなPJLコマンドを使用して印刷機能を最初に無効にすることができます。これは、PJL jobmediaで提案されているように、IPP、LPD、FTP、またはプリンタの埋め込みウェブサーバなどの他の潜在的なXSPチャネルを使用することができます。すべてのプロトコルは、スプーフィングされたCORSヘッダを使用して印刷ジョブを展開するためにクロスプロトコルスクリプティングのバリエーションを使用してテストされましたが、スプーフィングされたCORSヘッダを使用してフィードバックを提供しないという欠点があります。

クロスサイトプリンティングチャネルの比較は以下の通りです:

チャネル ポート フィードバックなし 予期しない印刷物 標準化 ブロックされる
Raw 9100 - -
Web 80 - - -
IPP 631 - -
LPD 515 - FF, Ch, Op
FTP 21 - FF, Ch, Op, IE

XSPの主な問題の1つは、プリンタの正しいアドレスまたはホスト名を見つけることです。私たちのアプローチは、ほとんどの最新のブラウザに実装されているWebRTCを悪用することです。WebRTCには、ローカルネットワークインターフェースのIPアドレスを列挙する機能があります。ローカルIPアドレスがわかったら、XHRオブジェクトを使用してポート9100/tcpに対して残りの253のアドレスすべてに接続を開き、PostScriptとCORSスプーフィングを使用してプリンタの製品名を取得します。これは私たちのテストでは数秒しかかかりません。プリンタが被害者のホストと同じサブネットにある場合、そのアドレスはJavaScriptだけで検出できます。WebRTCはSafariで開発中であり、最新バージョンのFirefox、Chrome、Microsoft Edgeでサポートされています。Internet ExplorerはWebRTCをサポートしていませんが、VBScriptとJavaも使用してローカルIPアドレスを漏洩させることができます。ローカルインターフェースのアドレスを取得できない場合、インテリジェントなブルートフォースアプローチを適用します。XHRオブジェクトを使用して被害者のルータのポート80に接続しようとします。そのために、さまざまなインターネットアクセス可能なリソースから取得した115のデフォルトのルータアドレスのリストが作成されました。ルータにアクセスできる場合、前述のようにサブネットをスキャンしてプリンタを検出します。

Proof-of-concept

実証実装は、高度なクロスサイトプリンティング攻撃が企業や機関にとって実用的な脅威であることを示すものであり、hacking-printers.net/xsp/で入手できます。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥