ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。
(編集:株式会社ラック・デジタルペンテスト部)

ゲーミングPCのCPU、GPU性能をパスワードクラッキングでベンチマークしてみた

デジタルペンテスト部でペネトレーションテストを担当している小松奈央です。

私事ですが、半年ほど前に新しいデスクトップPCを購入しました。 脆弱性の検証やリサーチ業務だけでなく流行りのゲームもやりたかったため、そこそこ高スペックないわゆるゲーミングPCというやつです。

新しいゲーミングPCやパーツが届いたら、気になるのはそのスペック。 ということで、まずはベンチマークによってその性能を確認してみるという方も多いと思います。 その際、皆さんはどのようなソフトウェアを使用しているでしょうか。

通常であれば、CinebenchFF15ベンチマークなどの一般的なベンチマーク用ソフトウェアを利用すると思います。 しかし、それでは面白みに欠けるため、ここではペネトレーションテスタらしく(?)パスワードクラッキングの早さベンチマークを行ってみた内容を記事にしたいと思います。

ベンチマークに使用したソフトウェア

ベンチマーク(パスワードクラッキング)に使用したソフトウェアはHashcatです。

Hashcatは、世界最速を謳うオープンソースのハッシュ解析ツールです。 ペネトレーションテストにおいては、攻撃の過程で入手したパスワードハッシュ値(SHA512、NTLMなど)を解析し、強度の低いパスワードが設定されていないか確認する際に使用します。

Hashcatには以下のような特徴があります。

これらの特徴は同じく有名なハッシュ解析ツールであるJohn the Ripperと共通するものが多いですが、一般的にHashcatのほうがGPUとの親和性が高いと言われているため*1、今回はHashcatを選択しました。

hashcat.net

事前準備

Hashcatのインストール方法や詳細な使用方法は割愛しますが、Windows上でCPU、GPU*2のそれぞれを用いて、パスワードクラッキングを行うためには以下のような準備が必要です。

  1. NVIDIAドライバのインストール
  2. CUDA Toolkitのインストール
  3. OpenCL Runtimes for Intelのインストール
  4. Hashcatのダウンロード

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種類のハッシュ形式について、ベンチマークを行いました。

  • MD5
  • sha512crypt \$6\$, SHA512 (Unix)
  • NTLM
  • Kerberos 5, etype 23, TGS-REP

以下の表がベンチマークテストの結果です。 各組み合わせにおいて、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)の値を共通指標として会話ができます。 しかし、会話の相手がゲームをしないセキュリティ技術者であれば、ハッシュ値の計算速度を共通指標に会話してみてはいかがでしょうか。

きっと、ほとんどの確率で話が通じないと思いますが。。。笑

*1:動作環境やハッシュ形式に依存します。

*2:NVIDIA製グラフィックボードの使用を前提としています。

*3:ハイフン(-)は、時間がかかりすぎるため残り時間の計算ができなかったことを示します。

*4:次の33種類の記号を対象とします。
«space»!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~