
Windows プリントスプーラーの権限昇格の脆弱性(CVE-2019-1040/CVE-2019-1019)が、ペネトレーションテスト用に Reflective DLL として実装されました。
PrintSpoofer は、Windows Print Spooler サービスの脆弱性 (CVE-2019-1040 / CVE-2019-1019) を悪用してローカル権限昇格を実行するツールです。このプロジェクトは PrintSpoofer エクスプロイトを Reflective DLL 形式で実装しており、Cobalt Strike などのペネトレーションテストフレームワークでの使用に適しています。
PrintSpoofer は、低権限ユーザーが SYSTEM レベルの権限を取得できるようにする Windows Print Spooler サービスの脆弱性を悪用します。このエクスプロイトは、Print Spooler サービスが名前付きパイプを処理する方法を悪用します。
PrintSpoofer は以下の手順で動作します:
エクスプロイトはまず、現在のトークンが SE_IMPERSONATE_NAME 権限を持っているかどうかを確認します。これは別のユーザーのトークンを偽装するために必要です。
ランダムな UUID を使用して名前付きパイプが作成されます。パイプのパスは次のとおりです:
\\.\pipe\<UUID>\pipe\spoolss
作成された名前付きパイプ上で非同期接続が待機されます。イベントが作成され、パイプが着信接続を受け入れるよう準備されます。
別スレッドで、Print Spooler サービスに対して RPC 呼び出しが行われます。
RpcRemoteFindFirstPrinterChangeNotificationEx を呼び出すことで、サービスは作成したパイプへの接続を試みます。
Print Spooler サービス (SYSTEM として実行) が名前付きパイプに接続すると、エクスプロイトは ImpersonateNamedPipeClient を使用してサービスのトークンを偽装します。
これにより SYSTEM 権限が取得されます。
SYSTEM トークンを取得すると、高権限アクションを実行できるようになります。
Windows Print Spooler サービスは、名前付きパイプを介してプリンター通知を処理します。 サービスがパイプ接続を適切に検証しないため、攻撃者はサービスを悪意のあるパイプに接続させ、SYSTEM トークンを偽装することができます。
このプロジェクトは、MS-RPRN (Print System Remote Protocol) を使用して Print Spooler サービスと通信します。 このプロトコルは IDL (Interface Definition Language) ファイルで定義され、RPC 呼び出しを可能にします。
Reflective DLL は標準の DLL とは異なる動作をします:
LoadLibrary API を必要としないVisual Studio で PrintSpoofer.sln ファイルを開きます。
ソリューションプラットフォーム と 構成 を選択します:
x64 または Win32 (ターゲットアーキテクチャによる)Release (本番用) または Debug (開発用)Build Solution (Ctrl+Shift+B) でソリューションをビルドします。
コンパイルされた DLL は次の場所に配置されます:
PrintSpoofer\x64\Release\PrintSpoofer.dll (for x64)
PrintSpoofer\Win32\Release\PrintSpoofer.dll (for x86)
このプロジェクトは以下のプリプロセッサ定義を使用します:
REFLECTIVE_DLL_EXPORTS: Reflective DLL エクスポートを有効化REFLECTIVEDLLINJECTION_CUSTOM_DLLMAIN: カスタム DllMain を使用REFLECTIVEDLLINJECTION_VIA_LOADREMOTELIBRARYR: LoadRemoteLibraryR を有効化 (Release モード)PrintSpoofer は Cobalt Strike の elevate コマンドで使用できます:
elevate PrintSpoofer LISTENER_NAME
ここで:
PrintSpoofer: エレベーターモジュール名LISTENER_NAME: 昇格したシェルを受け取るリスナーDLL は Reflective DLL インジェクション手法を使用して手動でロードできます。
エクスプロイトが成功すると、次のような出力が表示されます:
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] ImpersonateNamedPipeClient OK
[+] Exploit successfully, enjoy your shell
dllmain.cppDllMain)PrintSpoofer.cppms-rprn.idlReflectiveLoader.cppこのツールは教育目的のみおよび許可されたペネトレーションテストを対象としています。
このプロジェクトは MIT ライセンスの下でライセンスされています。詳細については、LICENSE ファイル を参照してください。