デジタルペンテスト部でペネトレーションテストを担当している小松奈央です。
私事ですが、半年ほど前に新しいデスクトップPCを購入しました。 脆弱性の検証やリサーチ業務だけでなく流行りのゲームもやりたかったため、そこそこ高スペックないわゆるゲーミングPCというやつです。
新しいゲーミングPCやパーツが届いたら、気になるのはそのスペック。 ということで、まずはベンチマークによってその性能を確認してみるという方も多いと思います。 その際、皆さんはどのようなソフトウェアを使用しているでしょうか。
通常であれば、CinebenchやFF15ベンチマークなどの一般的なベンチマーク用ソフトウェアを利用すると思います。 しかし、それでは面白みに欠けるため、ここではペネトレーションテスタらしく(?)パスワードクラッキングの早さでベンチマークを行ってみた内容を記事にしたいと思います。
ベンチマークに使用したソフトウェア
ベンチマーク(パスワードクラッキング)に使用したソフトウェアはHashcatです。
Hashcatは、世界最速を謳うオープンソースのハッシュ解析ツールです。 ペネトレーションテストにおいては、攻撃の過程で入手したパスワードハッシュ値(SHA512、NTLMなど)を解析し、強度の低いパスワードが設定されていないか確認する際に使用します。
Hashcatには以下のような特徴があります。
これらの特徴は同じく有名なハッシュ解析ツールであるJohn the Ripperと共通するものが多いですが、一般的にHashcatのほうがGPUとの親和性が高いと言われているため*1、今回はHashcatを選択しました。
事前準備
Hashcatのインストール方法や詳細な使用方法は割愛しますが、Windows上でCPU、GPU*2のそれぞれを用いて、パスワードクラッキングを行うためには以下のような準備が必要です。
CUDAはNVIDIAが開発するソフトウェアで、GPUを映像処理以外に活用する際に使用します。 HashcatによるGPUを用いたパスワードクラッキングを行うためにも必要です。 なお、CUDAの要件にVisual Studioがありますが、パスワードクラッキングを行うだけであれば必要ありません。
OpenCL Runtimes for Intelは、HashcatによるCPUを用いたパスワードクラッキングを行うために必要です。 IntelによってIntel製CPU向けに開発されたものですが、Intel製以外のCPUもサポートしており、AMD製のCPUを用いたパスワードクラッキングを行う場合にも必要です。
上記の準備ができたら以下のコマンドを実行し、各デバイスが正しく認識されていることを確認します。
C:\>hashcat.exe -I hashcat (v6.2.5) 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 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 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 OpenCL.Version.: OpenCL C 3.0 Driver.Version.: 2021.13.11.0.23_160000
ベンチマークの方法
Hashcatを用いたベンチマークには以下のオプションを使用します。
オプション | 説明 |
---|---|
-m, --hash-type | 解析するハッシュ形式を指定する |
-D, --opencl-device-types | 使用するデバイスを指定する (1:CPU、2:GPU) |
-b, --benchmark | ベンチマークテストを行う |
実際にベンチマークを行った際の実行結果は、以下のように表示されます。
C:\>hashcat.exe -m 0 -D 1 -b hashcat (v6.2.5) starting in benchmark mode 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 Benchmark relevant options: =========================== * --opencl-device-types=1 * --optimized-kernel-enable ------------------- * Hash-Mode 0 (MD5) ------------------- Speed.#3.........: 2369.3 MH/s (5.24ms) @ Accel:1024 Loops:512 Thr:1 Vec:8 Started: Fri May 06 17:37:10 2022 Stopped: Fri May 06 17:37:17 2022
上記の例では、ハッシュ形式として「MD5」を、デバイスに「CPU」を指定しています。 以下の部分がベンチマークテストの結果(スコア)に該当します。
Speed.#3.........: 2369.3 MH/s (5.24ms) @ Accel:1024 Loops:512 Thr:1 Vec:8
ベンチマークスコアが2369.3(MH/s)であることを確認できます。 MH/sはMega Hash per secondの略であり、MD5であれば1秒あたり約23億のハッシュ値を計算できることになります。 これはハッシュレートと呼ばれる指標で、仮想通貨のマイニング速度を表す際にも用いられます。
ベンチマークを行うPCのスペック
今回、ベンチマークの対象とするデスクトップPCのスペックは以下のとおりです。
パーツ | 内容 |
---|---|
CPU | AMD Ryzen 9 5900X |
グラフィックボード | GeForce RTX 3080 |
メモリ | DDR4-3200 64GB |
比較対象として、元々メインで使用していたノートPCでもベンチマークを行います。 CPUに内蔵GPUが搭載されているタイプのノートPCです。
パーツ | 内容 |
---|---|
CPU | Intel Core i7-1065G7 |
グラフィックボード | Intel Iris Plus |
メモリ | DDR4-3733 32GB |
ベンチマークの結果
パスワードクラッキングの速度は、対象となるハッシュ値の形式に大きく依存します。 今回はペネトレーションテストでよく解析を行う以下4種類のハッシュ形式について、ベンチマークを行いました。
以下の表がベンチマークテストの結果です。 各組み合わせにおいて、3回ずつベンチマークを行いその平均を記載しています。
デバイス | MD5(MH/s) | SHA512(kH/s) | NTLM(MH/s) | Kerberos(MH/s) |
---|---|---|---|---|
AMD Ryzen 9 5900X | 2451.9 | 12.3 | 4449.7 | 18.0 |
Intel Core i7-1065G7 | 1322.5 | 2.3 | 2370.9 | 3.5 |
GeForce RTX 3080 | 58090.4 | 375.5 | 105266.7 | 1260.9 |
Intel Iris Plus | 918.5 | 5.0 | 1533.5 | 19.0 |
ベンチマークテストの結果から、Ryzen 9 5900XはCore i7-1065G7と比較して1.9~5.3倍、RTX 3080はIris Plusと比較して63.2~75.1倍、ハッシュ計算の速度が早いことがわかりました。 RTX 3080は特に計算速度が早く、比較対象がノートPCであるため当たり前といえば当たり前ですが、さすがハイエンドGPUといった結果です。
続いて、実際にRTX 3080を用いてパスワードクラッキングを行った場合、どの程度の強度のパスワードなら現実的な時間で解析が可能なのか調査しました。
以下は、特定の文字種とパスワードの長さの組み合わせごとに、ブルートフォースアタックによるパスワードクラッキングを行った場合の解析時間をまとめた表です。 解析に時間がかかる組み合わせについては、パスワードクラッキングの推定残り時間を元に算出しているため、実際にかかる時間とは異なる可能性がある点をご了承ください。 なお、解析対象のハッシュ形式はNTLMとしています。
Length 6 | Length 7 | Length 8 | Length 9 | Length 10 | Length 11 | Length 12 | |
---|---|---|---|---|---|---|---|
数字のみ | Instant | Instant | Instant | Instant | Instant | 6 secs | 1 min 3 secs |
数字+英小文字 | Instant | Instant | 40 secs | 23 mins 50 secs | 14 hours 18 mins | 21 days 8 hours | -*3 |
数字+英大小文字 | Instant | 39 secs | 42 mins 54 secs | 1 day 18 hours | 109 days 18 hours | - | - |
数字+英大小文字+記号*4 | 8 secs | 11 mins 41 secs | 19 hours 7 mins | 78 days 14 hours | - | - | - |
比較的ハッシュ計算が高速なNTLMという前提はあるものの、パスワードが8文字と短ければ、一般的にパスワードの要件となることが多い数字+英大小文字+記号といった組み合わせのパスワードであっても容易に解析できるだけの計算能力を有していることがわかりました。
今回は「長いパスワードを設定しよう」という趣旨の記事ではありませんが、実際の攻撃者であれば大量のGPUを用いてパスワードクラッキングを行うことが想定されるため、やはりパスワードの長さが重要であることがわかります。
ちなみに、弊社ペネトレーションテストでもパスワードの長さは14文字以上とすることを推奨しています(執筆時点)。
まとめ
CPUやGPUの性能の話をする際に、普段からPCゲームをする人同士であれば、fps(frames per second)の値を共通指標として会話ができます。 しかし、会話の相手がゲームをしないセキュリティ技術者であれば、ハッシュ値の計算速度を共通指標に会話してみてはいかがでしょうか。
きっと、ほとんどの確率で話が通じないと思いますが。。。笑