
NTハッシュのデータベースを使用してMSCHAPv2のチャレンジ/レスポンスを迅速にクラックする
MSCHAPv2/NTLMv1 のチャレンジ/レスポンスを NT ハッシュのデータベースを使って迅速にクラックします
Assless CHAPs は、MSCHAPv2/NTLMv1 交換においてチャレンジとレスポンス(例:WiFi EAP WPE 攻撃から得られるもの)がある場合に、使用された NT ハッシュを効率的に復元する方法です。
このツールには NT ハッシュのデータベースが必要です。既存のリストや hashcat を使ったワードリストとルールからこれらのデータベースを作成する方法については、以下に説明があります。サンプルデータベースとして SecLists からのものを含めています。bunzip で展開する必要があります。
MSCHAPv2 交換では、平文のパスワードを「クラック」する必要はなく、使用された NThash がわかれば十分です。
MSCHAPv2 は NThash を 3 つの部分に分割し、それぞれの部分を異なる鍵として使用して、同じチャレンジ(ピアと認証者のチャレンジから導出)を DES 暗号化します。NThash は 2 つの 7 バイト鍵と 1 つの 2 バイト鍵に分割されます。つまり、最後の鍵は必要な長さにするために NULL でパディングされます。DES 操作の効率性と鍵空間が 65,535 であるため、この部分は迅速にブルートフォースできます。その 2 バイトが得られれば、データベース内の末尾がその 2 バイトであるすべての NThash を検索できます。これにより、チェックするハッシュの候補が大幅に絞り込まれます。
これはレインボーテーブルと同様の、空間と時間のトレードオフの一種です。また、ハッシュ・シャッキングの一形態でもあります。
これは Defcon 29 の RF Hacking Village で初めて発表されました。スライドはこのリポジトリに含まれています。
以下は、3 つのサンプルチャレンジ/レスポンスと、3 つの異なるワードリスト(小規模なプライベートリスト、rockyou、Have I Been Pwned リスト)での比較です。これらのテストは Macbook Pro 2016 で行いました。Hashcat はこのハッシュ・シャッキングカーネルと、内蔵の 2 つの GPU を使用し、純粋なカーネル(最適化版はまだ存在しないため)を使用しています。Hash3 はリストに含まれておらず、最悪のパフォーマンスを想定しています。hashcat が初回実行時にディクショナリキャッシュを構築する時間は含めていません。
Hash1
小規模ハッシュリスト:
hashcat 0.50s user 0.27s system 55% cpu 1.405 total (8597.8 kH/s)
assless 0.05s user 0.00s system 294% cpu 0.018 total
Rockyou ハッシュリスト:
hashcat 2.67s user 0.51s system 93% cpu 3.413 total
assless 0.05s user 0.01s system 281% cpu 0.021 total
HIBP ハッシュリスト:
hashcat 59.97s user 11.72s system 136% cpu 52.603 total (5620.6 kH/s)
assless 0.05s user 0.00s system 292% cpu 0.018 total
Hash 2
小規模ハッシュリスト:
hashcat 0.51s user 0.27s system 55% cpu 1.409 total (8704.7 kH/s)
assless 0.03s user 0.00s system 248% cpu 0.012 total
Rockyou ハッシュリスト:
hashcat 2.20s user 0.46s system 110% cpu 2.409 total (5798.4 kH/s)
assless 0.03s user 0.00s system 231% cpu 0.015 total
HIBP ハッシュリスト:
hashcat 65.37s user 12.74s system 135% cpu 57.712 total (5768.7 kH/s)
assless 0.03s user 0.00s system 249% cpu 0.013 total
Hash 3
Hash 3 はいずれのハッシュリストにも存在せず、最悪のルックアップパフォーマンスを想定しています。
小規模ハッシュリスト:
hashcat 0.67s user 0.34s system 66% cpu 1.526 total (7550.1 kH/s)
assless 0.02s user 0.00s system 211% cpu 0.012 total
Rockyou ハッシュリスト:
hashcat 2.71s user 0.52s system 94% cpu 3.415 total (5685.4 kH/s)
assless 0.02s user 0.01s system 181% cpu 0.014 total
HIBP ハッシュリスト:
hashcat 125.19s user 27.62s system 139% cpu 1:49.75 total (5634.9 kH/s)
assless 0.06s user 0.03s system 115% cpu 0.075 total
Rust 版には SQLite 3.6.8 以降が必要です。
Python 版には python3、sqlite3、pycryptodome が必要です。
データベース作成ユーティリティには python3 と sqlite3 CLI が必要です。
これは Rust 版にのみ適用されます。cargo が必要です。
cargo がインストールされていれば、assless-chaps-rs ディレクトリに移動し、次のコマンドでビルドします:
cargo build --release
結果のバイナリは target/release/ ディレクトリに格納されます。
Assless にはチャレンジ、レスポンス、NThash のデータベースが必要です。オプションで、Python 版ではバンドルされている最適化済みの 2 バイトルックアップファイルを使用できます。最も簡単な使い方は次のとおりです:
./assless-chaps <Challenge> <Response> <hashes.db>
例:
./assless-chaps 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db
出力は次のようになります:
[-] Two byte lookup file not provided, will brute force instead.
[+] Found in 22636 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
最終的な完全なハッシュ 8846f7eaee8fb117ad06bdd830b7586c は、パスワード password の NT ハッシュです。
私は、大規模なパスワードコーパス全体で最も頻出する 65,535 個の 2 バイト値をソートしたリストを作成するのに時間を費やしました。このファイルは twobytes として含まれています。assless の 4 番目の引数として渡すだけです。
これにより、通常は DES のラウンド数が数回節約されますが、速度に大きな差は生じません。多くのハッシュを処理する場合には効果があるかもしれません。
python3 assless-chaps.py 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db twobytes
[+] Found in 65533 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
mksqlitedb.py ファイルは、CSV ハッシュファイルをデータベースに変換するのに役立ちます。
python3 mksqlitedb.py <database name> <csv file>
CSV ファイルには次の 3 つの列が必要です:
例えば、ハッシュ 8846f7eaee8fb117ad06bdd830b7586c は次のようになります:
586c,8846f7eaee8fb1,17ad06bdd830b7
これに対する正規表現変換の例:
echo 8846f7eaee8fb117ad06bdd830b7586c | sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\)$/\3,\1,\2/"
既存のハッシュリスト(Have I Been Pwned リストなど)を使用するか、hashcat とお好みのワードリスト/ルールの組み合わせを使って独自に生成することができます。
HIBP パスワードリストは既に NT ハッシュとしてダウンロード可能で、ファイルからカウントを削除し、データベースにインポートするために CSV 形式に変換するだけです。
これは、標準的な Unix ユーティリティ sed を使って次のように行えます:
sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\):.*/\3,\1,\2/" pwned-passwords-ntlm-ordered-by-hash.txt > hibp.csv
その後、mksqlitedb.py hibp.db hibp.csv を使ってインポートできます。
プレーンなワードリストを nthash のハッシュリストに変換するには、nthasher を使用できます。これは大規模なワードリストを高速に処理できます。得られたハッシュは、前述の必要な CSV 形式に変換する必要があります。
このリポジトリには、ハッシュを直接必要な CSV 形式で出力する、はるかに遅い nthasher が含まれており、次のように簡単に実行できます:
python3 nthash-from-clear.py <wordlist> > hashlist.csv
ワードリストをルールで拡張したい場合は、次の hashcat を使用するセクションを参照してください。
mode 1000 の OpenCL モジュールに小さなコード変更を加えて、クラック候補に一致するものだけでなく、すべてのハッシュを出力させる必要があります。デフォルトでは、必要な CSV 形式でハッシュを生成します。
OpenCL ディレクトリに移動: cd hashcat/OpenCLpatch < m01000_a0-pure.cl.patchecho 11111111111111111111111111111111 > impossible_hashhashcat -m1000 impossible_hash rockyou.txt -r best64.rule --potfile-disable --quiet > rockyou.csvpython3 mksqlitedb.py rockyou.db rockyou.csvSQLite データベースは、通常、作成元の CSV ファイルよりも 61% 大きくなります。データベースの作成にはファイルサイズによって時間がかかる場合もあります。それに応じてファイルシステムの要件を準備してください。
以下は rockyou 辞書を使用した例です:
各ハッシュを動的に変換して挿入し、中間の CSV ファイルを不要にすることで容量を節約できます。
NTLMv1 は、SSP を使用している場合を除き、まったく同じように動作します。SSP が使用されているかどうかは、LM レスポンスがゼロの連続で終わっているかどうかで判断できます。付属の ntlm-ssp.py を使用して、assless が必要とするサーバーチャレンジを生成できます。
次のように実行します:
python3 ntlm-ssp.py <lm response> <challenge>
例えば、hashcat のサンプルハッシュからの NTLMv1-SSP チャレンジレスポンスの例を使用する場合:
u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c
LM とチャレンジを次のように渡します:
python3 ntlm-ssp.py 338d08f8e26de93300000000000000000000000000000000 cb8086049ec4736c
そして次のレスポンスが得られます:
The server challenge is: 724edf24aea0d68b
これは通常通り assless-chaps でクラックできます:
./assless-chaps 724edf24aea0d68b 9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41 hashes.db