はじめに:impacketとdcomexec
ネットワークペネトレーションテストやレッドチーム活動において、Windows環境内での横展開(Lateral Movement)は重要なステップです。取得した認証情報(パスワード、NTLMハッシュ、Kerberosチケットなど)を利用して、他のマシンへのアクセスを獲得し、最終的な目標達成を目指します。この横展開を実現するためのツールは数多く存在しますが、その中でもPython製の強力なツールキット「Impacket」に含まれるスクリプト群は広く利用されています。
今回解説する dcomexec.py
(または impacket-dcomexec
) は、Impacketに含まれるツールのひとつであり、MicrosoftのDistributed Component Object Model (DCOM) を悪用してリモートシステム上でコマンドを実行します。DCOMは、ネットワーク上の異なるコンピュータで動作するソフトウェアコンポーネント間で通信するためのプロトコルおよびインターフェースです。正規の機能ですが、攻撃者によってリモートコード実行(RCE)のために悪用されることがあります。
dcomexec
は、特に他の一般的なリモート実行手法(PsExecのようなSMB/RPCベースの手法など)がファイアウォールやセキュリティ製品によってブロックされている場合に代替手段として有効です。この記事では、dcomexec
の基本的な使い方から、応用的なテクニック、そして防御策までを詳しく解説していきます。💡
⚠️ 注意: このツールは、許可されたペネトレーションテストやセキュリティ評価の目的でのみ使用してください。不正アクセスや悪意のある目的での使用は法律で禁止されており、重大な結果を招く可能性があります。
DCOMとは何か? 🤔
dcomexec
の仕組みを理解するためには、まずDCOMについて知る必要があります。DCOM (Distributed Component Object Model) は、ネットワーク上の異なるプロセス間でCOM (Component Object Model) オブジェクトをインスタンス化し、そのメソッドを呼び出すことを可能にするMicrosoftの技術です。簡単に言えば、ネットワーク越しにプログラムの部品(オブジェクト)を操作するための仕組みです。
Windowsの多くの正規機能(WMIなど)が内部的にDCOMを利用しています。クライアントはリモートマシンのTCPポート135 (RPC Endpoint Mapper) に接続し、特定のDCOMアプリケーション(サーバー)への接続を要求します。Endpoint Mapperは、要求されたDCOMサーバーがリッスンしている動的なRPCポート番号をクライアントに返し、クライアントはそのポートを使用してDCOMサーバーと直接通信を開始します。
攻撃者は、この仕組みを利用して、特定のDCOMオブジェクト(例えば、ShellWindows
, ShellBrowserWindow
, MMC20.Application
など)をリモートでインスタンス化し、そのオブジェクトが持つメソッド(例えば、ファイル操作やプロセス実行に関連するもの)を呼び出すことで、ターゲットシステム上で任意のコマンドを実行しようとします。dcomexec
は、これらのプロセスを自動化するツールです。
impacket-dcomexec の利用準備
dcomexec
を使用するには、いくつかの前提条件があります。
-
Impacketのインストール: Python環境にImpacketがインストールされている必要があります。通常、pipを使用してインストールできます。
pip install impacket # またはリポジトリから直接インストール git clone https://github.com/fortra/impacket.git cd impacket pip install .
- ネットワークアクセス: 攻撃者のマシンからターゲットマシンのTCPポート135および関連する動的RPCポートへの到達可能性が必要です。ファイアウォールでこれらのポートがブロックされている場合、DCOM通信は失敗します。
-
有効な認証情報: ターゲットマシン上でDCOMオブジェクトをインスタンス化し、メソッドを呼び出す権限を持つユーザーアカウントの認証情報が必要です。これには以下のいずれかを使用できます。
- ユーザー名とパスワード
- ユーザー名とNTLMハッシュ (Pass-the-Hash)
- 有効なKerberosチケット (Pass-the-Ticket)
- ターゲットOS: Windows Vista/Server 2008以降のWindowsシステムが主な対象となります。
これらの条件が満たされていれば、dcomexec
を使用してリモートコマンド実行を試みることができます。🚀
基本的な使い方 ⌨️
dcomexec
の基本的なコマンド形式は以下の通りです。
impacket-dcomexec [-target] <ターゲット情報> [-options] [コマンド]
ターゲット情報は、[[ドメイン/]ユーザー名[:パスワード]@ターゲットIP]
の形式で指定します。ドメイン名はオプションです。パスワードの代わりにNTLMハッシュを使用する場合は、-hashes
オプションを使います。
主要なオプション
オプション | 説明 | 例 |
---|---|---|
-target <IPアドレス> |
ターゲットマシンのIPアドレスまたはホスト名。 | -target 192.168.1.100 |
-username <ユーザー名> |
認証に使用するユーザー名。 | -username Administrator |
-password <パスワード> |
認証に使用するパスワード。 | -password Password123 |
-hashes <LMハッシュ:NTハッシュ> |
認証に使用するNTLMハッシュ(LMハッシュは空でも可)。Pass-the-Hash攻撃で使用します。 | -hashes :aad3b435b51404eeaad3b435b51404ee |
-domain <ドメイン名> |
認証に使用するドメイン名。ローカルアカウントの場合は不要。 | -domain contoso.local |
-dc-ip <DCのIPアドレス> |
Kerberos認証時にKDCとして使用するドメインコントローラーのIPアドレス。 | -dc-ip 192.168.1.10 |
-k |
Kerberos認証を使用します。-no-pass と共に使用し、有効なKerberosチケット(ccacheファイル)が必要です。環境変数 KRB5CCNAME でチケットファイルのパスを指定します。 |
-k -no-pass |
-no-pass |
パスワード、ハッシュ、AESキーなどを指定せずに認証を試みます(通常 -k と共に使用)。 |
-k -no-pass |
-object <DCOMオブジェクト> |
使用するDCOMオブジェクトを指定します。デフォルトは MMC20.Application ですが、ShellWindows や ShellBrowserWindow なども指定可能です。環境によって利用可能なオブジェクトが異なる場合があります。 |
-object ShellWindows |
-debug |
デバッグ情報を詳細に出力します。問題発生時のトラブルシューティングに役立ちます。 | -debug |
実行例
パスワード認証によるコマンド実行
ターゲット 192.168.1.100
に対して、ユーザー CONTOSO\AdminUser
とパスワード Password123
を使用して whoami
コマンドを実行します。
impacket-dcomexec contoso.local/AdminUser:Password123@192.168.1.100 'whoami'
# または
impacket-dcomexec -target 192.168.1.100 -domain contoso.local -username AdminUser -password Password123 'whoami'
NTLMハッシュ認証 (Pass-the-Hash) によるコマンド実行
ターゲット 192.168.1.100
に対して、ユーザー Administrator
のNTLMハッシュを使用して ipconfig /all
を実行します。
impacket-dcomexec -hashes :aad3b435b51404eeaad3b435b51404ee Administrator@192.168.1.100 'ipconfig /all'
# または
impacket-dcomexec -target 192.168.1.100 -username Administrator -hashes :aad3b435b51404eeaad3b435b51404ee 'ipconfig /all'
LMハッシュは通常不要なので、コロンの前に何も指定しません。
セミインタラクティブシェルの起動
コマンドを指定せずに実行すると、簡易的なシェルが起動し、連続してコマンドを実行できます。ただし、完全なインタラクティブシェルではないため、制限があります。終了するには exit
と入力します。
impacket-dcomexec contoso.local/AdminUser:Password123@192.168.1.100
実行後、プロンプトが表示され、コマンドを入力できるようになります。
# whoami
[*] Executing command: whoami
contoso\adminuser
# ipconfig
[*] Executing command: ipconfig
Windows IP Configuration
...(略)...
# exit
特定のDCOMオブジェクトを指定
デフォルトの MMC20.Application
が動作しない場合に、ShellWindows
オブジェクトを試します。
impacket-dcomexec -object ShellWindows contoso.local/AdminUser:Password123@192.168.1.100 'hostname'
状況に応じて、ShellBrowserWindow
など他のオブジェクトを試すことも有効です。環境によっては、特定のオブジェクトしか利用できない、または特定のオブジェクトがより検出されにくい場合があります。
応用的なテクニックとKerberos認証 ✨
Kerberos認証 (Pass-the-Ticket)
環境内でKerberos認証が構成されており、有効なKerberos TGT (Ticket Granting Ticket) を取得済みの場合、dcomexec
はパスワードやハッシュなしで認証を行うことができます。これは Pass-the-Ticket と呼ばれる攻撃手法です。
まず、getTGT.py
(Impacket) や Rubeus などのツールを使用して、対象ユーザーのTGTを取得し、ccacheファイルとして保存します。
# 例: getTGT.py を使用して TGT を取得し、admin.ccache に保存
getTGT.py contoso.local/AdminUser:Password123 -dc-ip 192.168.1.10
次に、環境変数 KRB5CCNAME
にccacheファイルのパスを設定します。
export KRB5CCNAME=/path/to/admin.ccache
最後に、-k
と -no-pass
オプションを付けて dcomexec
を実行します。ターゲットの指定には、IPアドレスではなく完全修飾ドメイン名 (FQDN) を使用することが推奨されます(Kerberosがサービスプリンシパル名(SPN)を解決するために必要)。
impacket-dcomexec -k -no-pass contoso.local/AdminUser@target-machine.contoso.local 'whoami /fqdn'
# またはFQDNが解決できない場合、ターゲットIPと -dc-ip を併用
impacket-dcomexec -k -no-pass -dc-ip 192.168.1.10 contoso.local/AdminUser@192.168.1.100 'whoami /fqdn'
Kerberos認証を使用する利点は、パスワードやハッシュがネットワーク上を流れないため、NTLMリレー攻撃などのリスクを低減できる点や、NTLM認証が無効化されている環境でも利用できる可能性がある点です。😊
異なるDCOMオブジェクトの利用
前述の通り、-object
オプションで異なるDCOMオブジェクトを指定できます。dcomexec
が内部的に試みる主なオブジェクトとその関連メソッドは以下の通りです(バージョンや実装により異なる場合があります)。
- MMC20.Application:
ExecuteShellCommand
メソッドを持つDocument.ActiveView
オブジェクトを利用。 - ShellWindows:
ShellWindows
コレクション内のオブジェクト(特定のウィンドウ)を見つけ、Document.Application
プロパティを通じてShellExecute
や類似のメソッドを呼び出すことを試みる。 - ShellBrowserWindow:
ShellWindows
と似ていますが、特定のブラウザウィンドウコンポーネントを利用します。これもDocument.Application
を介してメソッド呼び出しを試みます。
これらのオブジェクトは、ターゲットシステムの状態(特定のアプリケーションが実行中か、特定のWindows機能が有効かなど)によって利用可能性が変わる可能性があります。また、セキュリティソフトウェアによっては、特定のDCOMオブジェクトのインスタンス化やメソッド呼び出しを監視・ブロックしている場合があります。そのため、デフォルトのオブジェクトで失敗した場合や、検出を回避したい場合に、他のオブジェクトを試すことは有効な戦略となります。🔍
検出と対策 (防御側の視点) 🛡️
dcomexec
のようなDCOMベースの攻撃を検出・防御するためには、多層的なアプローチが必要です。
検出方法
-
ネットワークトラフィック監視:
- 異常なDCOM/RPCトラフィックの監視。特に、通常DCOMを使用しないクライアントからサーバーへのTCPポート135および高範囲の動的RPCポートへの接続試行。
- IDS/IPSでDCOM関連のシグネチャを有効化。
- ネットワークフロー分析による、予期しないホスト間のDCOM通信の検出。
-
ホストベースのログ監視 (Windowsイベントログ):
- セキュリティログ (Security Log):
- イベントID 4624 (ログオン成功) / 4625 (ログオン失敗): 異常なアカウント、ソースIP、ログオンタイプ (タイプ3 – Network) を監視。
- イベントID 4648 (明示的な資格情報を使用したログオン試行): DCOMが他のユーザーの資格情報を使用した場合に記録される可能性。
- イベントID 4688 (プロセス作成): DCOM経由で実行されたコマンドやプロセスの生成を監視。特に、
cmd.exe
やpowershell.exe
が予期しない親プロセス (例:svchost.exe
の特定のインスタンス) から起動されていないか確認。
- システムログ (System Log):
- イベントID 10009, 10016 (DistributedCOM): DCOM関連のエラーや警告。頻繁なエラーは攻撃試行の兆候である可能性。
- Microsoft-Windows-RPC/Debug ログ (有効化が必要): RPCコールに関する詳細なデバッグ情報を提供。
- セキュリティログ (Security Log):
-
Endpoint Detection and Response (EDR):
- EDR製品は、不審なDCOMオブジェクトのインスタンス化、プロセスインジェクション、異常な親子プロセス関係などを検知するルールを持っていることが多いです。
dcomexec
が使用する特定のDCOMオブジェクト (MMC20.Application, ShellWindows等) の不審な利用を監視。
対策・緩和策
-
DCOMの無効化 (影響評価が必要):
- もし業務上DCOMが不要であれば、システム全体または個々のマシンでDCOMを無効化することが最も効果的です。ただし、多くの正規アプリケーション(特に古いものや分散システム)がDCOMに依存している可能性があるため、無効化する前に十分な影響評価が必要です。
dcomcnfg.exe
を使用して、コンピュータ全体または特定のアプリケーションのDCOM設定を変更できます。レジストリキーHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole
のEnableDCOM
をN
に設定することでも無効化できます。
-
DCOMアクセス許可の制限:
dcomcnfg.exe
を使用して、DCOMの起動およびアクセス許可を厳格に設定します。「Administrators」グループのみに許可するなど、必要最小限のユーザー/グループに権限を絞ります。
-
ファイアウォールによる制限:
- ホストベースおよびネットワークファイアウォールで、不要なDCOM/RPC通信をブロックします。
- TCPポート135へのアクセスを制限します。
- RPCが使用する動的ポート範囲 (通常 49152-65535) へのアクセスを、必要なサーバーとクライアント間に限定します。可能であれば、RPCの動的ポート範囲を固定し、その範囲のみを許可することも検討します。(参考: RPC 動的ポート割り当てを構成する方法 – Microsoft Docs ※URLは例です)
-
最小権限の原則:
- ユーザーアカウント、特にサービスアカウントには、業務遂行に必要な最小限の権限のみを付与します。管理者権限を持つアカウントの数を制限し、厳格に管理します。
-
認証ポリシーの強化:
- 可能であれば、NTLM認証を無効化し、Kerberos認証のみを使用するように構成します。
- 強力なパスワードポリシーを適用し、定期的なパスワード変更を強制します。
-
セキュリティソフトウェアの活用:
- 最新の定義ファイルを持つアンチウイルスソフトウェアやEDRソリューションを導入し、適切に設定・運用します。
これらの対策を組み合わせることで、DCOMを悪用した攻撃のリスクを大幅に低減することができます。👍
ユースケースとシナリオ 🎯
impacket-dcomexec
は、主に以下のようなシナリオでペネトレーションテスターや攻撃者によって使用されます。
- 横展開 (Lateral Movement): ネットワーク内の1台のマシンへのアクセス権限(例: ドメインユーザーの認証情報)を奪取した後、その権限を利用して他のマシン(例: ドメインコントローラー、ファイルサーバー、他のワークステーション)へアクセスを拡大するために使用されます。特に、管理者権限を持つアカウントの認証情報が手に入った場合に強力なツールとなります。
-
リモートコード実行 (RCE): ターゲットマシン上で任意のコマンドやスクリプトを実行し、情報収集(例:
whoami
,ipconfig
,net user
)、マルウェアのダウンロードと実行、永続化メカニズムの設置などを行います。 -
PsExec代替: SMBポート (TCP 445) がブロックされている、またはPsExecのようなツールの利用がセキュリティ製品によって検知・ブロックされる環境において、DCOM (TCP 135 + Dynamic RPC) を利用する
dcomexec
が代替手段として選択されることがあります。ポートやプロトコルが異なるため、ファイアウォールや監視ルールを回避できる場合があります。 - ステルス性の追求: 環境によっては、DCOMを利用した活動がSMBベースの活動よりもログ記録や監視のレベルが低い場合があります(ただし、これは環境設定に大きく依存します)。攻撃者は、より検出されにくい手法としてDCOMを選択することがあります。
2017年に発生したランサムウェア「WannaCry」や「NotPetya」の拡散において、SMBの脆弱性(EternalBlue)が悪用されたことは有名ですが、その後の攻撃キャンペーンでは、侵入後の横展開フェーズで、PsExec, WMI (これもDCOMを利用), そして DCOM を直接利用するツールなどが組み合わせて使われる事例が報告されています。攻撃者は利用可能なツールやプロトコルを柔軟に使い分けるため、防御側も複数の攻撃経路を想定した対策が必要です。
倫理的考察と免責事項 🙏
🚨 重要: impacket-dcomexec
は、システムのセキュリティをテストし、改善するために設計された強力なツールですが、その能力は悪用される可能性も秘めています。このツールを使用する際は、以下の点を厳守してください。
- 許可の取得: ターゲットとなるシステムやネットワークの所有者から、書面による明確な許可を得ずにこのツールを使用してはいけません。無許可のアクセスやテストは違法行為です。
- 法的遵守: あなたが活動する国や地域の法律、および所属組織のポリシーを遵守してください。
- 責任ある使用: テスト活動によって、ターゲットシステムやネットワーク、業務プロセスに予期せぬ損害や中断を与えないよう、細心の注意を払ってください。
- 教育目的: この記事は、セキュリティ専門家がDCOMベースの攻撃手法を理解し、適切な防御策を講じることを支援するための教育目的で提供されています。悪意のある活動を推奨するものではありません。
ツールの使用によって生じたいかなる損害や法的問題についても、使用者自身が全責任を負うものとします。
まとめ ✨
impacket-dcomexec
は、Impacketフレームワークの一部として提供される、DCOMを利用したリモートコマンド実行ツールです。有効な認証情報(パスワード、ハッシュ、Kerberosチケット)があれば、Windows環境内での横展開やリモート操作に利用できます。
この記事では、dcomexec
の基本的な使い方、NTLMハッシュやKerberosチケットを用いた認証、異なるDCOMオブジェクトの指定方法、そして重要な検出・対策方法について解説しました。
DCOMはWindowsの正規機能ですが、攻撃経路となり得るため、セキュリティ担当者はその仕組みとリスクを理解し、適切なログ監視、アクセス制御、ファイアウォール設定、EDRの活用など、多層的な防御策を講じることが不可欠です。
ツールの使用は常に倫理的に、法的な範囲内で、そして許可を得て行う必要があります。セキュリティテストを通じて、システムの堅牢性を高めていきましょう! 💪
コメント