PsExecについて、すでに色々なまとめ記事がありますが、個人的に押さえておきたいポイントだけ、さっとメモ。
PsExecとは
Windows Sysinternalsより提供されているリモートアクセスツール。リモートホスト上でコマンドやプログラムを実行できる。リモートホストにインストール済のコマンドやプログラムを実行できるのはもちろん、ローカルホスト上のプログラムをリモートホストへコピーして実行したりもできる。非常に便利なツールなので、システム管理目的だけでなく、攻撃目的に使用されることも多々ある。
コマンドの書式は以下の通り。
Usage: psexec [\\computer[,computer2[,...] | @file\]][-u user [-p psswd][-n s][-r servicename][-h][-l][-s|-e][-x][-i [session]][-c executable [-f|-v]][-w directory][-d][-<priority>][-a n,n,...] cmd [arguments]
詳しくはこちらを参照。
実行の流れ
- ローカルホストでPsExecを実行する。
- すると、PSEXESVC.exeというファイルがリモートホストのADMIN$共有フォルダに作成され、PSEXESVC.exeを起動するためのWindows サービスがインストールされる。(サービス名: PSEXESVC)
- リモートホスト上でPSEXESVCサービスが起動してPSEXESVC.exeが実行される。
- ローカルホストのPsExecから渡されたコマンドまたはプログラムをリモートホストのPSEXESVC.exeが名前付きパイプ経由で受け取って実行する。
PsExec実行後にローカルホスト、リモートホストの双方でどういう痕跡が残るかはこちらに詳しくまとめられている。
PsExec実行時にuオプションでユーザー名が指定されていた場合、そのユーザーの権限でコマンドがリモートホスト上で実行される。
さっとPsExecのバイナリを見てみる
PsExecのリソースセクションにPSEXESVC.exeのバイナリが埋め込まれている。
PSEXESVC.exeがリソースセクションから抽出されて、リモートホストのADMIN$共有フォルダに作成される。
PSEXESVCというWindowsサービスがリモートホストにインストールされる。
名前付きパイプの作成 (ローカルホスト側)。CreateFileWで名前付きパイプのハンドルを作成し、SetNamedPipeHandleStateで名前付きパイプをセットアップし、TransactNamedPipeでデータの読み書きを行う。
以上。