前回:やられアプリ BadTodo - 17.3 パスワードハッシュ化の目的 - demandosigno
パスワード解析ソフトの John the Ripper でもハッシュの解析はできるのですが、今回は hashcat を使います。
その名の通りハッシュの解析ができます。強力なグラフィックボードはハッシュの解析も速いため、ベンチマークソフトとしても使われています。
hashcat - advanced password recovery
hashcatは様々なハッシュの種類やソルト付きハッシュに対応していますが、私のPCのグラフィックボードは古くて性能が低いため以下の内容で試します。
・ハッシュ関数はMD5(ソルト無し)
・ハッシュの元とするパスワードは、8文字の英大文字・小文字・数字
・hashcat-5.1.0(昨年試した際の記録かつ私のグラボに対応可能なバージョンのため古いです)
・NVIDIA GeForce GTX 1070(+CUDAのインストールが必要です)
・Windows 10
開始
hashcat64.exe -m 0 -a 3 hash.txt -1 ?l?u?d ?1?1?1?1?1?1?1?1?1?1 --increment --increment-min=8(パラメータを色々付けて試してみたため少し冗長かも)
[s]tatus 「キーボードの s」を押して途中経過を確認します。(新しいバージョンでは最初から経過が表示されているかもしれません)
コマンド詳細
https://hashcat.net/wiki/doku.php?id=mask_attack
hashcat64.exe -m 0 -a 3 hash.txt -1 ?l?u?d ?1?1?1?1?1?1?1?1?1?1 --increment --increment-min=8
-m : ハッシュの種類。0 = MD5ハッシュを指定(その他のハッシュ)
- a : アタックモード。3 = ブルートフォースアタック。総当たり(すべての大文字、小文字、数字を含む文字セットを使用する)かつマスクを指定できる
-1 : カスタム文字列として1つ設定
?l?u?d : プレースホルダを使ってパスワード候補を構成する
?l = abcdefghijklmnopqrstuvwxyz
?u = ABCDEFGHIJKLMNOPQRSTUVWXYZ
?d = 0123456789
?1?1?1?1?1?1?1?1?1?1 : 先に設定したカスタム文字列1を使用して10文字を解析
--increment : インクリメントフラグ。マスクはパスワードの長さに固有、このままだと10文字分だけ解析してしまうため、?1 → ?1?1 → ?1?1?1... と一つずつ増やしていくために必要なフラグ
--increment-min : 8 = 8文字からスタートします。「パスワード要件として最小8文字」と規定されている場合などは7文字以下の解析は不要です
hash.txt : 解析するハッシュ値を記録したテキストファイル(今回は 5f4dcc3b5aa765d61d8327deb882cf99 の一つだけ記載)
結果
Status : Cracked となっており、見つかったパスワードがあります
Time.Started : (9 hours, 53 mins) 8文字を解析するのにかかった時間です
Guess.Queus : 1/3。8文字, 9文字, 10文字の内、8文字分の解析が終了したということです
Speed.#1 : 6154.1 MH/s。約6.1Gハッシュ/秒の速度が出ています
Progress : 218340105584896/218340105584896 (100.00%)
英大文字・小文字・数字の8桁 = (26+26+10)8 = 218,340,105,584,896 (218兆) 通りです。
これは 218テラ、218,340ギガであり、速度の6.1ギガで割ると35,793秒 ≒ 9.9時間、先の記載に合致します。
5f4dcc3b5aa765d61d8327deb882cf99:password : 今回見つかった結果です。総当たりの結果、ハッシュの元の文字列は「password」であったことが分かります。(この例であれば総当たりよりは「辞書攻撃」の方がずっと早く終わります。hashcat での辞書攻撃は “straight”モードと名づけられており、アタックモード = 0 (-a 0)で実行できます。
今回は元のリストのパスワードを1つしか記載しませんでしたが、総当たりですのでこの時点ですべての8文字のパスの解析が終わっています。
[s]tatus =「s」キーを押して途中経過を見ています。
引き続き 9文字目の解析に入っています。(Guess.Mask : ?1?1?1?1?1?1?1?1?1 [9])
しかしながら、9文字目を終了するには 13537086546263552 (0.44%) と出ている通り (26+26+10)9=13,537,086,546,263,552(1京3537兆)のパターンを総当たりする必要があります。
これには8桁目の62倍の560時間≒26日の計算が必要になるため、[q]uit 「qキーを押して途中終了」しました。(そもそも今回の例では8文字パス1つだけしか登録していません)
この結果からパスワードの文字数を増やすことが有効であると分かります。
解析途中でタスクマネージャを見てみます。
今回NVIDIA社のグラフィックボードとCUDAを使いました。実際にCUDAがバリバリ働いていることが分かります(CUDAが表示されていない場合には、いずれかのグラフの ∨ をクリックしてドロップダウンから選択できます)。また温度が上がりますので夏場は注意です。
CUDA(Compute Unified Device Architecture:クーダ)とは、NVIDIAが開発・提供している、GPU向けの汎用並列計算用プラットフォームです。もともとリアルタイムグラフィックス表示用途、特にゲームグラフィックス用途に特化したGPUを開発していたNVIDIAが、その高い処理性能をグラフィックス以外にも活用できるようにするために開発した技術がCUDAです。CUDA - Wikipedia
今回のように、1つのハッシュ変換はたやすいが大量にこなすような仕事には並列計算が有用です。
私のグラボ(GeForce GTX 1070 2016年発売 6.1GH/s)だと8文字(218,340G)に約10時間かかりましたが、最新のグラボ(RTX 4090)では 164.1GH/s の速度が出ており 218,340/164.1=1,331s=22分となります。
Hashcat v6.2.6 benchmark on the Nvidia RTX 4090 · GitHub
前回紹介した記事に一覧表が載っていますが、こちらもhashcatを使っておりRTX 4090は同じく22分と出ています。英字数字に加えて記号(^*%$!&@#)を混ぜた場合でも59分。
1万基のNVIDIA A100とChatGPTによる解読も試しており、その場合これを1秒で解いています。ただ費用面から実用的ではありません。「消費者がアクセスしやすい構成としては RTX 4090 × 12 くらいがベストだと思う」だそうです。
Are Your Passwords in the Green?
恐るべし、今どきの「パスワード破り」の手口:780th Lap - キーマンズネット
現実的なA100を12基採用したシステムでbcryptハッシュ化された同8文字のパスワードを解読した場合は、約12年かかる。もちろんその間の演算性能向上を考慮する必要はあるが、パスワードを変更すれば安全性は高まるとしている。
複雑な8文字のパスワードでも、MD5ハッシュだとGeForce RTX 4090で1時間以内に解読されてしまう - PC Watch
これらの実施はクラウドを使うにしてもローカルに置いたデータの解析です。パスワードのハッシュ値が漏洩しているということは、攻撃者は既にサイトに侵入済みということになります。
ネットのホームページのログインフォームに対してブルートフォースアタックをかける場合はこんな高速にはできません(アカウントロックもあります)。手元にあるハッシュの解析とWebのログイン試行ではそもそもが別の話になりますので混同しないようにしてください。
その他
今時ソルト無しMD5で保存されていることはないだろうと思われるかもしれませんが、昨年(2023年に)話題になった事件ではパスワードがソルト無しMD5で保存されていたため、流出後に一部が解析され平文パスワードの形でハッキングフォーラムに投稿されてしまいました。
https://doc.pictbland.net/
また『各種情報はデータベース上で暗号化されておりましたが、暗号の複合キーも同時に漏洩しており既に複合されていると考えられます』とのことです。
情報漏えいについてのご報告 | Notion
不正アクセスによるpictBLand、pictSQUAREの情報流出の可能性についてまとめてみた - piyolog
SNS「ピクブラ」ユーザー情報80万件流出、復号キーも 「全サーバとプログラム廃棄して再構築」へ - ITmedia NEWS