Nseclog

ペネトレーションテスターがセキュリティ検証内容を発信するブログ

HashcatをWindows+GPU環境で使う方法

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のインストール手順は以下のとおりです。

  1. NVIDIA Driverのインストール
  2. CUDA Toolkitのインストール
  3. OpenCL Runtime for Intelのインストール1
  4. 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 Driver(440.64 or later)
  • CUDA Toolkit(9.0 or later)
  • OpenCL Runtime for Intel(16.1.1 or later)

まずは、NVIDIAの公式サイトから端末の環境に合致する最新のドライバをダウンロードします。ダウンロードタイプはGame Ready ドライバー(GRD)で問題ありません。

ダウンロードしたファイルを実行し、案内に従ってインストールを行います。

次に、CUDA Toolkitの公式サイトから最新のインストーラをダウンロードし、案内に従ってインストールします。なお、CUDA Toolkitの要件にVisual Studioがありますが、Hashcatによるパスワードクラッキングを行うだけであれば、Visual Studioをインストールする必要はありません。

最後に、Intelの公式サイトから最新のWindowsOpenCL 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端末上でOpenCLOpenGLをサポートするためのドライバであり、主にOpenCLOpenGLのハードウェアドライバが既定でインストールされていない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の性能比較を行う予定です。

参考文献

https://hashcat.net/wiki/


  1. CPUによるパスワードクラッキングを行う場合のみ必要です。Hashcatがサポートする解析方法は、基本的にGPUの方が早いため、GPUが使用できる環境であれば必須ではありません。
  2. https://hashcat.net/hashcat/
  3. https://hashcat.net/forum/thread-10069.html
  4. https://hashcat.net/forum/thread-10658.html
  5. https://devblogs.microsoft.com/directx/announcing-the-opencl-and-opengl-compatibility-pack-for-windows-10-on-arm/