Active Directoryのユーザー情報を効率的に収集する方法
こんにちは! この記事では、ネットワークペネトレーションテストやセキュリティ評価で広く利用されているPythonツールキット「Impacket」に含まれる便利なスクリプトの一つ、GetADUsers.py
に焦点を当てて解説します。Active Directory (AD) 環境において、ユーザー情報を列挙することは、攻撃経路の特定や権限昇格の可能性を探る上で非常に重要なステップです。GetADUsers.py
は、まさにそのための強力なツールです。
この記事を読めば、GetADUsers.py
の基本的な使い方から、様々な認証方法、便利なオプション、そして実際の使用例まで、幅広く理解できるようになります。さあ、始めましょう!
ImpacketとGetADUsers.pyとは?
Impacket は、ネットワークプロトコルを扱うためのPythonクラスのコレクションです。特にSMB/MSRPCなどのプロトコルに焦点を当てており、低レベルでのアクセスやプロトコル実装そのものを提供します。これにより、セキュリティ専門家はネットワーク攻撃や調査のためのカスタムツールを容易に開発できます。
GetADUsers.py
(または impacket-GetADUsers
) は、Impacketスイートに含まれる数多くのスクリプト(examples)の一つで、Active Directoryドメインに対してLDAPクエリを実行し、ユーザーアカウントに関する情報を収集するために設計されています。ユーザー名、説明、最終ログオン日時、パスワード最終設定日時などの属性を取得できます。これらの情報は、セキュリティ評価や侵入テストの初期偵察段階で非常に役立ちます。
GetADUsers.py
は、基本的にドメインコントローラーに対してLDAPクエリを発行することで情報を収集します。したがって、実行にはドメインへのアクセス権(有効なドメインユーザー認証情報など)が必要です。
準備するもの (前提条件)
GetADUsers.py
を使用するには、以下の準備が必要です。
- Python環境: ImpacketはPythonで書かれているため、Pythonインタプリタが必要です。Python 3.xが推奨されます。
- Impacketのインストール: まだインストールしていない場合は、Impacketをインストールする必要があります。通常、pipを使用して簡単にインストールできます。 または、GitHubリポジトリからクローンしてセットアップすることも可能です。 Kali Linuxなど、一部のディストリビューションではプリインストールされているか、パッケージマネージャー (`apt install python3-impacket` など) でインストールできます。
- ドメイン認証情報: Active Directoryから情報を取得するためには、ドメインへのアクセス権を持つアカウントの認証情報(ユーザー名とパスワード、またはNTLMハッシュ、Kerberosチケットなど)が必要です。必ずしも管理者権限は必要ありませんが、情報を照会できる権限が必要です。
- ネットワークアクセス: スクリプトを実行するマシンから、ターゲットドメインのドメインコントローラー(DC)へネットワーク経由(通常はLDAP/LDAPSポート: 389/636)でアクセスできる必要があります。ファイアウォール設定などを確認してください。
基本的な使い方
GetADUsers.py
の最も基本的なコマンド形式は以下のようになります。
各部分を解説します。
-
impacket-GetADUsers
(またはpython3 GetADUsers.py
): スクリプトを実行するコマンドです。環境によってはパスの指定が必要な場合があります。 -
<ドメイン>/<ユーザー名>[:<パスワード>]
: ターゲットとなるActive Directoryドメインと、認証に使用するユーザーアカウントの情報を指定します。<ドメイン>
: ドメイン名(例:CONTOSO.local
やCONTOSO
)。<ユーザー名>
: ドメインユーザー名(例:alice
)。[:<パスワード>]
: ユーザーのパスワード。コロン(:
)に続けて指定します。省略した場合、通常はプロンプトが表示されてパスワードの入力を求められます。
-
-dc-ip <DCのIPアドレス>
: ターゲットとするドメインコントローラーのIPアドレスを指定します。ドメイン名からDNSで解決できない場合や、特定のDCに問い合わせたい場合に必須です。 -
-all
: このオプションを指定すると、メールアドレスを持たないユーザーや無効化されたアカウントを含む、すべてのユーザー情報を取得しようとします。通常はこのオプションを指定することが推奨されます。なぜなら、デフォルトではメールアドレスを持つアカウントのみを検索するフィルター ((&(sAMAccountName=*)(mail=*))
) が適用されるため、メールアドレスが設定されていないユーザーが多い環境では、-all
をつけないとほとんど結果が返ってこない可能性があるからです。
認証方法の選択肢
GetADUsers.py
では、いくつかの認証方法を利用できます。
1. パスワード認証 (デフォルト)
最も基本的な方法です。ユーザー名とパスワードを直接指定します。
2. NTLMハッシュ認証
パスワードの代わりにNTLMハッシュ(LMハッシュは通常空で、NTHASHのみ)を使用して認証します(Pass-the-Hash)。-hashes
オプションを使用します。
例: NTHASHが aad3b435b51404eeaad3b435b51404ee
の場合
-no-pass
オプションを併用すると、パスワードの入力を求められなくなります。
3. Kerberos認証
有効なKerberosチケット(通常は TGT: Ticket Granting Ticket)があれば、それを利用して認証できます。-k
オプションを使用します。Impacketは環境変数 KRB5CCNAME
で指定されたキャッシュファイル(ccache)からチケットを探します。
AESキー(-aesKey
オプション)を直接指定してKerberos認証を行うことも可能です。
主要なオプション一覧
GetADUsers.py
には様々なオプションがあり、挙動を細かく制御できます。以下に主要なものを表にまとめます。(バージョンによってオプションが異なる場合があります。最新の情報は impacket-GetADUsers -h
で確認してください。)
オプション | 説明 |
---|---|
target (位置引数) |
ターゲット指定。形式: domain/username[:password] |
-h, --help |
ヘルプメッセージを表示して終了します。 |
-all |
メールアドレスがないユーザーや無効化されたアカウントを含むすべてのユーザーを取得します。推奨オプション。 |
-user <username> |
特定のユーザーに関するデータのみを要求します。 |
-ts |
すべてのログ出力にタイムスタンプを追加します。 |
-debug |
デバッグ出力を有効にします。LDAPフィルターなどを確認するのに役立ちます。 |
-dc-ip <ip address> |
接続先のドメインコントローラーのIPアドレスを指定します。省略した場合、ターゲットのドメイン部分(FQDN)から解決しようとします。 |
-dc-host <hostname> |
接続先のドメインコントローラーのホスト名を指定します。Kerberos認証などでSPNを正しく指定する際に役立つことがあります。 |
-hashes <LMHASH:NTHASH> |
NTLMハッシュ(形式: LMHASH:NTHASH)を使用して認証します。 |
-no-pass |
パスワードの入力を求めません(-k や -hashes と共に使用)。 |
-k |
Kerberos認証を使用します。環境変数 KRB5CCNAME のチケットキャッシュを使用します。 |
-aesKey <hex key> |
Kerberos認証に使用するAESキー(128ビットまたは256ビット)を16進数で指定します。 |
-use-ldaps |
LDAPS(LDAP over SSL/TLS、通常ポート636)を使用して接続します。(このオプションの有無はImpacketのバージョンによる可能性があります) |
実践的な使用例
例1: パスワード認証で全ユーザーを取得 (パスワードはプロンプト入力)
実行するとパスワードの入力を求められます。
例2: NTLMハッシュ認証で全ユーザーを取得
svc_account
ユーザーのNTLMハッシュ (0123456789abcdef0123456789abcdef
) を使って認証します。
例3: Kerberosチケット認証で全ユーザーを取得
まず、getTGT.py
などでチケットを取得し、キャッシュファイル(例: /tmp/krb5cc_user
)に保存します。
例4: 特定のユーザーの情報のみを取得
authuser
で認証し、targetuser
の情報を取得します。この場合、-all
は必須ではありませんが、targetuser
が無効化されている場合などに情報を取得するには -all
が必要になることがあります。
例5: 結果をファイルに保存
標準出力をリダイレクトするか、tee
コマンドを使います。
出力はタブ区切り形式(TSV)なので、スプレッドシートソフトなどで扱いやすいです。
出力される情報と活用方法
GetADUsers.py
はデフォルトで以下のような情報をタブ区切りで出力します。
- Name: sAMAccountName (ユーザーログオン名)
- Email: mail 属性 (メールアドレス)
- PasswordLastSet: pwdLastSet 属性 (パスワード最終設定日時)
- LastLogon: lastLogonTimestamp 属性 (最終ログオン日時 – ドメイン内で複製される属性)
- (スクリプトのバージョンや変更によっては他の属性、例えば Description などが含まれることもあります)
これらの情報は以下のように活用できます。
- ユーザーアカウントの把握: ドメイン内に存在するアクティブな(または無効化された)ユーザーアカウントのリストを作成します。
- 命名規則の推測: ユーザー名のリストから、アカウント名の命名規則(例: 姓+名、名.姓など)を推測し、他の潜在的なユーザー名を予測するのに役立ちます。
- 休眠アカウントの特定:
LastLogon
の情報から、長期間使用されていないアカウント(休眠アカウント)を特定できます。これらはセキュリティリスクとなる可能性があります。 - パスワードポリシーの推測:
PasswordLastSet
の情報から、パスワードの有効期限ポリシー(例: 90日ごとに変更が必要など)を間接的に推測できる場合があります。 - ターゲットの絞り込み: ユーザー名や説明(description属性などが取得できれば)から、特定の役割を持つアカウント(サービスアカウント、管理者アカウントなど)を特定し、さらなる調査や攻撃のターゲットを絞り込むのに役立ちます。
- 他のツールへの入力: 得られたユーザーリストは、パスワードスプレー攻撃ツールや、他の列挙ツール(例: Kerbrute)への入力として利用できます。
GetADUsers.py
) を直接編集することで、取得するLDAP属性を変更・追加することも可能です。例えば、description
や userAccountControl
などの属性を追加して、より詳細な情報を取得するようにカスタマイズできます。
セキュリティ上の注意点と対策
GetADUsers.py
は非常に便利なツールですが、攻撃者によって悪用される可能性もあります。以下の点に注意が必要です。
- 不正な情報収集: 攻撃者がドメインへのアクセス権限を不正に取得した場合、このツールを使ってドメイン内のユーザー情報を根こそぎ収集し、さらなる攻撃(パスワードスプレー、フィッシングなど)に利用する可能性があります。
- LDAPクエリの監視: 大量または異常なLDAPクエリは、偵察活動の兆候である可能性があります。セキュリティ監視システム(SIEMなど)でドメインコントローラーへのLDAPクエリを監視し、不審なアクティビティを検出することが重要です。
- アカウント権限の最小化: LDAPクエリを実行できるアカウントであっても、必要最小限の権限のみを付与するべきです。特に、機密性の高い属性へのアクセスは制限するべきです。
- 強力なパスワードポリシーと多要素認証: ユーザーアカウントの侵害を防ぐ基本的な対策として、強力なパスワードポリシーの施行と、可能な限り多要素認証(MFA)を導入することが重要です。
- 休眠アカウントの管理: 定期的に休眠アカウントを確認し、不要なアカウントは無効化または削除するプロセスを確立します。
ペネトレーションテストやレッドチーム演習で GetADUsers.py
を使用する際は、必ず事前に許可を得て、倫理的な範囲内で実施してください。
まとめ
impacket-GetADUsers
(GetADUsers.py
) は、Active Directory環境におけるユーザー情報の列挙を効率的に行うための強力なスクリプトです。パスワード、NTLMハッシュ、Kerberosチケットといった様々な認証方法に対応し、-all
オプションを使用することで包括的なユーザーリストを取得できます。
収集した情報は、ペネトレーションテストやセキュリティ評価における偵察活動、攻撃対象の特定、さらなる攻撃計画の立案に不可欠です。しかし、その強力さゆえに攻撃者による悪用リスクも存在するため、適切なセキュリティ監視と対策が重要となります。
この記事が、GetADUsers.py
の理解と適切な活用の一助となれば幸いです。安全で効果的なセキュリティ活動のために、ツールの能力とリスクを正しく理解しましょう!