PsExecの動作にRPC用のポートは必要ない
ローカル・リモートコンピュータ上で任意のプログラムを実行し、入出力をリダイレクトしてくれるPsExecというツールがあります。XP時代からあるツールで、本家Sysinternalsの他にも色んなブログで紹介されています。
そんな便利で恐いツールは下準備が色々必要なんでしょう?ポート開放とか。と思って調べてみると、次の3種類のポートが必要という話を見つけました。
(中略)
Windows 7/Windows Server 2008 R2などの「セキュリティが強化された Windows ファイアウォール」の場合は、[受信の規則]で[グループ]が「リモート サービス管理」である項目をすべて有効化する。
ファイル共有は設定しているけど、RPCなんて怪しげなもの、ましてリモートサービス管理なんて有効にした覚えはない。ファイアウォールの設定を見ても、それらのルールは無効化されている。でも PsExec は通ってしまった。何故・・・?
PsExecが動く仕組み
PsExec | Systems Management content from Windows IT Pro
上の記事に作者による解説があります。種明かしは最後の見出しに書かれていますが、要するに
- 任意のコマンドを実行して名前付きパイプに流すプログラムを用意しておく
- SMBの管理共有でこのプログラムを転送
- リモートサービス管理でこのプログラムをサービスとして起動
- SMBの管理共有に置いた名前付きパイプ経由でやり取りをする
という流れです。なので「管理共有」と「リモートサービス管理」が使えるなら動くはずです。
鍵1.管理共有
要するにファイル共有です。ですからポートは445/tcpでなくとも、NetBIOS時代の137~139でも構いません。
また、UACが有効になっている場合、接続先PCのAdministratorグループのユーザー名・パスワードでも管理共有にアクセスすることができません。この場合はレジストリを編集して、リモートログインの際にはUACが適用されないようにする必要があります。
- [Windows] 管理共有 (C$, D$など) にビルトイン administrator 以外は接続できない | インフラSEの運用・構築メモ
- You Encounter Unexpected Behavior When You Log on to a Remote Computer and UAC Is Enabled
鍵2.リモートサービス管理
これにはMS-RPCが利用されるのですが、2つのトランスポートが用意されています。
手元で試した感じでは先にTCPを試すようで、ファイアウォールでパケットが捨てられてしまうとタイムアウト待ちで時間を取られました。とはいえSMBにフォールバックして動きます。
MS-RPCはプリンタの共有にも使われるため、ファイル共有を使っている場合はポートマッパーの135/tcpは既に開いているかもしれません。ただこの場合でもRPC動的ポートはPrintSpoolerに対してしか開いていないので、やはり「リモート サービス管理 (RPC)」などのルールを有効化する必要があります。
「リモート サービス管理」グループにはRPC/TCPに必要な135/tcpと動的ポート、RPC/NPに必要な445/tcpが全部入ってます。
まとめ
RPC/NPがあるので管理共有さえあればなんとかなります。むしろRPC/TCPだけ使えても、管理共有がなければPsExecは動きません。つまり、
ならPsExecは動きます。