はじめに
Windowsのネットワーク認証を代表するプロトコルが NTLM(NT LAN Manager) です。Kerberosが推奨される現代においても、互換性維持のためにあちこちで生き残っています。
Linuxエンジニアにとっての「認証」といえば、古くは単純なハッシュ比較、現代ではKerberosや公開鍵認証が主流です。Windowsにも「パスワードをそのままネットワークに流さない」仕組みがあり、それが チャレンジ/レスポンス方式 です。
今回のポイント: 「パスワードを送っていないから安全」は誤りです。NTLMにはハッシュそのものが認証資格情報として機能してしまう、という構造的な弱点があります。
1. NTLM認証の3ステップ(チャレンジ/レスポンス)
NTLM認証は、クライアントとサーバーの間で以下の3往復で完結します。
ステップ1:Negotiate(交渉)
クライアントが「NTLMで認証したいです」とサーバーに通知します。サポートするNTLMのバージョンや機能フラグも合わせて送信されます。
ステップ2:Challenge(挑戦)
サーバーが ランダムな8バイトの値(チャレンジ) を生成してクライアントに送り返します。
ステップ3:Authenticate(認証)
クライアントが自身のパスワードハッシュを使ってチャレンジを加工し、その結果(レスポンス)を送信します。サーバー側で同じ計算を行い、値が一致すればログイン成功です。
クライアント サーバー
| |
|--- [1] Negotiate ------------------> |
| |
|<-- [2] Challenge (8バイトのランダム値) -- |
| |
|--- [3] Authenticate (レスポンス) ----> |
| |
|<-- 成功 or 失敗 -------------------- |
Linuxエンジニアの視点:
この仕組みはHTTPのDigest認証や、チャレンジ/レスポンス型PAMモジュールに近い挙動です。パスワードの生データはネットワークを流れません。
2. 決定的な弱点:「ソルト(Salt)」の欠如
Windowsの内部(SAMデータベースやActive Directory)に保存されているNTLMハッシュにはソルトがありません。これがNTLMの脆弱性の根源です。
Linux (/etc/shadow) |
Windows(NTLMハッシュ) | |
|---|---|---|
| ハッシュの生成 | パスワード + ランダムなソルト | パスワードのみ(ソルトなし) |
| 同じパスワードなら | マシンごとに異なるハッシュ | 全マシンで同一のハッシュ |
| レインボーテーブル耐性 | 高い | 低い |
ソルトがないということは、「Password123」というパスワードは、世界中のどのWindowsマシンでも全く同じハッシュ値になります。これが以下の攻撃を可能にします。
3. 主な攻撃手法
リスク1:Pass-the-Hash (PtH)
攻撃者はパスワードを解読する必要すらありません。SAMデータベースやメモリ(LSASS)からNTLMハッシュを盗み出し、それをそのままステップ3のレスポンスとして送りつけることで、正規ユーザーとしてログインできてしまいます。
通常のログイン: パスワード → ハッシュ生成 → レスポンス計算 → 送信
PtH攻撃: 盗んだハッシュ ──────────→ レスポンス計算 → 送信
リスク2:NTLMリレー攻撃
攻撃者がクライアントとサーバーの中間に割り込み(Man-in-the-Middle)、クライアントから正規に送られてきたレスポンスを別のサーバーに横流しすることで、攻撃対象のサーバーに不正ログインする手法です。
クライアント → [レスポンス] → 攻撃者 → [そのまま転送] → 別のサーバー(不正ログイン成功)
SMB署名(後述)が設定されていない環境では、この攻撃が成立しやすくなります。
4. 「NTLMハッシュ」と「Net-NTLMレスポンス」の混同に注意
ここが最も混乱しやすいポイントです。セキュリティツールのドキュメントでも混用されることがあるため、正確に区別してください。
| 名称 | 保存場所 | 用途 |
|---|---|---|
| NTLMハッシュ(NT Hash) | SAM / AD(ディスク上) | Pass-the-Hashに直接利用可能 |
| Net-NTLM v1/v2 レスポンス | ネットワーク上を流れる | そのままではPtHに使えないが、クラック(逆算)のリスクあり |
攻撃者がネットワークを盗聴して得られるのは Net-NTLMレスポンス です。これはNTLMハッシュとチャレンジを組み合わせたデータであり、Pass-the-Hashにはそのまま使えません。しかし、HashcatやJohn the Ripperなどのツールで総当たりクラックを試みられるリスクがあります。
Net-NTLM v1 vs v2:
- v1(古い): アルゴリズムが弱く、クラックが容易。現在は使用禁止が推奨されます。
- v2(現行): クライアント側のチャレンジも加わり、クラック耐性が向上しています。それでも強力なGPUによる総当たり攻撃には注意が必要です。
5. 実践:自マシンのNTLM設定を確認する
現在のWindowsでは、セキュリティ向上のために古いNTLM(v1やLM)を禁止し、NTLMv2のみを許可するのが原則です。
PowerShellで設定を確認する
# NTLMの認証レベル(LMCompatibilityLevel)を確認
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "LMCompatibilityLevel"
LMCompatibilityLevel の値と意味:
| 値 | 意味 |
|---|---|
0 |
LM / NTLM を送信(最も危険・非推奨) |
1 |
チャレンジ交渉があればNTLMv2を使用 |
2 |
NTLMv2 のみ送信 |
3 |
NTLMv2 のみ送信(ドメイン参加時) |
4 |
LM 応答を拒否 |
5 |
NTLMv2 のみ送信、LM と NTLMv1 を拒否(推奨) |
補足: グループポリシーで設定する場合は
コンピューターの構成 > Windowsの設定 > セキュリティの設定 > ローカルポリシー > セキュリティオプション > ネットワーク セキュリティ: LAN Manager 認証レベルから変更できます。
SMB署名の確認(NTLMリレー対策)
NTLMリレー攻撃への対策として、SMB署名の強制も重要です。
# SMB署名の設定を確認
Get-SmbServerConfiguration | Select-Object RequireSecuritySignature, EnableSecuritySignature
RequireSecuritySignatureがTrueであれば、署名のないSMB接続を拒否します(リレー攻撃防止に有効)。
おわりに
NTLMの弱点を整理すると、以下の通りです。
- ソルトなしのハッシュ → Pass-the-Hash攻撃が成立する
- 中間者攻撃への脆弱性 → NTLMリレー攻撃が成立する
- Net-NTLMレスポンスの盗聴 → オフラインクラックのリスクがある
これらの根本的な対策は、NTLMへの依存をやめ、Kerberos認証に移行することです。Kerberosはチャレンジ/レスポンスではなくチケット方式を採用しており、上記の攻撃に対してより堅牢な設計になっています。
次回の 第6回「認証プロトコル2 —— Kerberos認証をパケットレベルで理解する」 では、LinuxのKerberosコマンド(kinit/klist)でも馴染みのあるKerberosが、Active Directoryの世界でどのように「主役」を担っているかを解説します。
補足:内部ネットワークでの検証について
内部ネットワークで
Responderなどのツールを動かすと、Windowsマシンが名前解決失敗時に自動的にNTLM認証を試み、Net-NTLMレスポンスをブロードキャストする様子が観察できます。これを「誘い込み(Poisoning)」として悪用する手法は、実際の侵害事例でも多用されます。防御策:
- SMB署名の強制(リレー攻撃対策)
- LLMNR / NetBIOSの無効化(Poisoning対策)
- NTLMv1の禁止(
LMCompatibilityLevel = 5)
第5回、完了です。第6回「Kerberos認証」へ続きます。