John the RipperとHashcatについて、オフラインパスワードクラッキングの性能比較を行うため、Windows+GPU環境でHashcatを使えるようにしました。
※注意
本記事の内容は犯罪行為を助長するものではありません。サイバー空間の安心・安全な環境を確保する目的にのみ利用し、絶対に悪用しないでください。
端末の環境
今回Hashcatをインストールする環境は以下のとおりです。
項目 | 内容 |
---|---|
CPU | AMD Ryzen 9 5900X 12-Core Processor |
GPU | NVIDIA GeForce RTX 3080 |
Memory | 64GB |
OS | Windows 11(バージョン 22H2) |
Hashcatのインストール
Hashcatのインストール手順は以下のとおりです。
Hashcatの動作に必要なソフトウェアのインストール
Hashcatの公式サイト2によると、インストール要件として以下のような記載があります。
- AMD GPUs on Linux require "AMDGPU" (21.50 or later) and "ROCm" (5.0 or later)
- AMD GPUs on Windows require "AMD Adrenalin Edition" (Adrenalin 22.5.1 exactly)
- Intel CPUs require "OpenCL Runtime for Intel Core and Intel Xeon Processors" (16.1.1 or later)
- NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or later)
今回はAMD CPU+NVIDIA GPUの組み合わせで使用したいのですが、AMD CPUに関する要件の記載がないためForums3を確認してみると、AMD CPUも「OpenCL Runtime for Intel」が必要であることがわかります。
そのため、今回はHashcatの要件として以下の3つをインストールする必要があります。
まずは、NVIDIAの公式サイトから端末の環境に合致する最新のドライバをダウンロードします。ダウンロードタイプはGame Ready ドライバー(GRD)で問題ありません。
ダウンロードしたファイルを実行し、案内に従ってインストールを行います。
次に、CUDA Toolkitの公式サイトから最新のインストーラをダウンロードし、案内に従ってインストールします。なお、CUDA Toolkitの要件にVisual Studioがありますが、Hashcatによるパスワードクラッキングを行うだけであれば、Visual Studioをインストールする必要はありません。
最後に、Intelの公式サイトから最新のWindows用OpenCL Runtimeのインストーラをダウンロードし、案内に従ってインストールします。
Hashcatのダウンロード
Hashcatの公式サイトから最新版のバイナリ(記事執筆時点の最新はhashcat binaries v6.2.6)をダウンロードし、任意のフォルダに解凍します。
Hashcatの動作確認
各プロセッサが認識されているか確認
HashcatがCPU、GPUを認識しているか確認します。
C:\path\to\hashcat-6.2.6> hashcat.exe -I hashcat (v6.2.6) starting in backend information mode CUDA Info: ========== CUDA.Version.: 11.6 Backend Device ID #1 (Alias: #2) Name...........: NVIDIA GeForce RTX 3080 Processor(s)...: 68 Clock..........: 1740 Memory.Total...: 10239 MB Memory.Free....: 9106 MB Local.Memory...: 99 KB PCI.Addr.BDFe..: 0000:07:00.0 OpenCL Info: ============ OpenCL Platform ID #1 Vendor..: NVIDIA Corporation Name....: NVIDIA CUDA Version.: OpenCL 3.0 CUDA 11.6.127 Backend Device ID #2 (Alias: #1) Type...........: GPU Vendor.ID......: 32 Vendor.........: NVIDIA Corporation Name...........: NVIDIA GeForce RTX 3080 Version........: OpenCL 3.0 CUDA Processor(s)...: 68 Clock..........: 1740 Memory.Total...: 10239 MB (limited to 2559 MB allocatable in one block) Memory.Free....: 9472 MB Local.Memory...: 48 KB OpenCL.Version.: OpenCL C 1.2 Driver.Version.: 512.15 PCI.Addr.BDF...: 07:00.0 OpenCL Platform ID #2 Vendor..: Intel(R) Corporation Name....: Intel(R) OpenCL Version.: OpenCL 3.0 WINDOWS Backend Device ID #3 Type...........: CPU Vendor.ID......: 8 Vendor.........: Intel(R) Corporation Name...........: AMD Ryzen 9 5900X 12-Core Processor Version........: OpenCL 3.0 (Build 0) Processor(s)...: 24 Clock..........: 0 Memory.Total...: 65463 MB (limited to 8182 MB allocatable in one block) Memory.Free....: 32699 MB Local.Memory...: 32 KB OpenCL.Version.: OpenCL C 3.0 Driver.Version.: 2021.13.11.0.23_160000
OpenCL経由でCPUとGPUの情報、CUDA経由でGPUの情報がそれぞれ正しく表示されていることから、HashcatがCPU、GPUを認識していることを確認できます。
なお、OpenCL経由のGPUも認識されていますが、HashcatはGPUの計算処理にCUDAを使用するため、OpenCL経由のGPUは使用しません。
各プロセッサが認識されない場合のトラブルシューティング
上記のコマンドでHashcatが使用可能なプロセッサを表示させた際に、何も表示されずそのままプログラムが終了してしまうことがあります。
この場合、OpenCLOn12というドライバが原因である可能性があります。これはDirectX 12に対応したWindows端末上でOpenCLとOpenGLをサポートするためのドライバであり、主にOpenCLやOpenGLのハードウェアドライバが既定でインストールされていないARM CPUのWindowsで使用するものです。しかし、ARM CPUではない端末であっても端末購入時にインストールされていることがあるようです。
もしOpenCLOn12が原因の場合、Hashcatの出力には何も表示されませんが、Windowsのイベントログにエラーログが記録されます。
HashcatのForumsにて、OpenCLOn12について調べると同様の症状を報告するスレッド4を確認できます。
OpenCLOn12をアンインストールすることで解決できそうですが、アンインストール方法がいまいち分かりづらいためOpenCLOn12について詳しく調べます。すると、Microsoft Storeから「OpenCL™ and OpenGL® Compatibility Pack(OpenCL™ と OpenGL® の互換機能パック)」という名称で提供されている5ことがわかります。
Microsoft Storeから提供されているということなので、Windowsの設定からインストールされているアプリの一覧を開き、「OpenGL」などで検索するとアンインストールが可能です。
パスワードクラッキングの確認
実際にパスワードハッシュ値を用意し、平文パスワードの特定を試みます。以下のファイルは、WindowsのAdministratorアカウントに強度の低いパスワード「admin123」を設定し、パスワードハッシュ値(NTLM)をダンプしたものです。
C:\path\to\hashcat-6.2.6> type ntlm.hash Administrator:500:aad3b435b51404eeaad3b435b51404ee:3008c87294511142799dca1191e69a0f:::
GPUによるパスワードクラッキングの動作確認として、今回は8文字のパスワードの総当たり攻撃で解析します。対象とする文字種は、英小文字、英大文字、数字です。
オプション | 説明 |
---|---|
-m | 解析対象のハッシュタイプを指定する(1000:NTLM、3000:LM、など) |
-D | 解析に使用するプロセッサを指定する(1:CPU、2:GPU) |
-O | カーネルの最適化を行う(有効にすると速度が上がるが、解析可能なパスワード長が27文字になる) |
-a | アタックモードの指定(0:辞書リスト、3:マスクによる総当り、など) |
-1 | 1~4番までカスタム文字種を定義できる。今回は1番に数字、英小文字、英大文字を指定している。 |
C:\path\to\hashcat-6.2.6> hashcat.exe -m 1000 -D 2 -O -a 3 ntlm.hash -1 ?d?l?u ?1?1?1?1?1?1?1?1 hashcat (v6.2.6) starting * Device #1: WARNING! Kernel exec timeout is not disabled. This may cause "CL_OUT_OF_RESOURCES" or related errors. To disable the timeout, see: https://hashcat.net/q/timeoutpatch * Device #2: WARNING! Kernel exec timeout is not disabled. This may cause "CL_OUT_OF_RESOURCES" or related errors. To disable the timeout, see: https://hashcat.net/q/timeoutpatch CUDA API (CUDA 11.6) ==================== * Device #1: NVIDIA GeForce RTX 3080, 9106/10239 MB, 68MCU OpenCL API (OpenCL 3.0 CUDA 11.6.127) - Platform #1 [NVIDIA Corporation] ======================================================================== * Device #2: NVIDIA GeForce RTX 3080, skipped OpenCL API (OpenCL 3.0 WINDOWS) - Platform #2 [Intel(R) Corporation] ==================================================================== * Device #3: AMD Ryzen 9 5900X 12-Core Processor, skipped Minimum password length supported by kernel: 0 Maximum password length supported by kernel: 27 Hashes: 1 digests; 1 unique digests, 1 unique salts Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates Optimizers applied: * Optimized-Kernel * Zero-Byte * Precompute-Init * Meet-In-The-Middle * Early-Skip * Not-Salted * Not-Iterated * Single-Hash * Single-Salt * Brute-Force * Raw-Hash Watchdog: Temperature abort trigger set to 90c Host memory required for this attack: 1474 MB Cracking performance lower than expected? * Append -w 3 to the commandline. This can cause your screen to lag. * Append -S to the commandline. This has a drastic speed impact but can be better for specific attacks. Typical scenarios are a small wordlist but a large ruleset. * Update your backend API runtime / driver the right way: https://hashcat.net/faq/wrongdriver * Create more work items to make use of your parallelization power: https://hashcat.net/faq/morework 3008c87294511142799dca1191e69a0f:admin123 Session..........: hashcat Status...........: Cracked Hash.Mode........: 1000 (NTLM) Hash.Target......: 3008c87294511142799dca1191e69a0f Time.Started.....: Thu Dec 01 16:04:38 2022 (2 mins, 13 secs) Time.Estimated...: Thu Dec 01 16:06:51 2022 (0 secs) Kernel.Feature...: Optimized Kernel Guess.Mask.......: ?1?1?1?1?1?1?1?1 [8] Guess.Charset....: -1 ?d?l?u, -2 Undefined, -3 Undefined, -4 Undefined Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 79202.7 MH/s (5.81ms) @ Accel:512 Loops:256 Thr:64 Vec:8 Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new) Progress.........: 10678059401216/218340105584896 (4.89%) Rejected.........: 0/10678059401216 (0.00%) Restore.Point....: 2776367104/56800235584 (4.89%) Restore.Sub.#1...: Salt:0 Amplifier:2304-2560 Iteration:0-256 Candidate.Engine.: Device Generator Candidates.#1....: dbIuLt13 -> ffYZh223 Hardware.Mon.#1..: Temp: 77c Fan: 75% Util: 97% Core:1837MHz Mem:9242MHz Bus:16 Started: Thu Dec 01 16:04:37 2022 Stopped: Thu Dec 01 16:06:53 2022
Administratorアカウントの平文パスワードが「admin123」であることを特定できています。
解析速度がGPUに劣るため、本環境では基本的に使用しませんが、念のためCPUでもパスワードクラッキングが可能か動作確認を行います。解析の条件(パスワード長、文字種)はGPUの動作確認時と同様です。なお、Hashcatは一度解析したパスワードハッシュ値を記録し、解析対象から除外してくれるため、ここでは同フォルダ内のhashcat.potfileファイルを削除しておく必要があります。
C:\path\to\hashcat-6.2.6> del hashcat.potfile C:\path\to\hashcat-6.2.6> hashcat.exe -m 1000 -D 1 -O -a 3 ntlm.hash -1 ?d?l?u ?1?1?1?1?1?1?1?1 hashcat (v6.2.6) starting CUDA API (CUDA 11.6) ==================== * Device #1: NVIDIA GeForce RTX 3080, skipped OpenCL API (OpenCL 3.0 CUDA 11.6.127) - Platform #1 [NVIDIA Corporation] ======================================================================== * Device #2: NVIDIA GeForce RTX 3080, skipped OpenCL API (OpenCL 3.0 WINDOWS) - Platform #2 [Intel(R) Corporation] ==================================================================== * Device #3: AMD Ryzen 9 5900X 12-Core Processor, 32699/65463 MB (8182 MB allocatable), 24MCU Minimum password length supported by kernel: 0 Maximum password length supported by kernel: 27 Hashes: 1 digests; 1 unique digests, 1 unique salts Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates Optimizers applied: * Optimized-Kernel * Zero-Byte * Precompute-Init * Meet-In-The-Middle * Early-Skip * Not-Salted * Not-Iterated * Single-Hash * Single-Salt * Brute-Force * Raw-Hash Watchdog: Temperature abort trigger set to 90c Host memory required for this attack: 6 MB Cracking performance lower than expected? * Append -w 3 to the commandline. This can cause your screen to lag. * Append -S to the commandline. This has a drastic speed impact but can be better for specific attacks. Typical scenarios are a small wordlist but a large ruleset. * Update your backend API runtime / driver the right way: https://hashcat.net/faq/wrongdriver * Create more work items to make use of your parallelization power: https://hashcat.net/faq/morework 3008c87294511142799dca1191e69a0f:admin123 Session..........: hashcat Status...........: Cracked Hash.Mode........: 1000 (NTLM) Hash.Target......: 3008c87294511142799dca1191e69a0f Time.Started.....: Thu Dec 01 16:41:10 2022 (43 mins, 8 secs) Time.Estimated...: Thu Dec 01 17:24:18 2022 (0 secs) Kernel.Feature...: Optimized Kernel Guess.Mask.......: ?1?1?1?1?1?1?1?1 [8] Guess.Charset....: -1 ?d?l?u, -2 Undefined, -3 Undefined, -4 Undefined Guess.Queue......: 1/1 (100.00%) Speed.#3.........: 4176.0 MH/s (5.40ms) @ Accel:1024 Loops:1024 Thr:1 Vec:8 Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new) Progress.........: 10680114216960/218340105584896 (4.89%) Rejected.........: 0/10680114216960 (0.00%) Restore.Point....: 2778365952/56800235584 (4.89%) Restore.Sub.#3...: Salt:0 Amplifier:2048-3072 Iteration:0-1024 Candidate.Engine.: Device Generator Candidates.#3....: 1Xnuj123 -> zngIq123 Hardware.Mon.#3..: N/A Started: Thu Dec 01 16:40:56 2022 Stopped: Thu Dec 01 17:24:18 2022
こちらの方法でも、Administratorアカウントの平文パスワードが「admin123」であることを特定できています。
これで、CPU、GPUそれぞれによるパスワードクラッキングが正常に動作していることを確認できました。なお、解析結果は以下のコマンドによって、後からでも確認可能です。
C:\path\to\hashcat-6.2.6> hashcat.exe -m 1000 --show --username ntlm.hash Administrator:3008c87294511142799dca1191e69a0f:admin123
おわりに
Windows+GPU環境でHashcat使ったパスワードクラッキング環境を構築しました。
本記事の導入のとおり、次はHashcatとJohn the Ripperの性能比較を行う予定です。
参考文献
- CPUによるパスワードクラッキングを行う場合のみ必要です。Hashcatがサポートする解析方法は、基本的にGPUの方が早いため、GPUが使用できる環境であれば必須ではありません。↩
- https://hashcat.net/hashcat/↩
- https://hashcat.net/forum/thread-10069.html↩
- https://hashcat.net/forum/thread-10658.html↩
- https://devblogs.microsoft.com/directx/announcing-the-opencl-and-opengl-compatibility-pack-for-windows-10-on-arm/↩