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ハッシュが既知の場合に攻撃者がドメインコントローラにケルベロス認証のチケットを発行させることが可能となっている

Active DirectoryによるシングルサインオンにおいてはNTLMに代わりケルベロス認証が既定の認証プロトコルとなったが、NTLMはドメインコントローラが利用できない環境において広く利用されている。例えば、クライアントがケルベロス認証に対応していない場合、サーバがドメインに参加していない場合、ユーザーがインターネット経由のリモートで認証されている場合などが挙げられる。

## NTLMとケルベロス認証
マイクロソフトではWindows 2000以降およびActive Directoryドメインにおいてはケルベロス認証を推奨の認証プロトコルとしており、に参加しているサーバで広く利用されている。

一方、NTLMは以下のような状況で現在でも使われている。
* IPアドレスで指定されたサーバにクライアントが認証する
* 異なるActive Directory（ディレクトリ間の信頼モデルではなく旧式のNTLMの信頼モデルを使用している）に参加しているサーバにクライアントが認証する
* ドメインに参加していないサーバーにクライアントが認証する
* Active Directoryのドメインが存在しない（"workgroup"あるいは"peer-to-peer"と参照されることが多い）
* ファイアーウォールがケルベロス認証に必要なポート（通常はTCP 88）の使用を制限している

Windows Vista以降では、LMおよびNTLMは既定では使用されない。NTLMは内部認証には使用されているが、外部向けの認証ではNTLMv2が使用される。古いバージョンのWindowsでも同様の設定を行うことが可能である。

## プロトコル
NTLMはプロトコルであり、クライアントの認証には3つのメッセージが用いられ、データ完全性の検証のためにさらに1つのメッセージが用いられる
# クライアントがサーバへのネットワークパスを確立し、対応機能を告知するNEGOTIATE_MESSAGEを送信する
# サーバがクライアントの身元を確立するためのCHALLENGE_MESSAGEを返信する
# クライアントがAUTHENTICATE_MESSAGEと共にチャレンジを返信する

NTLMプロトコルでは1つあるいは2つのパスワードのハッシュ値が用いられ、サーバ（あるいはドメインコントローラ）に保存される。これらのハッシュ値はパスワードと等価に扱われる。すなわち、何らかの方法でこれらのハッシュ値をサーバから取得することができれば、実際のパスワードを知ることなく認証を行うことが可能となる。ハッシュ値の一方は*[[LMハッシュ]]*（パスワードの最初の14文字からDESを基とした関数によって生成されたハッシュ値）、もう一方は*NTハッシュ*（パスワードをUTF-16リトルエンディアンで表現したもののMD4）である。どちらも長さは16バイト（128ビット）である

NTLMでは一方向関数も用いられる。バージョン1ではDESをベースとしたLanMan one way function (LMOWF)が、バージョン2ではMD4をベースとしたNT MD4 based one way function (NTOWF)が用いられる。

### 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はの一種であるに対して脆弱である (MS08-068)。例えば、Metasploitを用いてあるマシンから認証情報を取得することで、他のマシンの制御を奪うことが可能である。Squirtle toolkitによって、ウェブサイトへのクロスサイトスクリプティング攻撃をNTLM経由での攻撃に利用することも可能である
。

2010年2月、WindowsのNTLM認証メカニズムの実装における複数の欠陥がAmplia Securityによって発見された。この欠陥を利用することで、攻撃者がファイルへの読み込み/書込み権限やリモートでのコード実行の権限を取得することが可能となる。攻撃の1つは、NTLMにおける疑似乱数とチャレンジ&レスポンス認証を推測可能なものであった。これらの欠陥は、Windowsのすべてのバージョンで17年以上にわたり存在していたものである。セキュリティアドバイザリでは、これとは異なる完全に動作するエクスプロイトが含まれていた。これらの欠陥のすべてはMS10-012によって修正された
。

## 脚注

## 関連項目
* LAN Manager
* 
* 
* ケルベロス認証

## 外部リンク
* Online NTLM hash crack using Rainbow tables
* NT LAN Manager (NTLM) Authentication Protocol Specification
* Cntlm – NTLM, NTLMSR, NTLMv2 Authentication Proxy and Accelerator Personal HTTP(S) and SOCKS5 proxy for NTLM-unaware applications (Windows/Linux/UNIX)
* The NTLM Authentication Protocol and Security Support Provider A detailed analysis of the NTLM protocol.
* MSDN article explaining the protocol and that it has been renamed
* MSDN page on NTLM authentication
* Libntlm – a free implementation.
* NTLM Authorization Proxy Server software that allows users to authenticate via an MS Proxy Server.
* Installing NTLM authentication – NTLM set-up instructions for Samba and Midgard on Linux
* NTLM version 2 (NTLMv2) and the LMCompatibilityLevel setting that governs it
* Jespa – Java Active Directory Integration Full NTLM security service provider with *server-side NETLOGON validation* (commercial but free up to 25 users)
* ntlmv2-auth NTLMv2 API and Servlet Filter for Java
* 
* WAFFLE – Java/C# Windows Authentication Framework
* objectif-securite (Rainbow tables for ophcrack)