本当は怖い Windows パスワードハッシュ

「各社員の PC の Windows の管理者パスワードは 16 文字くらいの複雑なものにしているので、たとえ 1 台の PC の HDD から NTLM ハッシュ (MD4 ハッシュ) が盗まれてもブルートフォース攻撃で元のパスワードは導出できず、安全だ。」と考えて、多数の各社員の PC に同一の管理者パスワードを設定している企業のシステム管理者は多い。しかし実際にはいずれか 1 台の PC から管理者パスワードの MD4 ハッシュが攻撃者に読み出された時点でアウトである。攻撃者にとって不正ログインに必要なのは MD4 ハッシュのみであり、平文パスワードを逆算する必要はない。MD4 ハッシュの入手に成功した攻撃者は、企業内で同一の管理者パスワードが設定されてある他の PC すべてに管理者権限で侵入することができるようになる。現状、企業の情報システム部門は、多数の社員用の Windows PC をインストール・初期設定する際に、すべての PC に同一の長い強力なパスワードを設定しているところが多いと考えられる。たとえ企業内のドメインActive Directory を使用している場合でも、Windows のローカルには通常 1 個以上の Administrators 権限を持つユーザーを最初に作成する。この共通の管理者ユーザーのパスワードが曲者である。16 文字のパスワードを設定していても無意味である。絶対にハッシュから復元できないような 100 文字の超難解な乱数パスワードを設定していても、完全に無駄である。複数の PC に同一のパスワードを設定していれば、1 台侵入されれば他のすべてが侵入される。

そもそも、「Windows のパスワードを長い文字列かつ推測困難にしていれば大丈夫である」という神話は、仮に攻撃者が NTLM ハッシュを盗むことに成功したとしても、元のパスワードを逆算することはできないという事実から生まれたものである。確かに Windows のアカウントのパスワードとして長い文字列を設定していれば、攻撃者にはパスワードの平文は分からない。たとえその Windows コンピュータの HDD から SAM データベースが抽出され、NTLM ハッシュ (MD4 ハッシュ) が取得されても、元のパスワードは逆算できない。元の平文パスワードが分からなければ、攻撃者は、たとえハッシュを手に入れても、対象となる PC にインタラクティブ・ログオンすることはできない。だから安全である。このように考えているシステム管理者は多い。しかし実際にはこれは大きな間違いである。前述のとおり、同一の管理者パスワードが設定されている複数の PC は、そのうち 1 台でも攻撃者の手に渡れば、すべての PC に攻撃者が侵入できるようになる。

なぜ攻撃者は 1 台の PC の管理者パスワードのハッシュを手に入れただけで、他の PC に侵入できるのか。Windows は、パスワード文字列を Unicode 文字としてエンコードしたバイト列を MD4 でハッシュしてできた 128 ビットのハッシュ値を NTLM ハッシュとしてレジストリ (SAM データベース) に保存する。複数の PC で同一のパスワードを設定している場合、MD4 ハッシュの値は同一となる。UNIX のパスワードデータベースでは同一のパスワードを設定しても毎回生成されるソルトの値が異なるのでハッシュの値は異なる。しかし Windows は NT 時代からずっとソルトを使用していない。これはよく誤解されているように、開発当時、Microsoft 社がソルトの使用を思い付かなかった訳ではない。Windows のパススルー認証を実現するために、恒久的に保存されるパスワードハッシュにソルトを使用することが原理的に不可能であることが原因である。

なぜ Windows のパスワードはソルトなしで MD4 ハッシュ化した値をそのまま保存するのか。その理由は、ある 1 台の PC でログインしているユーザーが、ネットワーク経由で別の PC の共有フォルダに同一ユーザー名・同一パスワードでパスワードの再入力なしで接続できるようにするためである。この機能の実現のため、接続元の PC (クライアント) は、接続先の PC (サーバー) から、何らかの方法で認証される必要がある。NTLM 認証 (現在標準として使用されている NTLMv2 認証) は、チェレンジ・レスポンス方式である。チェレンジ・レスポンスというと、PPP で使用されている CHAP が有名である。PPP の CHAP はパスワードの平文をサーバーとクライアントの両方が知らなければならない。Windows では SAM にはパスワードのハッシュしか保存されておらず、復元可能なパスワードはどこにも保存されていない。そのため NTLMv2 認証のチェレンジ・レスポンスの際には、サーバーとクライアントと両方で既知の共通鍵として、パスワードの平文を使用することは不可能である。代わりに、パスワードの MD4 ハッシュが使用される。

Windows が NTLMv2 認証のチェレンジ・レスポンスの際に、パスワードの MD4 ハッシュを使用していることは、一見安全なように思えるかも知れない。しかし、よく考えるとこれは単に「パスワードの MD4 ハッシュ」をクレデンシャル (平文パスワードの代わり) として使っているだけに過ぎない。確かにクレデンシャルが攻撃者に知られても、元の平文パスワードの逆算は不可能である (パスワードが十分複雑な場合)。しかし攻撃者はクレデンシャルを知っていれば、同一のクレデンシャルを持つ別の PC に NTLMv2 認証を要求することができる。前述のとおり NTLMv2 認証に必要な秘密情報は MD4 ハッシュだけであるので、認証は必ず成功する。

攻撃者が共通の管理者アカウントの MD4 パスワードハッシュを使用して、いったんリモート PC に対して NTLMv2 認証に成功すれば、その後はやりたい放題である。SMB (CIFS) プロトコルを用いてファイル転送や RPC 呼び出しが可能になるので、リモート PC 上ですべてのファイルやレジストリを読み書きしたり、任意のユーザーを新規作成したり、リモート PC 上の SAM パスワードデータベースから他のユーザーのパスワードの MD4 ハッシュを抜き出したりすることができる。リモート PC 上に特製のマルウェアrootkit をインストールし、キーログを取得したり画面を監視したりすることも可能である。

このように、複数の PC で共通の Windows 管理者パスワードが設定されている場合、攻撃者によって、いずれか 1 台から MD4 ハッシュが盗まれた時点でアウトである。攻撃者は MD4 ハッシュからパスワードを逆算する必要はないから、どれだけ長いパスワードをかけていても、全く意味がない。また、各 PC の管理者ユーザー名が異なっていても、パスワードが同じであれば MD4 ハッシュ値は同一になるからセキュリティ上の対策にはならない。複数の Windows PC を管理する企業のシステム管理者にとって、現実的に有効な対策は 1 つだけである。それは、すべての PC の管理者パスワードをそれぞれ異なるものに設定することである。

企業や官公庁のシステム管理の現状を考えてみる。大抵の企業や官公庁では、社員に支給する新しい PC を情報システム部門が初期設定する。Windows のイメージをコピーして sysprep することもあるし、Windows を 1 台ずつクリーンインストールすることもある。その際に、管理上の都合から、すべての PC に同一の管理者パスワードを設定することが常である。多くのシステム管理者は、パスワードとして複雑なものを設定しておけば、複数の PC で同一の管理者パスワードが設定されていても安心だと考えているためである。通常は、管理者パスワードの他に、その PC を主に使用する社員のアカウントを作成する。ドメインを利用している場合は、代わりにドメインへの参加の設定を行う。このようにして大量生産された各社員用の Windows PC は、すべて同一の管理者パスワードを持っている。そして企業内でファイル共有などを使用するため、あるいは管理上の都合から、Windows ファイアウォール上では SMB (CIFS) のポートは開放されている。PC を受け取った、ある好奇心旺盛な社員は、自分の席で夜にこっそりと自分用の PC の SAM データベースをダンプし、情報システム部門の共通の管理者アカウントの MD4 パスワードハッシュを取得する。すると、その社員は自分の PC だけでなく、社内のすべての PC で管理者権限を得る。本来、その社員がアクセスできない他の社員用の PC を完全にコントロールすることができる。それだけではなく、システム管理者が各 Windows PC に対して設定する管理者専用の Administrators 権限アカウントのパスワードと、業務用 Windows サーバーやドメインコントローラに設定する Administrators 権限アカウントのパスワードとは同一である可能性も高い。そうすれば、その好奇心旺盛な社員は、会社の業務用サーバーやドメインコントローラ上で Administrators 権限を得ることも容易く可能となる。

学校や大学におけるパソコン部屋もだいたい同等の現状である。50 台、100 台の PC が並んであり、ドメインに接続されている。各生徒はドメイン上の自分のアカウントでログインする。すると各 PC 上での一般ユーザーとしての権限が手に入る。好奇心旺盛な生徒は、一般ユーザーとしての権限では不満である。教師の目を盗んで放課後に 1 台の PC の HDD を、持ち込んだ自前のノート PC に USB-SATA アダプタを用いて接続し、SAM 上の管理者パスワードの MD4 ハッシュを抽出するに違いない。そして PC の HDD をバレないように元に戻しておく。その MD4 ハッシュを利用すれば、パソコン部屋にあるすべての PC (教師用の PC も含めて) に対して NTLMv2 認証を行うことで、管理者権限で RPC 接続することができる。その後は自分専用の隠し Administrators ユーザーを作成したり、rootkit をインストールしたり、他の生徒のログイン中またはログイン後に、移動プロファイルのローカルキャッシュを閲覧したりできる。

上記の例のように、企業や学校で導入されている多数の Windows PC は、その PC を手元で使用する好奇心旺盛な社員や生徒によって SAM データベースから MD4 パスワードが抽出される危険にさらされている。物理的な HDD は好奇心旺盛な社員や生徒の手の届く範囲にあるため、HDD を自前のノート PC に接続して MD4 パスワードを抜き出すことは、フリーウェアを使用すれば極めて簡単である。これを防ぐことは TPM 付きノート PC などで、BitLocker で C:\ ドライブをフル暗号化していない限りはほぼ困難である。例え BitLocker で C:\ ドライブを暗号化していても、PC が稼働中に Windows の SAM データベースから MD4 パスワードを抽出することは可能である。もしその PC で自分専用の Administrators 権限を持つユーザーアカウントを使用しているのであれば、普通に Windows のバックアップ機能を用いてシステムバックアップを作成すれば、起動中の Windows では本来アクセスが禁止されている SAM データベースをダンプすることが可能である。ただし、普段その PC を使用するとき、一般ユーザー権限しかない場合は、少し難しい。数ヶ月に 1 回程度、新たに発見される、Windows のローカル上で権限昇格が可能になるようなカーネル脆弱性の登場を待つ必要がある。そのような脆弱性が出れば、Windows Update を行う前に怪しいツールを使用して権限を昇格し、それからバックアップ機能を経由して SAM データベースをダンプできる。

まとめると、企業・官公庁・学校などで複数台の Windows PC を使用しており、各 PC の管理者パスワードが同一である場合は、その管理者パスワードを知らない一般社員が、自分の目の前にある PC の HDD から SAM データベースをダンプし、管理者パスワードの MD4 ハッシュを取得することができる。そしてその一般社員は、社内にある他の同一管理者パスワードが設定されている Windows PC に対して NTLMv2 認証を要求することができ、認証は必ず成功する。認証に成功した後はリモート経由でその PC に対していかなる操作も可能になる。

これを防ぐ方法は、すべての Windows PC の管理者パスワードを異なるものにすることである。原理的には 1 文字でもパスワードが異なっていれば、各パスワードの MD4 ハッシュは全く異なるものになり、他の PC への NTLMv2 認証に使用することはできなくなる。たとえば情報システム部門で共通のパスワード (これは長く複雑なものである必要がある) を決めておき、各 PC の管理者パスワードとしては、その共通のパスワードの末尾に PC の名前を付けたものを使用する、という程度でよい。この場合、MD4 ハッシュを 1 つ取得した攻撃者は、元のパスワードの平文を逆算することはできないから、すべての PC でたとえ 1 文字ずつしか違わないパスワードが使用されていても、セキュリティ上の問題は発生しない。

複数台の Windows PC を管理されている情報システム部門、学校のシステム管理者、顧客システムを保守するシステムインテグレータなどの方は、同一組織用のすべての PC に同一の管理者パスワードを設定しているというよくありがちな運用をしていないかどうか、改めて確認してみるべきである。レンタルサーバーやクラウド事業者は、複数の顧客に貸与している別々の Windowsインスタンスの管理者パスワードが同一である運用になっていないかどうか、よく確認してみるべきである。Windowsレンタルサーバーや VM サービスなどを契約すると、自分専用のアカウントのほか、クラウド事業者によるメンテナンス用として、既定で Administrators 権限のアカウントが登録されているものが見受けられる。たとえパスワードがとても長くても、これはとても危険なのでやめるべきである。異なる顧客間のインスタンス間がファイアウォールで区切られており、SMB ポートにアクセスできないから NTLMv2 認証がサーバー間でできない筈だと安心してはいけない。ファイアウォールの設定がおかしくなったときに、ある顧客が隣の顧客の VM に NTLMv2 認証をかけることができるようになってしまう。また NTLMv2 認証は SMB ポートが閉じられていれば使われないという訳ではない。IIS のユーザー認証機能には NTLMv2 認証があり、それを使う設定にすることは可能である。そこ経由で本来アクセスできない場所に他の顧客がアクセスできるようになってしまうかも知れない。



参考資料
Mitigating Pass-the-Hash (PtH) Attacks and Other Credential Theft Techniques (6/12/2013)
http://www.microsoft.com/en-us/download/details.aspx?id=36036



1 人でも好奇心旺盛な生徒がいれば、共通管理者パスワードの MD4 ハッシュをどれか 1 台の HDD から取得するだけで、パソコン教室の 50 台すべての Windows の管理者権限は簡単に取得できる。