ImpacketのGetADUsers.py スクリプト徹底解説

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を使用して簡単にインストールできます。
    pip install impacket
    または、GitHubリポジトリからクローンしてセットアップすることも可能です。
    git clone https://github.com/fortra/impacket.git
    cd impacket
    pip install .
    Kali Linuxなど、一部のディストリビューションではプリインストールされているか、パッケージマネージャー (`apt install python3-impacket` など) でインストールできます。
  • ドメイン認証情報: Active Directoryから情報を取得するためには、ドメインへのアクセス権を持つアカウントの認証情報(ユーザー名とパスワード、またはNTLMハッシュ、Kerberosチケットなど)が必要です。必ずしも管理者権限は必要ありませんが、情報を照会できる権限が必要です。
  • ネットワークアクセス: スクリプトを実行するマシンから、ターゲットドメインのドメインコントローラー(DC)へネットワーク経由(通常はLDAP/LDAPSポート: 389/636)でアクセスできる必要があります。ファイアウォール設定などを確認してください。

基本的な使い方

GetADUsers.py の最も基本的なコマンド形式は以下のようになります。

impacket-GetADUsers <ドメイン>/<ユーザー名>[:<パスワード>] -dc-ip <DCのIPアドレス> -all

各部分を解説します。

  • impacket-GetADUsers (または python3 GetADUsers.py): スクリプトを実行するコマンドです。環境によってはパスの指定が必要な場合があります。
  • <ドメイン>/<ユーザー名>[:<パスワード>]: ターゲットとなるActive Directoryドメインと、認証に使用するユーザーアカウントの情報を指定します。
    • <ドメイン>: ドメイン名(例: CONTOSO.localCONTOSO)。
    • <ユーザー名>: ドメインユーザー名(例: alice)。
    • [:<パスワード>]: ユーザーのパスワード。コロン(:)に続けて指定します。省略した場合、通常はプロンプトが表示されてパスワードの入力を求められます。
  • -dc-ip <DCのIPアドレス>: ターゲットとするドメインコントローラーのIPアドレスを指定します。ドメイン名からDNSで解決できない場合や、特定のDCに問い合わせたい場合に必須です。
  • -all: このオプションを指定すると、メールアドレスを持たないユーザーや無効化されたアカウントを含む、すべてのユーザー情報を取得しようとします。通常はこのオプションを指定することが推奨されます。なぜなら、デフォルトではメールアドレスを持つアカウントのみを検索するフィルター ((&(sAMAccountName=*)(mail=*))) が適用されるため、メールアドレスが設定されていないユーザーが多い環境では、-all をつけないとほとんど結果が返ってこない可能性があるからです。
注意: プレーンテキストのパスワードをコマンドライン引数として直接指定するのは、履歴ファイルなどに残るためセキュリティリスクがあります。可能であれば、パスワード入力を求めるプロンプトを使用するか、後述するハッシュやKerberos認証を利用することを検討してください。

認証方法の選択肢

GetADUsers.py では、いくつかの認証方法を利用できます。

1. パスワード認証 (デフォルト)

最も基本的な方法です。ユーザー名とパスワードを直接指定します。

# パスワードを引数で指定
impacket-GetADUsers CONTOSO.local/alice:Password123 -dc-ip 192.168.1.100 -all

# パスワードをプロンプトで入力 (-no-pass は付けない)
impacket-GetADUsers CONTOSO.local/alice -dc-ip 192.168.1.100 -all

2. NTLMハッシュ認証

パスワードの代わりにNTLMハッシュ(LMハッシュは通常空で、NTHASHのみ)を使用して認証します(Pass-the-Hash)。-hashes オプションを使用します。

impacket-GetADUsers CONTOSO.local/bob -hashes :<NTHASHの値> -dc-ip 192.168.1.100 -all

例: NTHASHが aad3b435b51404eeaad3b435b51404ee の場合

impacket-GetADUsers CONTOSO.local/bob -hashes :aad3b435b51404eeaad3b435b51404ee -dc-ip 192.168.1.100 -all

-no-pass オプションを併用すると、パスワードの入力を求められなくなります。

impacket-GetADUsers CONTOSO.local/bob -hashes :aad3b435b51404eeaad3b435b51404ee -dc-ip 192.168.1.100 -all -no-pass

3. Kerberos認証

有効なKerberosチケット(通常は TGT: Ticket Granting Ticket)があれば、それを利用して認証できます。-k オプションを使用します。Impacketは環境変数 KRB5CCNAME で指定されたキャッシュファイル(ccache)からチケットを探します。

# 環境変数 KRB5CCNAME に有効なチケットキャッシュファイルが設定されている場合
export KRB5CCNAME=/tmp/bob.ccache
impacket-GetADUsers CONTOSO.local/bob -k -no-pass -dc-ip 192.168.1.100 -all

AESキー(-aesKey オプション)を直接指定してKerberos認証を行うことも可能です。

impacket-GetADUsers CONTOSO.local/charlie -aesKey <AESキーの16進数文字列> -no-pass -dc-ip 192.168.1.100 -all

主要なオプション一覧

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: パスワード認証で全ユーザーを取得 (パスワードはプロンプト入力)

impacket-GetADUsers MYDOMAIN.local/testuser -dc-ip 10.0.0.5 -all

実行するとパスワードの入力を求められます。

例2: NTLMハッシュ認証で全ユーザーを取得

impacket-GetADUsers MYDOMAIN.local/svc_account -hashes :0123456789abcdef0123456789abcdef -dc-ip 10.0.0.5 -all -no-pass

svc_account ユーザーのNTLMハッシュ (0123456789abcdef0123456789abcdef) を使って認証します。

例3: Kerberosチケット認証で全ユーザーを取得

まず、getTGT.py などでチケットを取得し、キャッシュファイル(例: /tmp/krb5cc_user)に保存します。

export KRB5CCNAME=/tmp/krb5cc_user
impacket-GetADUsers MYDOMAIN.local/user -k -no-pass -dc-ip 10.0.0.5 -all

例4: 特定のユーザーの情報のみを取得

impacket-GetADUsers MYDOMAIN.local/authuser:Password! -dc-ip 10.0.0.5 -user targetuser

authuser で認証し、targetuser の情報を取得します。この場合、-all は必須ではありませんが、targetuser が無効化されている場合などに情報を取得するには -all が必要になることがあります。

例5: 結果をファイルに保存

標準出力をリダイレクトするか、tee コマンドを使います。

impacket-GetADUsers MYDOMAIN.local/reporter:P@ssword -dc-ip 10.0.0.5 -all > ad_users.txt

# 画面にも表示しつつファイルにも保存
impacket-GetADUsers MYDOMAIN.local/reporter:P@ssword -dc-ip 10.0.0.5 -all | tee ad_users.tsv

出力はタブ区切り形式(TSV)なので、スプレッドシートソフトなどで扱いやすいです。

出力される情報と活用方法

GetADUsers.py はデフォルトで以下のような情報をタブ区切りで出力します。

  • Name: sAMAccountName (ユーザーログオン名)
  • Email: mail 属性 (メールアドレス)
  • PasswordLastSet: pwdLastSet 属性 (パスワード最終設定日時)
  • LastLogon: lastLogonTimestamp 属性 (最終ログオン日時 – ドメイン内で複製される属性)
  • (スクリプトのバージョンや変更によっては他の属性、例えば Description などが含まれることもあります)

これらの情報は以下のように活用できます。

  • ユーザーアカウントの把握: ドメイン内に存在するアクティブな(または無効化された)ユーザーアカウントのリストを作成します。
  • 命名規則の推測: ユーザー名のリストから、アカウント名の命名規則(例: 姓+名、名.姓など)を推測し、他の潜在的なユーザー名を予測するのに役立ちます。
  • 休眠アカウントの特定: LastLogon の情報から、長期間使用されていないアカウント(休眠アカウント)を特定できます。これらはセキュリティリスクとなる可能性があります。
  • パスワードポリシーの推測: PasswordLastSet の情報から、パスワードの有効期限ポリシー(例: 90日ごとに変更が必要など)を間接的に推測できる場合があります。
  • ターゲットの絞り込み: ユーザー名や説明(description属性などが取得できれば)から、特定の役割を持つアカウント(サービスアカウント、管理者アカウントなど)を特定し、さらなる調査や攻撃のターゲットを絞り込むのに役立ちます。
  • 他のツールへの入力: 得られたユーザーリストは、パスワードスプレー攻撃ツールや、他の列挙ツール(例: Kerbrute)への入力として利用できます。

セキュリティ上の注意点と対策

GetADUsers.py は非常に便利なツールですが、攻撃者によって悪用される可能性もあります。以下の点に注意が必要です。

  • 不正な情報収集: 攻撃者がドメインへのアクセス権限を不正に取得した場合、このツールを使ってドメイン内のユーザー情報を根こそぎ収集し、さらなる攻撃(パスワードスプレー、フィッシングなど)に利用する可能性があります。
  • LDAPクエリの監視: 大量または異常なLDAPクエリは、偵察活動の兆候である可能性があります。セキュリティ監視システム(SIEMなど)でドメインコントローラーへのLDAPクエリを監視し、不審なアクティビティを検出することが重要です。
  • アカウント権限の最小化: LDAPクエリを実行できるアカウントであっても、必要最小限の権限のみを付与するべきです。特に、機密性の高い属性へのアクセスは制限するべきです。
  • 強力なパスワードポリシーと多要素認証: ユーザーアカウントの侵害を防ぐ基本的な対策として、強力なパスワードポリシーの施行と、可能な限り多要素認証(MFA)を導入することが重要です。
  • 休眠アカウントの管理: 定期的に休眠アカウントを確認し、不要なアカウントは無効化または削除するプロセスを確立します。

ペネトレーションテストやレッドチーム演習で GetADUsers.py を使用する際は、必ず事前に許可を得て、倫理的な範囲内で実施してください。

まとめ

impacket-GetADUsers (GetADUsers.py) は、Active Directory環境におけるユーザー情報の列挙を効率的に行うための強力なスクリプトです。パスワード、NTLMハッシュ、Kerberosチケットといった様々な認証方法に対応し、-all オプションを使用することで包括的なユーザーリストを取得できます。

収集した情報は、ペネトレーションテストやセキュリティ評価における偵察活動、攻撃対象の特定、さらなる攻撃計画の立案に不可欠です。しかし、その強力さゆえに攻撃者による悪用リスクも存在するため、適切なセキュリティ監視と対策が重要となります。

この記事が、GetADUsers.py の理解と適切な活用の一助となれば幸いです。安全で効果的なセキュリティ活動のために、ツールの能力とリスクを正しく理解しましょう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です