Windowsネットワークでは、NT (New Technology) LAN Manager ( NTLM ) は、ユーザーに認証、完全性、機密性を提供するように設計されたMicrosoftセキュリティ プロトコルのスイートです。 [ 1 ] [ 2 ] [ 3 ] NTLM は、以前の Microsoft 製品である Microsoft LAN Manager (LANMAN)の認証プロトコルの後継です。NTLM プロトコル スイートは、セキュリティ サポート プロバイダーで実装されており、LAN Manager認証プロトコル、NTLMv1、NTLMv2、NTLM2 セッション プロトコルが 1 つのパッケージにまとめられています。これらのプロトコルがシステムで使用されているか、使用できるかは、グループ ポリシー設定によって制御され、Windows のバージョンによってデフォルト設定が異なります。
NTLMパスワードは、現代のハードウェアでは非常に簡単に総当たり攻撃で解読できるため、脆弱であると考えられています。[ 4 ]
NTLMは、接続指向環境(接続レス環境も同様)でクライアントを認証するために3つのメッセージを使用するチャレンジ・レスポンス認証プロトコルであり、完全性が必要な場合は4つ目の追加メッセージを使用します。 [ 5 ] [ 6 ] [ 7 ] [ 8 ]
NTLM プロトコルは、2 つのハッシュ化されたパスワード値のうちの 1 つまたは両方を使用します。これらの値は両方ともサーバー (またはドメイン コントローラ) に保存されており、ソルトがないためパスワードと同等です。つまり、サーバーからハッシュ値を取得すれば、実際のパスワードを知らなくても認証できます。2 つのハッシュ値は、 LM ハッシュ(パスワードの最初の 14 文字を言語の従来の 8 ビット PC 文字セットに変換したものに適用されるDESベースの関数) と NT ハッシュ (リトルエンディアンのUTF-16 UnicodeパスワードのMD4 ) です。どちらのハッシュ値もそれぞれ 16 バイト (128 ビット) です。[ 12 ]
NTLMプロトコルは、NTLMバージョンに応じて2つの一方向関数のいずれかを使用します。NT LanManとNTLMバージョン1はDESベースのLanMan一方向関数(LMOWF)を使用し、NTLMv2はNT MD4ベースの一方向関数(NTOWF)を使用します。[ 12 ] [ 13 ]
サーバーは、8バイトの乱数であるチャレンジを送信することでクライアントを認証します。クライアントは、チャレンジとクライアントとサーバー間で共有される秘密情報(具体的には、前述の2つのパスワードハッシュのうちの1つ)を用いた演算を実行します。クライアントは、この演算の結果として得られる24バイトの文字列を返します。実際には、NTLMv1では通常、両方のハッシュを使用して演算が行われ、両方の24バイトの文字列が送信されます。サーバーは、クライアントが正しい結果を計算したことを確認し、そこから秘密情報を保有していること、ひいてはクライアントの正当性を推測します。
どちらのハッシュ関数も16バイトのデータを生成します。これに5バイトのゼロを追加して21バイトにします。この21バイトは3つの7バイト(56ビット)のデータに分割されます。それぞれの56ビットのデータは、 64ビットのチャレンジをDES暗号化するための鍵として使用されます。チャレンジの3つの暗号化されたデータが結合され、24バイトのレスポンスが生成されます。レスポンスはLMハッシュとNTハッシュの両方を使用して返されますが、これは設定可能です。
C = 8バイトのサーバーチャレンジ、ランダム K1 | K2 | K3 = NTLMハッシュ | 5バイト-0 応答 = DES(K1,C) | DES(K2,C) | DES(K3,C)
Windows NT 4.0 SP4 [ 14 ]で導入され、Windows 2000 でネイティブにサポートされている NTLMv2 は、チャレンジレスポンス認証プロトコルです。これは、NTLMv1 の暗号的に強化された代替として意図されており、プロトコルを多くのなりすまし攻撃に対して強化し、サーバーがクライアントに対して認証する機能を追加することで NTLM のセキュリティを強化します。[ 1 ] [ 15 ] [ 16 ]
NTLMv2 は、8 バイトのサーバー チャレンジに対して 2 つの応答を送信します。各応答には、サーバー チャレンジの16 バイトのHMAC - MD5ハッシュ、完全にまたは部分的にランダムに生成されたクライアント チャレンジ、およびユーザーのパスワードとその他の識別情報の HMAC-MD5 ハッシュが含まれます。2 つの応答は、クライアント チャレンジの形式が異なります。短い方の応答では、このチャレンジに 8 バイトのランダム値を使用します。応答を検証するには、サーバーは応答の一部としてクライアント チャレンジを受け取る必要があります。この短い応答では、16 バイトの応答に 8 バイトのクライアント チャレンジが付加され、24 バイトのパッケージになります。これは、以前の NTLMv1 プロトコルの 24 バイトの応答形式と一致しています。一部の非公式ドキュメント (DCE/RPC Over SMB、Leighton など) では、この応答は LMv2 と呼ばれています。
NTLMv2 が送信する 2 番目の応答では、可変長のクライアント チャレンジが使用されます。このチャレンジには、(1) NT タイムフォーマットの現在時刻、(2) 8 バイトのランダム値 (下のボックスの CC2)、(3) ドメイン名、(4) 標準フォーマットの情報が含まれます。応答にはこのクライアント チャレンジのコピーを含める必要があり、そのため可変長となります。非公式のドキュメントでは、この応答は NTv2 と呼ばれます。
LMv2とNTv2はどちらも、クライアントとサーバーのチャレンジを、ユーザーのパスワードとその他の識別情報のNTハッシュでハッシュ化します。正確な計算式は、SAMまたはADに保存されているNTハッシュから始め、 HMAC - MD5を使用してユーザー名とドメイン名をハッシュ化していくというものです。下のボックスでは、Xは書式設定フィールドの固定内容を表します。
SC = 8バイトのサーバーチャレンジ、ランダム CC = 8バイトのクライアントチャレンジ、ランダム CC* = (X、時間、CC2、ドメイン名) v2-Hash = HMAC-MD5(NT-Hash, ユーザー名, ドメイン名) LMv2 = HMAC-MD5(v2-Hash, SC, CC) NTv2 = HMAC-MD5(v2-Hash, SC, CC*) 応答 = LMv2 | CC | NTv2 | CC*
NTLM2セッションプロトコルはMS-CHAPv2に似ています。[ 17 ] NTLMv1の認証とNTLMv2のセッションセキュリティを組み合わせたものです。
簡単に説明すると、NTLMv1アルゴリズムが適用されますが、8バイトのサーバーチャレンジに8バイトのクライアントチャレンジが追加され、MD5ハッシュ化されます。ハッシュ結果の最小の8バイト部分が、NTLMv1プロトコルで使用されるチャレンジとなります。クライアントチャレンジは応答メッセージの24バイトのスロットの1つに格納され、計算された24バイトの応答はもう1つのスロットに格納されます。
これは、既存のドメインコントローラインフラストラクチャを使用する機能を維持しつつ、不正なサーバーによる辞書攻撃を回避する、強化されたNTLMv1形式です。固定されたXに対して、サーバーは、位置Yに値Kを持つテーブルを計算し、Y=DES_K(X)とします。クライアントがチャレンジの選択に参加しない場合、サーバーはXを送信し、テーブルで応答Yを検索してKを取得できます。この攻撃は、レインボーテーブルを使用することで実用化できます。[ 18 ]
しかし、既存のNTLMv1インフラストラクチャでは、チャレンジ/レスポンスペアはサーバーによって検証されず、検証のためにドメインコントローラーに送信されます。NTLM2セッションを使用する場合、サーバーがチャレンジの代わりにサーバーチャレンジとクライアントチャレンジのハッシュを使用すれば、このインフラストラクチャは引き続き機能します。
NTLMv1 クライアント<-サーバー: SC クライアント→サーバー: H(P,SC) サーバー->DomCntl: H(P,SC), SC サーバー<-DomCntl: はいまたはいいえ NTLM2セッション クライアント<-サーバー: SC クライアント→サーバー: H(P,H'(SC,CC)), CC サーバー->DomCntl: H(P,H'(SC,CC)), H'(SC,CC) サーバー<-DomCntl: はいまたはいいえ
2010年以降、マイクロソフトはアプリケーションでのNTLMの使用を推奨しなくなりました。[ 19 ]
実装者は、NTLMがAESやSHA-256などの最新の暗号化方式をサポートしていないことに留意する必要があります。NTLMは、整合性の検証に巡回冗長検査(CRC)またはMD5を使用し、暗号化にはRC4を使用します。
パスワードから鍵を生成する方法は、RFC1320およびFIPS46-2で規定されています。したがって、アプリケーションでは一般的にNTLMを使用しないことが推奨されます。
これらの推奨事項にもかかわらず、NTLMは依然として多くのシステムで広く使用されています。その主な理由は、旧システムとの互換性を維持するためです。しかし、状況によってはNTLMの使用を回避できる場合もあります。
Microsoft は、相互運用性を向上させるために、 Kerberos プロトコルの実装に NTLM ハッシュを追加しました(特に RC4-HMAC 暗号化タイプ)。独立研究者によると、この設計上の決定により、NTLM ハッシュが既知であれば、ドメイン コントローラーが攻撃者に Kerberos チケットを発行するように騙される可能性があります。[ 20 ] Microsoft は、Windows 2000 以降の Active Directory ドメインの推奨認証プロトコルとしてKerberos を採用しました。 [ 16 ] Kerberos は通常、サーバーがWindows Server ドメインに属している場合に使用されます。Microsoft は、開発者に対して Kerberos も NTLM セキュリティ サポート プロバイダー (SSP) も直接使用しないことを推奨しています。[ 21 ]
アプリケーションはNTLMセキュリティパッケージに直接アクセスしてはならず、代わりにNegotiateセキュリティパッケージを使用する必要があります。Negotiateを使用すると、認証に関与するシステムがサポートしている場合、アプリケーションはより高度なセキュリティプロトコルを利用できます。現在、NegotiateセキュリティパッケージはKerberosとNTLMのどちらかを選択します。認証に関与するシステムのいずれかがKerberosを使用できない場合を除き、NegotiateはKerberosを選択します。
NTLM SSPは、次のような状況で使用されます。
アプリケーション開発者またはNegotiate SSPによってNTLM SSPを認証に使用することが決定された後、グループポリシーによってNTLM SSPが実装する各プロトコルの使用可否が規定されます。認証レベルは5つあります。[ 23 ]
DCとはドメインコントローラーを意味するが、この用語の使用は紛らわしい。サーバーとして機能し、ユーザーを認証するコンピューターは、この文脈ではDCの役割を果たす。例えば、ネットワークログオン時にAdministratorなどのローカルアカウントが使用されるWindowsコンピューターなどがこれに該当する。
Windows NT 4.0 Service Pack 4より前は、SSPはNTLMv1でネゴシエートを行い、相手のマシンがそれをサポートしていない場合はLMにフォールバックしていました。
Windows NT 4.0 Service Pack 4 以降、SSP はクライアントとサーバーの両方が NTLMv2 セッションをサポートしている場合に、NTLMv2 セッションをネゴシエートするようになりました。[ 24 ] Windows XP までは、米国が当時暗号化技術の輸出に厳しい制限を設けていたため、米国以外のコンピューターでは 40 ビットまたは 56 ビットの暗号化が使用されていました。Windows XP SP3 以降では、アップデートをインストールすることで 128 ビットの暗号化を追加でき、Windows 7 では 128 ビットの暗号化がデフォルトになりました。
Windows Vista 以降では、受信認証で LM が無効になっています。Windows Server 2003 までの Windows NT ベースのオペレーティングシステムでは、LAN Manager (LM) ハッシュと Windows NT ハッシュの 2 つのパスワードハッシュが保存されます。Windows Vista以降では、両方を保存する機能がありますが、既定では 1 つが無効になっています。つまり、Windows Vista を実行しているコンピューターがサーバーとして動作する場合、LM 認証は機能しなくなります。以前のバージョンの Windows (Windows NT 4.0 Service Pack 4 まで) では、このように動作するように構成できましたが、既定ではありませんでした。[ 25 ]
NTLM は、Microsoft セキュリティ更新プログラム MS08-068 で対処されたリフレクション攻撃の亜種であるパスザハッシュ攻撃に対して脆弱なままです。たとえば、多くの場合、 Metasploit は、あるマシンから認証情報を取得し、それを使用して別のマシンを制御するために使用できます。 [ 3 ] [ 26 ] Squirtle ツールキットを使用すると、Web サイトのクロスサイトスクリプティング攻撃を NTLM を介して近くの資産への攻撃に悪用できます。[ 27 ]
2010 年 2 月、Amplia Security は、Windows の NTLM 認証メカニズムの実装にいくつかの欠陥を発見しました。この欠陥によりプロトコルのセキュリティが侵害され、攻撃者がファイルへの読み書きアクセスやリモート コード実行を取得することが可能になりました。提示された攻撃の 1 つは、プロトコルによって生成される擬似乱数とチャレンジ/レスポンスを予測する機能でした。これらの欠陥は、17 年間すべてのバージョンの Windows に存在していました。これらの問題を説明するセキュリティ アドバイザリには、完全に動作する概念実証エクスプロイトが含まれていました。これらの欠陥はすべて MS10-012 で修正されました。[ 28 ] [ 29 ]
2012年には、考えられるすべての8文字のNTLMパスワードハッシュの組み合わせを6時間以内に解読できることが実証されました。 [ 30 ]
2019年には、より現代的なハードウェアを使用することで、この時間は約2.5時間に短縮されました。[ 4 ] [ 31 ]また、 8文字および9文字のNTLMパスワード用のレインボーテーブルも利用可能です。短いパスワードはブルートフォース方式で復元できます。[ 32 ]
2019年、EvilMog [ 33 ] [ 34 ]は、NTLMv1チャレンジ応答をhashcat互換のクラッキング形式に変換するntlmv1-multitool [ 35 ]というツールを公開しました。hashcatと十分なGPUパワーがあれば、hashcatフォーラムでatom [ 36 ]が実証したように、hashcatモード14000でDESキーをクラックすることで、既知の平文攻撃を使用してNTLMハッシュを導出できます。
パスザハッシュ攻撃やパスワードクラッキングで使用されるパスワード相当のハッシュは、まず「盗み出す」(例えば、ハッシュへのアクセス権限を持つシステムを侵害するなど)必要があることに注意してください。また、これらのハッシュは、従来のNTLM認証中にネットワーク経由で送信されるNTLMSSP_AUTHハッシュとは異なります。
Linux 用の NTLM 実装には、Cntlm [ 37 ]やwinbind ( Sambaの一部) [ 38 ]などがあり、Linux アプリケーションが NTLM プロキシを使用できるようになります。
FreeBSD は、 Crypt (C)を介してパスワードを安全でない NT-Hash 形式で保存することもサポートしています。[ 39 ]