はじめに:LAPS とは? なぜ重要なのか?
現代の企業ネットワーク環境では、多数の Windows コンピューターを管理する必要があります。それぞれのコンピューターにはローカル管理者アカウントが存在しますが、これらすべてのアカウントに同じパスワードを設定することは、セキュリティ上大きなリスクとなります 😥。もし一つのパスワードが漏洩した場合、ネットワーク内のすべてのコンピューターが危険に晒される可能性があるからです。
この問題を解決するために Microsoft が提供しているのが、LAPS (Local Administrator Password Solution) です。LAPS は、Active Directory (AD) ドメインに参加している各 Windows コンピューターのローカル管理者アカウントに対して、ユニークで複雑なパスワードを自動的に生成し、定期的に変更(ローテーション)する仕組みを提供します。そして、生成されたパスワードは Active Directory のコンピューターオブジェクト内の特定の属性(通常は ms-Mcs-AdmPwd
)に安全に保存されます。これにより、管理者は必要に応じて AD からパスワードを取得でき、セキュリティリスクを大幅に低減できます。
LAPS は、特に以下のようなメリットをもたらします:
- セキュリティの向上: 各コンピューターで異なる、強力なパスワードを使用することで、Pass-the-Hash などのラテラルムーブメント(横展開)攻撃のリスクを低減します。
- 管理の簡素化: パスワードの生成とローテーションを自動化し、管理者の負担を軽減します。
- 監査証跡: パスワードへのアクセスは AD の権限に基づいて制御され、アクセスログを監査できます。
2023年4月以降の更新プログラムが適用された Windows 10, 11, Windows Server 2019, 2022 では、OS に組み込まれた新しい Windows LAPS が利用可能になり、Microsoft Entra ID (旧 Azure AD) へのパスワードバックアップやパスワード暗号化などの機能が追加されています。従来の LAPS (レガシー LAPS とも呼ばれます) とは異なる機能を持つため注意が必要です。
Impacket と impacket-GetLAPSPassword の紹介
Impacket は、ネットワークプロトコルの操作に特化した Python クラスのコレクションです。元々は SecureAuth によって開発・保守され、現在は Fortra (旧 Core Security) が管理しています。SMB, MSRPC, Kerberos, LDAP など、さまざまなプロトコルを低レベルで操作したり、高レベルな実装を利用したりすることが可能です。ペネトレーションテストやセキュリティ研究において広く利用されており、多くの便利なスクリプトツールが含まれています。
その Impacket に含まれるスクリプトの一つが impacket-GetLAPSPassword
です (GitHub 上のスクリプト名は `GetLAPSPassword.py`)。このツールは、Active Directory に対して LDAP クエリを実行し、指定したコンピューターまたは権限のあるすべてのコンピューターの LAPS パスワード (ms-Mcs-AdmPwd
属性) や、新しい Windows LAPS のパスワード情報 (msLAPS-Password
や暗号化された msLAPS-EncryptedPassword
など) を取得するために使用されます。
このツールは、適切な権限を持つユーザーアカウントを使用することで、Active Directory から LAPS パスワード情報を効率的に収集することができます。ペネトレーションテストの内部ネットワーク調査フェーズなどで、ドメインの権限を奪取した後、さらにアクセス範囲を広げる目的で利用されることがあります。✨
⚠️ 利用前の前提条件
impacket-GetLAPSPassword
を使用するには、いくつかの前提条件を満たす必要があります。
1. LAPS が環境内で有効になっていること
当然ながら、対象の Active Directory 環境で LAPS (レガシー LAPS または Windows LAPS) が導入・設定されている必要があります。LAPS はデフォルトでは有効になっていません。グループポリシー (GPO) などを利用して、クライアントコンピューターに LAPS クライアント側拡張機能 (CSE) を展開し、パスワードの保存場所 (AD または Entra ID)、パスワードポリシー (複雑性、長さ、有効期間など) を設定する必要があります。
2. 必要な Active Directory アクセス権限
impacket-GetLAPSPassword
を実行するユーザーアカウントには、対象コンピューターオブジェクトの LAPS パスワード属性に対する読み取り権限が必要です。
- レガシー LAPS:
ms-Mcs-AdmPwd
属性およびms-Mcs-AdmPwdExpirationTime
属性に対する読み取り権限。 - Windows LAPS (AD):
- クリアテキストパスワードの場合:
msLAPS-Password
属性およびmsLAPS-PasswordExpirationTime
属性に対する読み取り権限。 - 暗号化パスワードの場合:
msLAPS-EncryptedPassword
,msLAPS-EncryptedPasswordHistory
,msLAPS-PasswordExpirationTime
属性などに対する読み取り権限、およびパスワードを復号するための権限。復号権限は通常、特定のグループ (例: Domain Admins) や、GPO で指定されたユーザー/グループに与えられます。
- クリアテキストパスワードの場合:
これらの権限は、通常、Set-LapsADReadPasswordPermission
(Windows LAPS PowerShell モジュール) や Find-LapsADExtendedRights
、または手動で Active Directory の委任ウィザードや `dsacls` コマンドなどを使用して設定されます。デフォルトでは Domain Admins グループなどがこれらの権限を持っていますが、セキュリティのベストプラクティスとして、必要最小限の権限を特定のヘルプデスクグループなどに委任することが推奨されます。
3. Impacket のインストール
Impacket が実行環境にインストールされている必要があります。Python のパッケージマネージャー `pip` を使用してインストールするのが一般的です。
pip install impacket
または、最新版や開発版を使用したい場合は、GitHub リポジトリからクローンしてインストールすることも可能です。
git clone https://github.com/fortra/impacket.git
cd impacket
pip install .
Kali Linux などのペネトレーションテスト用ディストリビューションには、`impacket-scripts` パッケージとしてプリインストールされていることが多いです。
sudo apt update && sudo apt install impacket-scripts
(注: パッケージ名はディストリビューションによって異なる場合があります)
基本的な使い方 🖥️
impacket-GetLAPSPassword
の基本的なコマンド構文は以下のようになります。
impacket-GetLAPSPassword <DOMAIN>/<USER>[:<PASSWORD>] -targetComputer <COMPUTER_NAME> -dc-ip <DC_IP_ADDRESS>
各部分の説明です:
<DOMAIN>/<USER>[:<PASSWORD>]
: Active Directory への接続に使用するユーザーアカウント情報。ドメイン名、ユーザー名、そしてパスワードを指定します。パスワード部分を省略すると、実行時に入力を求められます。-targetComputer <COMPUTER_NAME>
: LAPS パスワードを取得したいコンピューターの NetBIOS 名 (例:WKSTN-01
) または FQDN (例:wkstn-01.corp.local
) を指定します。末尾の `$` は不要です。-dc-ip <DC_IP_ADDRESS>
: 接続先のドメインコントローラーの IP アドレスを指定します。これを省略すると、ドメイン名から DNS で解決しようとします。
実行例:
ドメイン `CORP.LOCAL` のユーザー `HelpDeskUser` (パスワード: `P@ssw0rd123`) を使って、コンピューター `CLIENTPC-05` の LAPS パスワードを、ドメインコントローラー `192.168.1.10` から取得する場合:
impacket-GetLAPSPassword 'CORP.LOCAL/HelpDeskUser:P@ssw0rd123' -targetComputer CLIENTPC-05 -dc-ip 192.168.1.10
パスワードをインタラクティブに入力する場合:
impacket-GetLAPSPassword CORP.LOCAL/HelpDeskUser -targetComputer CLIENTPC-05 -dc-ip 192.168.1.10
Password:
成功すると、以下のような形式で結果が出力されます (表示される情報は LAPS のバージョンや設定により異なります)。
Impacket v0.12.0 - Copyright 2023 Fortra
Host LAPS Username LAPS Password LAPS Password Expiration LAPSv2
----------- --------------- ------------------------------------ ------------------------- -------
CLIENTPC-05$ N/A S0meC0mpl3xP@ssw0rd! 2025-05-15 10:30:00 False
上記の例では、レガシー LAPS (LAPSv2 が False) のパスワードが表示されています。Windows LAPS で暗号化されている場合は、復号可能な権限があれば復号されたパスワードが表示されます。`LAPS Username` は Windows LAPS で管理対象アカウント名を指定した場合に表示されることがあります。
認証方法と主要オプション
impacket-GetLAPSPassword
は、パスワード認証以外にもいくつかの認証方法をサポートしています。また、便利なオプションも用意されています。
認証オプション
オプション | 説明 | 例 |
---|---|---|
<DOMAIN>/<USER>:<PASSWORD> |
標準的なパスワード認証 (前述)。 | CORP.LOCAL/User:Pass123 |
-hashes <LM_HASH>:<NT_HASH> |
NTLM ハッシュ (Pass-the-Hash) を使用して認証します。LM ハッシュは通常空なので、aad3b435b51404eeaad3b435b51404ee:HASH_VALUE のように指定します。 |
-hashes :5d8a487f316a7a4e1a44c1d8e9f31473 |
-no-pass |
パスワードやハッシュを指定せずに認証を試みます。主に Kerberos 認証 (-k ) と組み合わせて使用され、現在のユーザーの Kerberos チケットキャッシュ (ccache) を利用します。 |
-k -no-pass |
-k |
Kerberos 認証を使用します。環境変数 KRB5CCNAME で指定された ccache ファイルから資格情報を取得しようとします。見つからない場合や無効な場合は、コマンドラインで指定された認証情報(パスワードや -aesKey )を使用します。-dc-ip または -dc-host で KDC を指定することが推奨されます。 |
-k -dc-ip 192.168.1.10 |
-aesKey <HEX_KEY> |
Kerberos 認証用の AES キー (128 ビットまたは 256 ビット) を 16 進数形式で指定します (Pass-the-Key)。 | -aesKey a1b2c3d4... |
主要な一般オプション
オプション | 説明 |
---|---|
-computer <computername> |
特定のコンピューターの LAPS パスワードを取得します (-targetComputer と同義)。 |
-all (または --all-computers ) |
(このオプションは `GetLAPSPassword.py` の最新版には明示的に存在しない可能性があります。類似の機能を持つスクリプトや別バージョンに存在するか、将来追加される可能性があります。通常は `ldapsearch` などで対象コンピュータリストを取得し、ループで `-computer` を指定して実行します。) もし実装されていれば、実行ユーザーが読み取り権限を持つすべてのコンピューターの LAPS パスワードを取得しようと試みます。大規模な環境では大量の結果が返る可能性があるため注意が必要です。 |
-ts |
ログ出力にタイムスタンプを追加します。デバッグ時に役立ちます。 |
-debug |
デバッグモードを有効にし、詳細な動作ログを出力します。問題解決に役立ちます。 |
-outputfile <OUTPUTFILE> |
結果を表形式で指定したファイルに出力します。ファイル形式はタブ区切りになることが多いです。 |
-dc-host <hostname> |
接続先のドメインコントローラーのホスト名を指定します。-dc-ip の代わりに使用できます。 |
-h, --help |
ヘルプメッセージを表示して終了します。利用可能なすべてのオプションを確認できます。 |
NTLM ハッシュを使用した実行例:
impacket-GetLAPSPassword CORP.LOCAL/AdminUser -hashes :0123456789abcdef0123456789abcdef -targetComputer SERVER01 -dc-ip 192.168.1.10
Kerberos チケットキャッシュを使用した実行例:
export KRB5CCNAME=/tmp/user.ccache
kinit User@CORP.LOCAL
impacket-GetLAPSPassword CORP.LOCAL/User -k -no-pass -targetComputer CLIENTPC-10 -dc-ip 192.168.1.10
セキュリティ上の考慮事項と倫理的利用 🔒
impacket-GetLAPSPassword
は非常に強力なツールですが、その利用には細心の注意が必要です。
- 正規の権限: このツールを使用する際は、必ず対象となる Active Directory 環境およびコンピューターに対する正当なアクセス権限を持っていることを確認してください。許可なく他者のシステムやネットワークにアクセスし、情報を取得することは違法行為であり、重大な結果を招く可能性があります。
- 目的の明確化: ペネトレーションテストやセキュリティ監査など、明確で正当な目的のためにのみ使用してください。悪意を持った利用は絶対に行わないでください。
- ログ記録と検出: Active Directory やドメインコントローラーでは、LDAP クエリや特定の属性へのアクセスがログに記録される可能性があります。特に、LAPS パスワード属性 (
ms-Mcs-AdmPwd
,msLAPS-Password
など) へのアクセスは監査対象として設定されていることが多いです。不審なアクティビティとして検出される可能性があることを認識しておきましょう。Windows LAPS ではパスワードの読み取りイベントなどもログ記録できます。 - 権限管理の重要性: このツールが悪用されるリスクを低減するためには、Active Directory における LAPS パスワード属性へのアクセス権限を適切に管理し、必要最小限のユーザーやグループにのみ権限を付与することが極めて重要です。定期的な権限の見直しも推奨されます。
- Windows LAPS の暗号化: 可能であれば、Windows LAPS のパスワード暗号化機能を利用し、ドメイン機能レベルを 2016 以上に設定することで、パスワードが平文で AD に保存されるリスクを回避できます。
警告: この情報は教育およびセキュリティ意識向上の目的でのみ提供されます。記載されたツールや技術を許可なくシステムに使用することは、法律や規則に違反する可能性があります。常に倫理的な基準と法的要件を遵守してください。
まとめ
impacket-GetLAPSPassword
は、Impacket スイートに含まれる便利なツールであり、Active Directory 環境に LAPS が導入されている場合に、ローカル管理者パスワードを効率的に取得する手段を提供します。ペネトレーションテスターやシステム管理者にとって、ネットワーク内のアクセス権限を確認したり、セキュリティ体制を評価したりする上で役立ちます。
しかし、その強力さゆえに、利用には適切な権限と倫理観が不可欠です。LAPS パスワードへのアクセス権限を適切に管理し、不審なアクセスがないか監視することが、組織全体のセキュリティを維持する上で重要となります。Windows LAPS の導入やパスワード暗号化機能の利用も、セキュリティ強化に貢献します。
このツールを正しく理解し、責任ある方法で使用することで、Active Directory 環境のセキュリティ評価や管理に役立ててください。👍
コメント