はじめに:Impacketとsmbexec.pyとは? 🤔
Impacketは、ネットワークプロトコルの操作に特化したPythonクラスのコレクションであり、セキュリティ研究者やペネトレーションテスターにとって非常に強力なツールキットです。IP、TCP、UDP、ICMPのような低レベルプロトコルから、SMB、MSRPC、NetBIOS、Kerberos、LDAPなどの高レベルプロトコルまで幅広く対応しています。
Impacketには、そのライブラリの能力を示す多くのサンプルスクリプトが含まれており、リモートシステムでのコマンド実行、ファイル転送、ポートスキャン、システム情報収集などが可能です。smbexec.py
は、これらのサンプルスクリプトの一つで、Windowsシステム上でリモートからコマンドを実行するために広く使われています。
smbexec.py
は、特にPsExecの代替として注目されています。PsExecがターゲットシステムに実行ファイルをコピーするのに対し、smbexec.py
はターゲットシステムに存在するネイティブなWindowsコマンドシェル(cmd.exe
)を利用します。これにより、実行ファイルの転送を伴わないため、一部のセキュリティ製品による検出を回避できる可能性があります。しかし、動作の過程で多くのイベントログが生成されるため、完全にステルスな手法とは言えません。
このブログ記事では、impacket-smbexec
(smbexec.py
)の基本的な使い方、主要なオプション、動作原理、そしてセキュリティ上の考慮事項について詳しく解説していきます。
smbexec.pyの仕組み ⚙️
smbexec.py
は、ターゲットとなるWindowsシステム上でコマンドを実行するために、巧妙な手法を用いています。基本的な動作フローは以下の通りです。
- 認証とサービス作成: 攻撃者は、有効な認証情報(ユーザー名とパスワード、またはNTLMハッシュ)を使用してターゲットシステムにSMB経由で認証します。認証に成功すると、
smbexec.py
はターゲットシステム上に一時的なWindowsサービスを作成します。このサービスは、リモートプロシージャコール(RPC)を通じて制御されます。 - コマンド実行: 作成されたサービスは、攻撃者が指定したコマンドを実行するように構成されます。具体的には、
cmd.exe
を使用して、実行したいコマンドを一時的なバッチファイル(.bat
)に書き込み、そのバッチファイルを実行します。 - 出力のリダイレクト: コマンドの標準出力(stdout)と標準エラー出力(stderr)は、ターゲットシステム上の一時ファイル(デフォルトでは
C$
共有上の__output
という名前のファイル)にリダイレクトされます。 - 出力の取得:
smbexec.py
はSMBプロトコルを使用して、ターゲットシステム上の出力ファイル(__output
)の内容を読み取り、攻撃者のコンソールに表示します。 - クリーンアップ: コマンドの実行と出力の取得が完了すると、
smbexec.py
は作成した一時サービス、バッチファイル、および出力ファイルをターゲットシステムから削除します。
この一連のプロセスにより、smbexec.py
はターゲットシステムに実行ファイルをコピーすることなく、リモートコマンド実行を実現します。ただし、各コマンドを実行するたびに新しいサービスが作成・開始・削除されるため、システムのイベントログ(特にシステムログのイベントID 7045: サービス作成、4697: サービスインストール、7009: タイムアウト、セキュリティログのイベントID 4688: プロセス作成など)には多数の痕跡が残ります。
smbexec.py
は「半対話的シェル(semi-interactive shell)」を提供します。これは、コマンドを入力して結果を受け取ることができる、シェル風のインターフェースを提供しますが、ディレクトリの変更(cd
コマンド)のような完全なシェルの機能は持っていません。
前提条件 ✅
smbexec.py
を使用するには、以下の条件を満たす必要があります。
- Impacketのインストール: Python環境にImpacketライブラリがインストールされている必要があります。Kali Linuxなどのペネトレーションテスト用ディストリビューションには、多くの場合プリインストールされています。
- ネットワーク接続: 攻撃者のマシンからターゲットシステムへネットワーク経由(通常はTCPポート445)で到達可能である必要があります。
- SMBサービスの稼働: ターゲットシステムでSMBサービス(Serverサービス)が稼働している必要があります。
- 有効な認証情報: ターゲットシステムに対する有効な認証情報が必要です。これには以下のいずれかが使用できます。
- ユーザー名とパスワード
- NTLMハッシュ(LMハッシュとNTハッシュのペア)
- Kerberosチケット(適切な設定とKerberos環境が必要)
- 管理者権限: 通常、サービスを作成・実行するには、ターゲットシステム上のローカル管理者権限を持つアカウントの認証情報が必要です。
- 書き込み可能な共有(オプション): デフォルトの「share mode」で動作させる場合、ターゲットシステム上に書き込み可能な共有フォルダ(通常はデフォルトで存在する
ADMIN$
やC$
などの管理共有)が必要です。これが利用できない場合は、「server mode」を使用します(後述)。
基本的な使い方 ⌨️
smbexec.py
の基本的なコマンド構文は以下の通りです。
python smbexec.py [-options] <認証情報>@<ターゲットIPまたはホスト名> [実行するコマンド]
認証情報は、以下の形式で指定します。
- パスワード認証:
<ドメイン名>/<ユーザー名>:<パスワード>
(ドメインユーザーの場合)または<ユーザー名>:<パスワード>
(ローカルユーザーの場合) - ハッシュ認証 (Pass-the-Hash):
<ドメイン名>/<ユーザー名>@<ターゲット> -hashes <LMハッシュ>:<NTハッシュ>
- Kerberos認証:
-k -no-pass
オプションを使用し、事前に取得したKerberosチケット(通常は環境変数KRB5CCNAME
で指定されたccacheファイル)を利用します。必要に応じて-dc-ip
でKDCのIPアドレスを指定します。
例1:パスワードで認証し、対話的シェルを起動
ターゲット 192.168.1.100
に、ドメイン CONTOSO
のユーザー AdminUser
、パスワード Password123
で接続し、半対話的シェルを起動します。
python smbexec.py CONTOSO/AdminUser:Password123@192.168.1.100
成功すると、Impacket-SMBExec>
のようなプロンプトが表示され、コマンドを入力できるようになります。
例2:NTLMハッシュで認証し、特定のコマンドを実行
ターゲット TARGETPC
に、ローカルユーザー LocalAdmin
のNTLMハッシュを使用して接続し、whoami
コマンドを実行します。(LMハッシュは空でも通常問題ありません)
python smbexec.py LocalAdmin@TARGETPC -hashes aad3b435b51404eeaad3b435b51404ee:b4b9b02e6f09a9bd760f388b67351e2b "whoami"
この場合、コマンドの実行結果が表示され、シェルは終了します。
例3:Kerberos認証で対話的シェルを起動
事前に getTGT.py
などで取得したチケットキャッシュファイル(例: /tmp/admin.ccache
)を環境変数で指定し、ターゲット dc01.corp.local
に接続します。
export KRB5CCNAME=/tmp/admin.ccache
python smbexec.py -k -no-pass corp.local/Administrator@dc01.corp.local -dc-ip 10.0.0.1
主要なオプション 🔧
smbexec.py
には、動作をカスタマイズするための様々なオプションがあります。以下に主要なものをいくつか紹介します。
オプション | 説明 |
---|---|
target |
接続先のターゲットを指定します。IPアドレス、ホスト名、または ドメイン/ユーザー名:パスワード@ターゲット の形式で指定できます。 |
-h, --help |
ヘルプメッセージを表示して終了します。 |
-debug |
デバッグ情報を出力します。トラブルシューティングに役立ちます。 |
-target-ip <ip address> |
ターゲットのIPアドレスを明示的に指定します。ホスト名解決に問題がある場合などに使用します。 |
-port <port> |
ターゲットのSMBポートを指定します。デフォルトは445です。 |
-hashes <LMHASH:NTHASH> |
パスワードの代わりにNTLMハッシュ(LM:NT形式)を使用して認証します (Pass-the-Hash)。 |
-no-pass |
パスワードの入力を求めません。-k (Kerberos) や -hashes と共に使用します。 |
-k |
Kerberos認証を使用します。環境変数 KRB5CCNAME で指定されたccacheファイルから認証情報を取得します。 |
-aesKey <hex key> |
Kerberos認証で使用するAESキー(16進数形式)を指定します (Pass-the-Key)。 |
-dc-ip <ip address> |
Kerberos認証で使用するドメインコントローラー(KDC)のIPアドレスを指定します。 |
-share <share> |
コマンド実行の出力(__output ファイル)を一時的に保存するために使用する共有名を指定します。デフォルトはADMIN$ です。書き込み権限が必要です。これが「Share Mode」です。 |
-service-name <service_name> |
作成される一時サービスの基本名を指定します。デフォルトではランダムな8文字が使用されます。(古いバージョンでは “BTOBTO” でした) |
-shell-type <shell> |
使用するシェルの種類を指定します。cmd (デフォルト) または powershell を指定できます。 |
-codec <codec> |
ターゲットシステムが使用するコンソールのエンコーディングを指定します。日本語環境などで文字化けする場合に cp932 などを指定すると改善することがあります。 |
[command] |
ターゲットで実行する単一のコマンドを指定します。これを指定しない場合、半対話的シェルが起動します。 |
Server Mode:
-share
オプションを指定しない場合、またはターゲットに書き込み可能な共有がない場合、smbexec.py
は「Server Mode」で動作しようとします。このモードでは、攻撃者のマシン上で一時的なSMBサーバーを起動し(デフォルトポート445を使用)、ターゲットシステムからのコマンド出力はこのローカルSMBサーバーに送り返されます。このモードを使用するには、攻撃者のマシンでポート445をバインドするための権限(通常はroot権限)が必要です。
実践的な利用例 🚀
1. ディレクトリの内容を確認する
ターゲット 10.0.0.5
の C:\Users
ディレクトリの内容一覧を取得します。
python smbexec.py WORKGROUP/Administrator:Pass123@10.0.0.5 "dir C:\Users"
2. システム情報を取得する
ターゲット SRV01
のシステム情報を取得します。
python smbexec.py MYDOMAIN/svc_admin@SRV01 -hashes :NTHASH123... "systeminfo"
3. PowerShellコマンドを実行する
ターゲット 192.168.10.20
でPowerShellを使用して現在実行中のプロセス一覧を取得します。
python smbexec.py Administrator:Pa$$w0rd@192.168.10.20 -shell-type powershell "Get-Process"
4. 日本語環境での文字化け対策
ターゲットが日本語Windowsで、コマンド出力が文字化けする場合、-codec cp932
を試します。
python smbexec.py user:password@10.1.1.1 -codec cp932 "ipconfig /all"
5. Server Mode を利用する
ターゲット PC05
に書き込み可能な共有がない、または利用したくない場合に、ローカルでSMBサーバーを起動してコマンドを実行します(root権限が必要です)。
sudo python smbexec.py user:password@PC05 "hostname"
この場合、smbexec.py
は自動的にServer Modeを選択します。
セキュリティ上の考慮事項と検出 🛡️
smbexec.py
はペネトレーションテストやセキュリティ評価において有用なツールですが、攻撃者によって悪用される可能性も高いツールです。防御側としては、その活動を検知し、対策を講じることが重要です。
- ログ監視:
smbexec.py
の活動は、Windowsイベントログに多くの痕跡を残します。特に以下のイベントIDに注目します。- System Log Event ID 7045 (Service Creation): 一時的なサービス(デフォルトではランダムな8文字の名前、古いバージョンでは “BTOBTO”)の作成イベント。サービス実行可能ファイルのパスには、
cmd.exe /Q /c echo コマンド ^> \\127.0.0.1\共有名\__output 2^>^&1 > %SYSTEMROOT%\ランダム名.bat & C:\Windows\system32\cmd.exe /Q /c %SYSTEMROOT%\ランダム名.bat & del %SYSTEMROOT%\ランダム名.bat
のような特徴的なコマンドラインが含まれます。 - System Log Event ID 7009 (Service Timeout): 作成されたサービスが正常に応答しないため、タイムアウトエラーが記録されることがあります。
- System Log Event ID 7036 (Service Start/Stop): サービスの開始・停止イベント。
- Security Log Event ID 4688 (Process Creation):
services.exe
を親プロセスとするcmd.exe
の起動。コマンドライン引数には上記7045イベントと同様の特徴的なパターンが見られます(例:/Q /c echo ...
)。 - Security Log Event ID 4624 (Successful Logon): タイプ3(ネットワーク経由)でのログオン成功イベント。攻撃に使用されたアカウントとソースIPアドレスが記録されます。
- Security Log Event ID 5140/5145 (Network Share Object Access):
ADMIN$
やC$
などの管理共有や、出力ファイル__output
へのアクセスイベント。
- System Log Event ID 7045 (Service Creation): 一時的なサービス(デフォルトではランダムな8文字の名前、古いバージョンでは “BTOBTO”)の作成イベント。サービス実行可能ファイルのパスには、
- ネットワークトラフィック分析: SMB (TCP/445) および MSRPC (TCP/135 など) の通信パターンを監視します。短時間に多数のサービス作成要求や、
__output
ファイルへのアクセスが頻繁に行われる場合は不審な兆候です。 - ホストベースの検出: EDR(Endpoint Detection and Response)ソリューションは、
services.exe
からの不審なcmd.exe
の起動や、特徴的なコマンドラインパターンを検出できる場合があります。 - 認証情報の管理: 強力なパスワードポリシー、多要素認証の導入、不要な管理者権限の削除、ローカル管理者パスワードソリューション(LAPS)の利用などにより、そもそも認証情報を奪取・悪用されるリスクを低減します。
- 管理共有の無効化(注意が必要):
ADMIN$
やC$
などの管理共有を無効化することで、smbexec.py
のデフォルト(Share Mode)の動作を妨げることができますが、システムの正常な管理運用に影響が出る可能性があるため、慎重に検討・テストする必要があります。レジストリ変更 (AutoShareServer
/AutoShareWks
) や GPO で設定可能です。 - 攻撃者のTTP理解:
smbexec.py
は、Volt Typhoon, BlackCat/ALPHV, LockBit などの脅威アクターやランサムウェアグループによって、初期侵入後のラテラルムーブメント(横展開)やコマンド実行の手段として実際に使用されていることが報告されています (例: 2021年-2022年の防衛産業基地組織への攻撃)。
smbexec.py
は強力なツールですが、その使用は法的な認可と倫理的な配慮の下で行われるべきです。許可なく他者のシステムに対して使用することは、深刻な法的結果を招く可能性があります。必ず、自身が管理するシステムまたは明示的に許可されたテスト環境でのみ使用してください。
まとめ ✨
impacket-smbexec
(smbexec.py
) は、Impacketツールキットに含まれる強力なリモートコマンド実行スクリプトです。ターゲットシステムにバイナリをコピーすることなく、ネイティブのWindowsコンポーネントとSMB/MSRPCプロトコルを活用してコマンドを実行できるため、特定の状況下で有効なツールとなります。
パスワード認証、ハッシュ認証(Pass-the-Hash)、Kerberos認証に対応し、半対話的なシェルを提供します。しかし、その動作は多くのログイベントを生成するため、ステルス性は限定的です。
セキュリティ専門家にとっては、システムの脆弱性を評価したり、攻撃者の手法を理解したりするための重要なツールですが、同時に防御側にとっては検知と対策が不可欠な脅威でもあります。適切なログ監視、ネットワーク監視、および認証管理を行うことで、smbexec.py
の悪用リスクを低減することができます。
このツールを理解し、適切に利用・対策することが、現代の複雑なネットワーク環境におけるセキュリティ確保の一助となるでしょう。🛡️🔒
コメント