Impacketは、ネットワークプロトコルを扱うための強力なPythonクラス群であり、特にセキュリティ専門家やペネトレーションテスターにとって不可欠なツールキットとなっています。SMB、MSRPC、Kerberosなど、様々なプロトコルへの低レベルアクセスを提供し、ネットワーク上の様々な操作を可能にします。Impacketには多くの便利なスクリプト(サンプル)が含まれており、パスワードダンプ、リモートコマンド実行、Kerberosチケット操作など、多様なユースケースに対応します。
この記事では、Impacketに含まれる数あるスクリプトの中でも、リモートコマンド実行に特化した atexec.py
について、その機能、使い方、動作原理、そして検知方法まで詳しく解説していきます。🕵️♂️
atexec.pyとは何か? 🤔
atexec.py
は、Windowsのタスクスケジューラサービス(具体的には古いATコマンドのインターフェースや、新しいスケジュールタスクAPI)を利用して、リモートのWindowsマシン上で任意のコマンドを実行するためのImpacketスクリプトです。主な動作原理は以下の通りです。
- SMBプロトコルを使用してターゲットマシンに接続します。
- RPC (Remote Procedure Call) を介してタスクスケジューラサービス (MS-TSCH RPC) にアクセスします。
- 指定されたコマンドを実行するタスクをリモートで作成します。この際、タスク名にはランダムな8文字の英字が使用されることが一般的です。
- 作成したタスクを即時実行します。デフォルトでは、SYSTEM権限で実行されます。
- コマンドの標準出力と標準エラー出力を、ターゲットシステムの
C:\Windows\Temp\
ディレクトリ内に一時ファイル(タスク名と同じランダムな名前 +.tmp
拡張子)にリダイレクトします。 - タスクの実行完了後、作成したタスクを削除します。
- SMB経由でADMIN$共有(
C:\Windows\
)にアクセスし、先ほど作成された一時ファイルを読み取り、コマンドの実行結果を取得します。 - 取得後、一時ファイルを削除します。
この一連の動作により、あたかもターゲットマシン上で直接コマンドを実行したかのように、その結果を受け取ることができます。ただし、この方法は対話的なシェルを提供するものではなく、単発のコマンド実行とその結果取得に特化しています。Windows Vista以降のバージョンで動作します。
⚠️ 注意: atexec.py
の使用には、ターゲットシステムに対する適切な権限(通常はローカル管理者権限)と認証情報が必要です。また、システムへの不正アクセスや未許可の操作は法律で禁止されています。必ず許可された環境でのみ使用してください。
🚀 使用前の準備
atexec.py
を使用する前に、以下の準備が必要です。
- Impacketのインストール: Python環境にImpacketがインストールされている必要があります。通常はpipコマンドでインストールできます。
Impacket GitHub リポジトリpip install impacket
- 認証情報: ターゲットシステムに接続するための有効な認証情報が必要です。以下のいずれかを使用します。
- ユーザー名とパスワード
- NTLMハッシュ (LMハッシュとNTハッシュ)
- Kerberosチケット (設定が必要)
- ネットワーク接続: 実行元マシンからターゲットマシンへ、SMB (TCPポート445) および RPC (動的ポートまたはTCPポート135経由) で通信できる必要があります。ファイアウォール設定を確認してください。
- ターゲットシステムの権限: ターゲットシステム上でタスクを作成・実行できる権限が必要です。一般的には、ローカル管理者グループに所属するユーザーアカウントの認証情報が必要となります。
- タスクスケジューラサービス: ターゲットシステムでタスクスケジューラサービスが実行されている必要があります。
🛠️ 基本的な使い方
atexec.py
の基本的なコマンド構文は以下の通りです。
atexec.py [[ドメイン/]ユーザー名[:パスワード]@]<ターゲット名 or IPアドレス> <実行したいコマンド>
例1: パスワード認証で `whoami` を実行
ターゲット `192.168.1.100` に、ドメイン `CORP` のユーザー `admin`、パスワード `Password123` で接続し、`whoami` コマンドを実行します。
atexec.py CORP/admin:Password123@192.168.1.100 whoami
実行に成功すると、ターゲットシステム上での `whoami` の実行結果(通常は `nt authority\system` など)が表示されます。
[+] Impacket v0.12.0 - Copyright 2023 Fortra
[*] Creating task \XXXXXXXX
[*] Running task \XXXXXXXX
[*] Deleting task \XXXXXXXX
[*] Attempting to read C:\Windows\Temp\XXXXXXXX.tmp
nt authority\system
(XXXXXXXX
の部分は実行ごとにランダムな8文字の英字に変わります)
例2: パスワード認証で `ipconfig` を実行
同じターゲットで `ipconfig` コマンドを実行します。
atexec.py CORP/admin:Password123@192.168.1.100 ipconfig
実行結果として、ターゲットシステムの `ipconfig` の出力が表示されます。
🔑 認証方法
atexec.py
は複数の認証方法をサポートしています。
パスワード認証 (デフォルト)
前述の例のように、`ユーザー名:パスワード@ターゲット` の形式で指定します。ドメインユーザーの場合は `ドメイン/ユーザー名:パスワード@ターゲット` とします。
atexec.py WORKGROUP/user:password@10.0.0.5 hostname
パスワードが空の場合は `-no-pass` フラグを使用します。
atexec.py CORP/guest@10.0.0.10 -no-pass whoami
NTLMハッシュ認証 (Pass-the-Hash)
パスワードの代わりにNTLMハッシュを使用します。 `-hashes` オプションに続けてLMハッシュとNTハッシュをコロン区切りで指定します。LMハッシュは省略可能ですが、NTハッシュの前にはコロンが必要です。
書式: `-hashes [LMハッシュ]:NTハッシュ`
atexec.py -hashes :0123456789abcdef0123456789abcdef CORP/admin@192.168.1.100 whoami
LMハッシュとNTハッシュの両方がある場合:
atexec.py -hashes aad3b435b51404eeaad3b435b51404ee:0123456789abcdef0123456789abcdef CORP/admin@192.168.1.100 whoami
Pass-the-Hashは、パスワード自体を知らなくても、そのハッシュ値だけで認証を突破できる可能性がある攻撃手法です。
Kerberos認証 (Pass-the-Key / Pass-the-Ticket)
Kerberos認証を使用することも可能です。これには、環境に応じたKerberosの設定(`krb5.conf` ファイルなど)や有効なチケットが必要です。
- Pass-the-Key (AESキーを使用): `-k` フラグと `-aesKey` オプションを使用します。
atexec.py -k -aesKey <128ビットまたは256ビットのAESキー(16進数)> CORP/admin@dc01.corp.local -dc-ip 192.168.1.1 whoami
export KRB5CCNAME=/tmp/krb5cc_0
atexec.py -k CORP/admin@192.168.1.100 -dc-ip 192.168.1.1 whoami
Kerberos認証を使用する場合、通常は `-dc-ip` オプションでドメインコントローラーのIPアドレスを指定する必要があります。`-k` フラグはKerberos認証を使用することを明示するために必要です。
⚙️ 便利なオプション
atexec.py
には、動作をカスタマイズするためのいくつかのオプションがあります。
オプション | 説明 | 例 |
---|---|---|
-debug |
デバッグモードを有効にします。通信の詳細など、より多くの情報が出力され、問題解決に役立ちます。 | atexec.py ... -debug whoami |
-codec |
ターゲットシステムの出力エンコーディングを指定します。文字化けが発生する場合、ターゲットで `chcp.com` を実行してコードページを確認し、適切なPythonコーデック名を指定します(例: 日本語環境なら `cp932`)。省略時は `utf-8` が使われます。 | atexec.py ... -codec cp932 dir |
-outputfile <ファイル名> |
コマンドの実行結果をコンソールに表示せず、指定したローカルファイルに保存します。 | atexec.py ... -outputfile result.txt systeminfo |
-silentCommand |
コマンド実行時に `cmd.exe /C` を介さずに、指定されたコマンドを直接実行しようと試みます(例: `hostname` の代わりに `C:\Windows\System32\hostname.exe` を直接実行)。検知を回避するのに役立つことがありますが、このオプションを使用するとコマンドの出力は取得できません。🤫 | atexec.py ... -silentCommand C:\Windows\System32\calc.exe |
-ts |
すべての出力行の先頭にタイムスタンプを付与します。ログ記録や分析に便利です。🕒 | atexec.py ... -ts whoami |
-dc-ip <IPアドレス> |
Kerberos認証を使用する際に、KDC(通常はドメインコントローラー)のIPアドレスを指定します。 | atexec.py -k ... -dc-ip 192.168.1.1 whoami |
-session-id <セッションID> |
特定のログオンセッションのコンテキストでタスクを実行します。省略時はセッション0が使用されます。-silentCommand と同様に、出力は得られません。 |
atexec.py ... -session-id 1 C:\malware.exe |
🎯 ユースケースとシナリオ
atexec.py
は様々な状況で利用されますが、主な用途は以下の通りです。
- ペネトレーションテスト:
- 初期アクセス後、侵害したWindowsマシン上で偵察コマンド (
whoami
,ipconfig
,net user
など) を実行する。 - さらなる権限昇格や内部活動のためのツールやスクリプトを実行する。
- ラテラルムーブメント(横展開)の一環として、他のマシンに対してコマンドを実行する。
- 初期アクセス後、侵害したWindowsマシン上で偵察コマンド (
- システム管理 (限定的):
- 複数のマシンに対して一時的なコマンドを実行する必要がある場合。(ただし、PowerShell Remotingや専用の管理ツールの方が適していることが多いです)
- レッドチーム活動:
- 他の実行手法(PsExec, WMIなど)が検知される、またはブロックされている環境での代替手段として利用する。
- 永続化ではなく、一時的なコマンド実行が必要な場合に利用する。
- 攻撃者による悪用:
- 侵入後の内部ネットワーク偵察や、マルウェアのダウンロード・実行、他のシステムへの侵害拡大などに悪用される可能性があります。
atexec.py
は、特にタスクスケジューラサービスへのアクセスが許可されており、かつ管理者権限を持つ認証情報が利用可能な場合に有効な手法です。
🔬 内部動作の仕組み:ATサービスとタスクスケジューラ
atexec.py
の動作を理解するには、Windowsのタスクスケジューラと、古い `at` コマンドの仕組みを知ることが役立ちます。
at コマンド
at
コマンドは、古くからWindowsに搭載されているコマンドラインユーティリティで、指定した日時にコマンドやプログラムを実行するようにスケジュールできます。内部的にはタスクスケジューラサービスを利用しています。at
コマンドで作成されたタスクは、デフォルトでシステムアカウント (NT AUTHORITY\SYSTEM
) の権限で実行されます。atexec.py
は、この `at` コマンドが利用する仕組み(またはより新しいタスクスケジューラAPI)をリモートから利用します。
タスクスケジューラサービス
Windowsのタスクスケジューラサービス (Schedule
) は、システムイベント発生時や指定時刻に、プログラムやスクリプトを自動実行するためのコアコンポーネントです。このサービスは、リモートからのタスク作成、実行、削除などを可能にするRPCインターフェース (MS-TSCH: Task Scheduler Service Remoting Protocol) を提供しています。
atexec.py の RPC 利用
atexec.py
は、ターゲットシステムにSMBで接続した後、この MS-TSCH RPC インターフェースを利用して以下の操作を行います。
SchRpcRegisterTask
: 実行したいコマンドを含む新しいタスクをリモートで登録します。この際、ランダムなタスク名、実行アカウント(デフォルトSYSTEM)、実行するコマンド(通常は `cmd.exe /C “your_command > C:\Windows\Temp\random.tmp 2>&1″` の形式)、トリガー(即時実行)などを設定します。SchRpcRun
: 登録したタスクを即座に実行させます。SchRpcDelete
: タスクの実行後(または結果取得後)に、登録したタスクを削除します。
コマンドの出力は、タスクのアクションとして指定されたリダイレクトにより一時ファイルに書き込まれ、そのファイルがSMB経由で読み取られます。
このように、atexec.py
はWindows標準の機能であるタスクスケジューラサービスをリモートから巧みに利用することで、コマンド実行を実現しています。
🔄 他のImpacket実行スクリプトとの比較
Impacketには、atexec.py
以外にもリモートコマンド実行のためのスクリプトがいくつか存在します。それぞれ異なる技術を使用しており、状況に応じて使い分けることが重要です。
スクリプト | 主要技術 | 主な特徴 | 長所 | 短所 | 主なログ・検知ポイント |
---|---|---|---|---|---|
atexec.py |
タスクスケジューラ (AT/MS-TSCH RPC) | 一時的なタスクを作成・実行・削除。出力は一時ファイル経由で取得。 | 比較的隠密性が高い場合がある。標準機能を利用。 | 対話的シェルは不可。出力取得にADMIN$共有が必要。 | タスク作成/削除ログ (4698, 4699, TaskScheduler 106, 141)、プロセス生成ログ (4688)、SMBアクセスログ (5145) |
psexec.py |
サービスコントロールマネージャ (SVCManager RPC)、名前付きパイプ | リモートに実行ファイル (RemComSvc) をコピーし、サービスとして登録・実行。対話的シェルを提供。 | 対話的シェルが利用可能。多くの環境で動作。 | 実行ファイルのコピーやサービス作成が検知されやすい (ノイズが多い)。ADMIN$共有への書き込みが必要。 | サービス作成ログ (7045, 4697)、プロセス生成ログ (4688)、SMBアクセスログ (5145)、名前付きパイプ接続 |
smbexec.py |
サービスコントロールマネージャ (SVCManager RPC)、SMB共有 | コマンドをサービスとして登録・実行。出力はSMB共有経由でリダイレクト (ローカルSMBサーバー起動モードもあり)。半対話的シェルを提供。 | 実行ファイルのコピーが不要。 | サービス作成が検知されやすい。デフォルトでは書き込み可能な共有が必要。 | サービス作成ログ (7045, 4697)、プロセス生成ログ (4688)、SMBアクセスログ (5145) |
wmiexec.py |
WMI (Windows Management Instrumentation), DCOM | WMI を使用してリモートプロセスを作成。出力は一時ファイル経由で取得。半対話的シェルを提供。 | サービス作成ログが残らない。SYSTEMではなく管理者権限で実行される。 | WMI/DCOMがファイアウォールでブロックされている場合がある。ADMIN$共有が必要。 | WMI関連ログ、プロセス生成ログ (4688)、SMBアクセスログ (5145) |
dcomexec.py |
DCOM (Distributed Component Object Model) | 特定のDCOMオブジェクト (ShellWindows, ShellBrowserWindowなど) を利用してコマンドを実行。 | 特定の条件下で検知されにくい場合がある。 | 動作が不安定な場合や、特定のWindowsバージョン/設定に依存する場合がある。DCOMがブロックされている可能性。 | DCOM関連ログ、プロセス生成ログ (4688) |
いつ atexec.py
を選ぶか? 🤔
- PsExec や WMI の利用が監視されている、またはブロックされている場合。
- 対話的なシェルは不要で、単発のコマンド実行とその結果が必要な場合。
- ターゲットシステムでタスクスケジューラサービスが利用可能で、管理者権限がある場合。
- 一時的な活動で、サービス作成などの目立つ痕跡を避けたい場合(ただし、タスク作成ログは残る可能性がある)。
🛡️ セキュリティ上の考慮事項と検知方法
atexec.py
は便利なツールですが、攻撃者によって悪用される可能性も高いため、その活動を検知し、対策を講じることが重要です。
ログと痕跡
atexec.py
の実行は、ターゲットシステム上にいくつかのログや痕跡を残す可能性があります(ただし、システムの監査ポリシー設定に依存します)。
- セキュリティイベントログ (Security.evtx):
- イベントID 4698: スケジュールされたタスクが作成されました。(監査ポリシー「オブジェクトアクセスの監査 > その他のオブジェクトアクセスイベントの監査」の有効化が必要) タスク名(ランダムな8文字英字)、作成ユーザー、タスクのXML定義(実行コマンドが含まれる)などが記録されます。
- イベントID 4699: スケジュールされたタスクが削除されました。(同上)
- イベントID 4688: 新しいプロセスが作成されました。(監査ポリシー「詳細な追跡 > プロセス作成の監査」の有効化が必要、コマンドライン監査も有効推奨) `cmd.exe` または `-silentCommand` で指定されたプロセスが `svchost.exe` (タスクスケジューラサービス) の子プロセスとして起動される様子が記録される可能性があります。コマンドラインにリダイレクト先の一時ファイル名が含まれることがあります (`cmd.exe /C “command > C:\Windows\Temp\XXXXXXXX.tmp 2>&1″`)。
- イベントID 4624: アカウントが正常にログオンしました。
atexec.py
が認証に使用したアカウントによるログオンイベント (ログオンタイプ 3: ネットワークログオン) が記録されます。 - イベントID 5145: ネットワーク共有オブジェクトがアクセスされました。(監査ポリシー「オブジェクトアクセスの監査 > 詳細なファイル共有の監査」の有効化が必要) ADMIN$ 共有 (
\\*\IPC$
や\\*\ADMIN$
) へのアクセス、特に一時ファイル (*.tmp
) の読み取りや削除が記録される可能性があります。
- タスクスケジューラ運用ログ (Microsoft-Windows-TaskScheduler/Operational.evtx):
- イベントID 106: タスクが登録されました。タスク名と登録時刻が記録されます。
- イベントID 129: タスクプロセスが作成されました。実行されたコマンド(引数なしの場合あり)とプロセスID (PID) が記録されます。このPIDをイベントID 4688と関連付けることで、引数を含む完全なコマンドラインを特定できる場合があります。
- イベントID 100: タスクが開始されました。タスクを実行したユーザーアカウント(通常SYSTEM)が記録されます。
- イベントID 141: タスクの登録が削除されました。タスク名と削除時刻が記録されます。
- イベントID 200/201: タスクアクション/タスク完了。
- ファイルシステムの痕跡:
C:\Windows\Temp\
ディレクトリに一時ファイル (ランダムな8文字英字 +.tmp
) が短時間作成・削除されます。リアルタイム監視やファイルシステムフォレンジック (例: USNジャーナル) で検出できる可能性があります。
検知のポイント💡
- 短時間に作成・実行・削除されるランダムな名前(特に8文字英字)のスケジュールタスクを監視します。(Event 4698/4699, 106/141)
svchost.exe
(Task Scheduler Service) またはtaskeng.exe
を親プロセスとするcmd.exe
の起動で、コマンドラインにC:\Windows\Temp\
配下の.tmp
ファイルへのリダイレクトが含まれるものを監視します。(Event 4688)- ADMIN$ 共有へのアクセスと、
C:\Windows\Temp\
内の.tmp
ファイルへのアクセスを関連付けて監視します。(Event 5145) - 不審なアカウントによるネットワークログオン (Type 3) が、短期間のタスク操作やプロセス生成と時間的に相関しているかを監視します。(Event 4624)
atexec.py
自体(またはPyInstallerなどで実行ファイル化されたもの)がシステム上に存在しないかスキャンします。
緩和策
- 最小権限の原則: ユーザーやサービスアカウントに必要以上の管理者権限を与えないようにします。
- ネットワークセグメンテーション: ファイアウォールで不要なSMB (445) や RPC (135など) 通信を制限します。特に、クライアントPC間や、クライアントからサーバーへの不要な管理アクセスを制限します。
- 強力なパスワードポリシーと認証: 推測されにくいパスワードの使用、多要素認証の導入を検討します。
- 監査ポリシーの強化: 上記の検知に必要なイベントログが記録されるように、適切な監査ポリシーを設定します。
- エンドポイント検知・対応 (EDR) ソリューション: 不審なプロセス生成、ファイル操作、ネットワーク接続などを検知・ブロックできるEDR製品を導入します。
- タスクスケジューラサービスの無効化 (非推奨): もし業務上全く不要であれば無効化も考えられますが、多くのシステム機能が依存しているため、通常は推奨されません。
🤯 トラブルシューティング
atexec.py
の実行中に問題が発生することもあります。一般的なエラーとその対処法をいくつか紹介します。
- 接続エラー (Connection refused, Host unreachable など):
- ターゲットのIPアドレスやホスト名が正しいか確認します。
- 実行元からターゲットへのネットワーク経路(特にTCPポート445)が確保されているか、ファイアウォール設定を確認します。
- ターゲットマシンが起動しており、ネットワークに接続されているか確認します。
- 認証エラー (STATUS_LOGON_FAILURE, Access Denied など):
- ユーザー名、パスワード、ドメイン名が正しいか確認します。
- NTLMハッシュを使用している場合、ハッシュ値が正しいか、書式(
:NTハッシュ
)が正しいか確認します。 - 使用しているアカウントにターゲットマシンへのリモートログオン権限および管理者権限があるか確認します。
- Kerberos認証の場合、KDCへの接続、チケットの有効性、SPNの設定などを確認します。
- RPCエラー (RPC_S_SERVER_UNAVAILABLE など):
- ターゲットマシンでRPCサービスおよびタスクスケジューラサービスが実行されているか確認します。
- ファイアウォールがRPC通信(TCPポート135や動的ポート)をブロックしていないか確認します。
- タスク作成・実行エラー (Access is denied など):
- 使用しているアカウントにタスクを作成・実行する権限(通常はローカル管理者権限)があるか確認します。
- UAC (User Account Control) のリモート制限が影響している可能性があります(特定のレジストリ設定
LocalAccountTokenFilterPolicy
が関係することがあります)。
- 結果取得エラー (STATUS_OBJECT_NAME_NOT_FOUND など):
- ADMIN$ 共有にアクセスできる権限があるか確認します。
- 一時ファイルが作成される
C:\Windows\Temp
ディレクトリへの書き込み権限が(SYSTEMアカウントに対して)あるか確認します。 - コマンドがエラーなく実行され、一時ファイルが正しく生成されたか確認します(`-debug` オプションが役立ちます)。
- 文字化け:
- ターゲットシステムのデフォルトエンコーディングと実行元(またはImpacket)が想定するエンコーディングが異なっている可能性があります。`-codec` オプションで適切なエンコーディング(例: `cp932`)を指定してみてください。
問題が発生した場合は、まず -debug
オプションを付けて実行し、詳細なエラーメッセージや通信内容を確認するのが最も効果的なトラブルシューティング方法です。🔍
🏁 まとめ
impacket-atexec
(atexec.py
) は、Windowsの標準機能であるタスクスケジューラサービスをリモートから利用してコマンドを実行する、Impacketフレームワークの強力なツールです。パスワード認証、Pass-the-Hash、Kerberos認証など、多様な認証方法に対応しています。
主にペネトレーションテストやレッドチーム活動において、他の実行手法が使えない場合の代替手段や、一時的なコマンド実行に用いられます。その動作は、リモートタスクの作成、実行、削除、そしてSMB経由での結果取得というステップで行われます。
一方で、攻撃者による悪用リスクも高いため、その活動を検知するためのログ監視(特にイベントID 4698, 4699, 4688, 106, 141 など)や、適切なセキュリティ対策(最小権限、ネットワークセグメンテーション、EDR導入など)が不可欠です。
atexec.py
を含むImpacketのツール群は、正しく理解し、倫理的に使用すれば非常に有用ですが、その能力と潜在的な影響を常に認識しておく必要があります。🛡️✨
🚨 重要な注意: この情報は教育および防御目的で提供されています。atexec.py
やその他のImpacketツールを許可なく他者のシステムに対して使用することは、法律に違反し、重大な結果を招く可能性があります。常に倫理的なガイドラインと適用法規を遵守してください。
コメント