Point and Print Drive-Byでプリンタを所有し、ネットワークを所有する

2016年7月12日
ニック・ボーチェスン
セキュリティ・リサーチ特別エンジニア
Point and Print Drive-Byでプリンタを所有し、ネットワークを所有する

はじめに

プリンターは、モノのインターネット (IoT) の世界では興味深いケースである。というのも、プリンターはほとんどのIoTデバイスに比べて非常に強力なハードウェアであるにもかかわらず、ほとんどの管理者は通常「本物の」コンピューターとは考えていないからである。長年にわたり、多くのセキュリティ研究者がプリンターの脆弱性について研究し、報告してきた。しかし、この研究の大半は、プリンターのディスプレイを変更したり、印刷された文書を盗んだりするために、プリンター自体をハッキングする方法に焦点を当てていました。今回は、ほとんどのネットワーク内でプリンターが持つ特別な役割を利用して、実際にエンドユーザーデバイスを感染させ、ネットワーク内で攻撃の足跡を広げる方法を調査する。

背景

この問題を理解するためには、Microsoft Web Point-and-Print Protocol(MS-WPRN)について少し理解する必要がある。

ほとんどの組織は、ネットワーク内のデバイスに最小特権の原則を適用しようとしている。ラップトップやデスクトップのようなものは、使用するハードウェアがそう頻繁に変わるものではないので、これはかなりうまくいく。しかし、プリンターは少し違う。ドライバが必要であることに変わりはないが、プリンタは、接続を望む事実上すべてのユーザーをサポートする必要がある。エンドユーザーは、ビルド内を移動する際、当然、最も近くにあるプリンターを使いたがる。モバイルユーザーは、オフィスに来たときに簡単にプリンターに接続して使えることを期待している。さらに、ほとんどの組織では、プリンターは1つに統一されておらず、1つのネットワーク内に複数のモデルやメーカーが存在することが多い。

そこで、システム管理者が可能な限りのプリンタ・ドライバをネットワーク上のすべてのワークステーションにプッシュする代わりに、プリンタが使用される直前にドライバをユーザー・デバイスに配信する方法を開発することが解決策となった。そこで登場したのがポイント・アンド・プリントである。このアプローチでは、プリンターまたはプリントサーバーに共有ドライバーを保存し、そのプリンターのユーザーだけが必要なドライバーを受け取る。一見したところ、これはドライバー配備に対する実用的でシンプルなソリューションである。管理者を必要とせず、ユーザーは必要なプリンタードライバーにアクセスできる。

問題

問題は、この方式がエンドユーザーの視点からうまく機能するためには、例外が必要だったということだ。通常、ユーザーアカウント制御は、ユーザーが新しいドライバーをインストールするのを警告したり、阻止したりするために設けられている。印刷を簡単にするために、この制御を回避する例外が作られた。つまり、最終的には、共有ドライブから実行可能ファイルをダウンロードし、ユーザー側で警告を発生させることなく、ワークステーション上でシステムとして実行できるメカニズムができた。攻撃者の立場からすると、これはあまりにも素晴らしいことで、もちろん試してみるしかない。

搾取

私たちの場合、本物のプリンターを使用している。ほとんどのプリンターには機能が満載されているので、基本システムにアクセスできるバグを見つけるのはそれほど難しいことではなかった。このケースでは、ファームウェア・アップデートを解凍して、いくつかの認証情報を収集し、ファイルシステムのレイアウトを理解することができた。binwalkマジックファイルは、このページの最後のToolsセクションで提供されている。これらはsmbの共有ドライバ "print$"上にある必要があり、通常、さまざまなタイプのアーキテクチャ(x86、x64、ppc、alphaなど)用の複数のフレーバーが含まれています。という名前のディレクトリを探す:W32X86、x64、IA64、colorなど。

私たちは単純にx86 dllファイルをプリンターから取り出し、それを直接あるいはrpcclient[5]を使って行うことができ、「the-backdoor-factory」[1]を使ってパッチを当てた。

これにより、注入されたペイロードを含むdllファイルが返された。

dllを元のディレクトリに戻すには、複数の方法がある。通常、ドメイン管理者権限があれば、print$共有に書き戻すことができます。あるいは、プリンターのローカルrootアクセス権があれば、今作成したバックドアされたファイルで既存のファイルを上書きすることもできる。ベンダーがデフォルトの隠しクレデンシャルをマシンに残しておくのは、やはり驚きだ。クラック辞書にない場合は、念のためroot:myrootを追加しておくとよいだろう。

この例では、Windows XP 32ビット、Windows 7 32ビット、Windows 7 64ビット、Windows 2008 R2 AD 64、Ubuntu CUPS、Windows 2008 R2 64プリント・サーバー、および無名プリンターを組み合わせて使用した。Windows 7がPoint-and-Printでうまく動作するためには、Active Directory側で設定し、ポリシーとしてプッシュする必要があった。これについては、以下のインターネット・プリンティング・プロトコルのセクションを参照されたい。

通常の自動検知によるプリンターの追加を行い、プリンター (backdoored dll付き) を選択した後、ウィンドウズ・システムは通常のドライバー取得とインストール処理を行う。

このステージでは、ユーザー警告、uac、バイナリ署名検証さえもなく、すべてシステム権限でプリンタードライバーをインストールできる。

この結果、msfconsole側では以下のようになった:

その他の可能性のあるベクター

この問題の性質を考えると、リモート・コード実行を利用する方法はたくさんある。上記の例では、デスクトップ・プリンターをリバース・エンジニアリングしましたが、同じドライバー・ローディング機能を別のソフトウェア・スタックで実現し、別のシナリオで使用することも可能です。例えば、以下のようなものがありますが、これらに限定されるものではありません:

  • 水飲み場攻撃
  • 既存のプリンターまたはプリンターサーバーのバックドア。
  • Microsoft print server: driver path: c:■windowssystem32■spool■drivers■*■3...
  • Linuxカップサーバー:設定に共有ドライバーprint$があるか確認する。
  • 複数のベンダーがポイント・アンド・プリントをサポートしている。
  • バックドアされたドライバでプリンタを再フラッシュする。
  • 偽のプリントサーバーを作成し、自動検知でブロードキャストする。
  • 特権の昇格
  • システムにアクセスするための特権昇格メカニズムとして、プリンタの追加を使用する。
  • Mitmがプリンターに攻撃を仕掛け、本物のドライバーの代わりにバックドアされたドライバーを注入する。
  • IPPとWebpnpでよりグローバルに。

インターネット印刷プロトコルとWeb PointNPrintを使用したリモート感染

これまでのところ、私たちは、デバイスが挿入されるか感染し、そのデバイスに接続するデバイスをさらに感染させるために使用される内部ネットワークに私たち自身を制限してきた。マイクロソフトのインターネットプリンティングプロトコル(IPP)とウェブポイントプリントは、この問題をイントラネットからインターネットに拡大することを可能にする。マイクロソフトIPPは、プリンターからドライバーをロードするのと同じメカニズムを可能にする。これは、MSプリントサーバーの以下のコードで実行できる。

このURLには".webpnp "またはwebpointNprintのファイルが含まれます。

10MBのバイナリファイルの中身を見てみる。

ここが、読み込まれるファイルが存在する場所である。前回の攻撃でパッチを当てたファイルは、smb、Point-and-Print、webpnpのいずれで配信されても同じように動作した。

問題の根本原因

この問題を追跡すると、ntprint.dllライブラリ、特に "PSetupDownloadAndInstallLegacyDriver "関数に行き着く。具体的には、この関数はポリシーをチェックし、昇格した権限でインストールを実行する役割を担っている。

管理者権限なしでドライバのインストールを許可したい正当な配備理由がある一方で、アタックサーフェスを減らすために、警告はおそらく常に有効であるべきであり、バイナリ署名はおそらく常にチェックされるべきである。

修復

Vectra マイクロソフトは、CVE-2016-3238 (MS16-087)およびCVE-2016-3239に対する修正プログラムをSecurity BulletinMS16-087の一部として提供しました

Point-and-Printの動作は、管理者がリスクをコントロールできるような細かさまでGPOで定義することができる。Point-and-Printを無効にしたり、警告を追加してUACを要求したりすることは可能だが、これでは、ユーザーが毎回IT部門に問い合わせることなくドライバーをインストールできるように、ドライバーをどのように管理するかという最初の問題に戻ってしまう。

マイクロソフトは、[3]、[4]で必要なドキュメントを提供しており、enhancedPoint-and-Print(v4)の開発は、これらの問題の一部を修正することを試みている。プロトコルの最新バージョンとウィンドウズの最新バージョンをサポートするプリンタに移行することで、アタックサーフェスの一部を最小化できる可能性があります。現時点では、v4/enhanced Point-and-Printの仕様以上のセキュリティ機能についてはレビューしていないが、後方互換性により、これらの取り組みが無意味になる可能性がある。

ネットワークのチェック

Point-and-Printを有効にするためのホスト・レジストリ

Point n Printドライバのネットワークをスキャンする