NT LAN Manager

NT LAN Manager (NTLM) は、マイクロソフトによるセキュリティプロトコルであり、利用者に機密性、完全性、可用性といった情報セキュリティを提供する。NTLMは、マイクロソフトによるアプリケーションプロトコルであるLAN Manager (LANMAN, LM) の後継である。NTLM バージョン2 (NTLMv2) はWindows NT 4.0 SP4から導入され（Windows 2000以降で標準対応）、多くの攻撃に対する耐性の向上と、クライアント認証機能の追加が行われた 。

ベンダーによる推奨

2014年現在、マイクロソフトではNTLMの利用を推奨していない 。
"（NTLMを）実装する者は、NTLMがAESやSHA-256といった最近の暗号メソッドをサポートしていないことを考慮してください。NTLMでは、データの完全性の検証に巡回冗長検査 (CRC) あるいは Message Digest Algorithm (RFC 1321)（注：MD5のこと）を、暗号化にはRC4を用いています。
パスワードから導出される鍵は RFC 1320（注：MD4のこと）および FIPS 46-2（注：DESのこと）に基づいています。以上の理由より、アプリケーションではNTLMを使用しないよう推奨します。"
マイクロソフトでは、運用性向上のためにNTLMハッシュをケルベロス認証の実装に追加している。研究者によると、このような設計により、NTLMハッシュが既知の場合に攻撃者がドメインコントローラにケルベロス認証のチケットを発行させることが可能となっている
Active DirectoryによるシングルサインオンにおいてはNTLMに代わりケルベロス認証が既定の認証プロトコルとなったが、NTLMはドメインコントローラが利用できない環境において広く利用されている。例えば、クライアントがケルベロス認証に対応していない場合、サーバがドメインに参加していない場合、ユーザーがインターネット経由のリモートで認証されている場合などが挙げられる。

NTLMv1

NTLMバージョン1 (NTLMv1) では、サーバは8バイトのランダム文字列をチャレンジとして送信することでクライアントを認証する。クライアントはこのチャレンジと秘密鍵を組み合わせる。秘密鍵は前述のパスワードのハッシュ値の1つから生成され、合わせて24バイトの文字列が返信される。実際には、パスワードのハッシュ値の両方が用いられ、それぞれから求められる24バイトの文字列の両方が送信される。サーバはクライアントから送信された文字列を検証し、クライアントを認証する。
どちらのハッシュ値も16バイトの長さを有している。5バイト分の0を追加し21バイトとした後に、7バイト（56ビット）ずつに分割する。これら56ビットの文字列を鍵として、64ビットのチャレンジをDESによって暗号化する。得られたチャレンジの暗号化結果3つを統合し、24バイトのレスポンスとする。LMハッシュ、NTハッシュからそれぞれ得られたレスポンスをサーバへ返信する。

C = 8-byte server challenge, random
K1 | K2 | K3 = NT-Hash | 5-bytes-0
R1 = DES(K1,C) | DES(K2,C) | DES(K3,C)
K1 | K2 | K3 = LM-Hash | 5-bytes-0
R2 = DES(K1,C) | DES(K2,C) | DES(K3,C)
response = R1 | R2

NTLMv2

Windows NT 4.0で導入されたNTLMバージョン2 (NTLMv2) は、NTLMv1を暗号学的により強固にしたものである。
NTLMv2では、8バイトのサーバチャレンジを2つクライアントへ送信する。それぞれに対するレスポンスは、サーバチャレンジ、ランダムに生成されたクライアントチャレンジ、ユーザのパスワードやそのほかの認証情報のHMA-MD5ハッシュの3つのHMAC-MD5ハッシュを含んでいる。
2つのレスポンスでは、クライアントチャレンジのフォーマットが異なっている。短い方のレスポンスでは、8バイトのランダム文字列をクライアントチャレンジとして用いる。レスポンスの検証のために、サーバはこのクライアントチャレンジをレスポンスの一部として受け取る。この短いレスポンスでは、8バイトのクライアントチャレンジを16バイトに伸ばしたうえでNTLMv1プロトコルと同様の手法で24バイトのレスポンスとする。非公式のドキュメントでは、このレスポンスはLMv2と呼ばれる。
もう一方のレスポンスでは、(1)NT Timeフォーマットによる現在時刻、(2)8バイトのランダム文字列（以下の式におけるCC2）、(3)ドメイン名、(4)標準化のための埋め草を含む可変長のクライアントチャレンジを用いる。この可変長クライアントチャレンジを含むため、こちらのレスポンスも可変長となる。非公式のドキュメントではこちらのレスポンスはNTv2と呼ばれる。
LMv2とNTv2はいずれも、サーバチャレンジ、クライアントチャレンジ、ユーザのパスワードやそのほかの認証情報のハッシュとなる。

SC = 8-byte server challenge, random
CC = 8-byte client challenge, random
CC* = (X, time, CC2, domain name)
v2-Hash = HMAC-MD5(NT-Hash, user name, domain name)
LMv2 = HMAC-MD5(v2-Hash, SC, CC)
NTv2 = HMAC-MD5(v2-Hash, SC, CC*)
response = LMv2 | CC | NTv2 | CC*

NTLM2セッション

NTLM2セッションはMS-CHAPv2と類似している。認証にNTLMv1を、セッションのセキュリティにNTLMv2を利用している。
NTLM2セッションは、8バイトのクライアントチャレンジを8バイトのサーバチャレンジと合わせたうえでMD5ハッシュをとる以外はNTLMv1アルゴリズムと同じである。ハッシュの前半はNTLMv1におけるチャレンジと一致する。クライアントチャレンジはレスポンスの1つの24バイトのスロットとして返信され、計算された24バイトのレスポンスは異なるスロットとして返信される。
これは既存のドメインコントローラにおける互換性を維持しつつ、辞書攻撃への耐性を強化したNTLMv1の変形と言える。チャレンジの選択にクライアントが関与しない場合、サーバ側がレインボーテーブルによって攻撃が可能となる 。
既存のNTLMv1インフラではチャレンジ/レスポンスの組はサーバによって検証されないが、ドメインコントローラに送ることで検証が可能となる。NTLM2セッションを用いることで、サーバチャレンジをサーバ・クライアントチャレンジのハッシュで代用することでこれら古いインフラを継続して利用可能となる。

NTLMv1
  Client<-Server:  SC
  Client->Server:  H(P,SC)
  Server->DomCntl: H(P,SC), SC
  Server<-DomCntl: yes or no

NTLM2 Session
  Client<-Server:  SC
  Client->Server:  H(P,H'(SC,CC)), CC
  Server->DomCntl: H(P,H'(SC,CC)), H'(SC,CC)
  Server<-DomCntl: yes or no

脆弱性

NTLMは広く用いられており、古いシステムとの互換性維持のために新しいシステムにおいても利用されている。NTLMはリフレクション攻撃の一種であるpass the hashに対して脆弱である (MS08-068)。例えば、Metasploitを用いてあるマシンから認証情報を取得することで、他のマシンの制御を奪うことが可能である。Squirtle toolkitによって、ウェブサイトへのクロスサイトスクリプティング攻撃をNTLM経由での攻撃に利用することも可能である 。
2010年2月、WindowsのNTLM認証メカニズムの実装における複数の欠陥がAmplia Securityによって発見された。この欠陥を利用することで、攻撃者がファイルへの読み込み/書込み権限やリモートでのコード実行の権限を取得することが可能となる。攻撃の1つは、NTLMにおける疑似乱数とチャレンジ&レスポンス認証を推測可能なものであった。これらの欠陥は、Windowsのすべてのバージョンで17年以上にわたり存在していたものである。セキュリティアドバイザリでは、これとは異なる完全に動作するエクスプロイトが含まれていた。これらの欠陥のすべてはMS10-012によって修正された 。