うならぼ

どうも。

PsExecの動作にRPC用のポートは必要ない

ローカル・リモートコンピュータ上で任意のプログラムを実行し、入出力をリダイレクトしてくれるPsExecというツールがあります。XP時代からあるツールで、本家Sysinternalsの他にも色んなブログで紹介されています。

そんな便利で恐いツールは下準備が色々必要なんでしょう?ポート開放とか。と思って調べてみると、次の3種類のポートが必要という話を見つけました。

  • 135/tcp(RPCエンドポイント・マッパー)
  • 445/tcp(ダイレクト・ホスティングSMB)
  • 1025~65535/tcp(RPC動的ポート)

(中略)

Windows 7Windows Server 2008 R2などの「セキュリティが強化された Windows ファイアウォール」の場合は、[受信の規則]で[グループ]が「リモート サービス管理」である項目をすべて有効化する。

Tech TIPS:PsExecを使ってリモートのWindows PC上のプログラムを実行する - @IT

ファイル共有は設定しているけど、RPCなんて怪しげなもの、ましてリモートサービス管理なんて有効にした覚えはない。ファイアウォールの設定を見ても、それらのルールは無効化されている。でも PsExec は通ってしまった。何故・・・?

PsExecが動く仕組み

PsExec | Systems Management content from Windows IT Pro

上の記事に作者による解説があります。種明かしは最後の見出しに書かれていますが、要するに

  1. 任意のコマンドを実行して名前付きパイプに流すプログラムを用意しておく
  2. SMBの管理共有でこのプログラムを転送
  3. リモートサービス管理でこのプログラムをサービスとして起動
  4. SMBの管理共有に置いた名前付きパイプ経由でやり取りをする

という流れです。なので「管理共有」と「リモートサービス管理」が使えるなら動くはずです。

鍵1.管理共有

要するにファイル共有です。ですからポートは445/tcpでなくとも、NetBIOS時代の137~139でも構いません。

また、UACが有効になっている場合、接続先PCのAdministratorグループのユーザー名・パスワードでも管理共有にアクセスすることができません。この場合はレジストリを編集して、リモートログインの際にはUACが適用されないようにする必要があります。

鍵2.リモートサービス管理

これにはMS-RPCが利用されるのですが、2つのトランスポートが用意されています。

  • RPC/TCP: ポートマッパー用の135/tcpと、それによって割り当てられたポート (Windowsファイアウォール上は「RPC動的ポート」)
  • RPC/NP: SMBやCIFSで使うポート

手元で試した感じでは先にTCPを試すようで、ファイアウォールでパケットが捨てられてしまうとタイムアウト待ちで時間を取られました。とはいえSMBにフォールバックして動きます。

MS-RPCはプリンタの共有にも使われるため、ファイル共有を使っている場合はポートマッパーの135/tcpは既に開いているかもしれません。ただこの場合でもRPC動的ポートはPrintSpoolerに対してしか開いていないので、やはり「リモート サービス管理 (RPC)」などのルールを有効化する必要があります。

「リモート サービス管理」グループにはRPC/TCPに必要な135/tcpと動的ポート、RPC/NPに必要な445/tcpが全部入ってます。

まとめ

RPC/NPがあるので管理共有さえあればなんとかなります。むしろRPC/TCPだけ使えても、管理共有がなければPsExecは動きません。つまり、

  • ファイル共有が有効になっていて
  • NetBIOS時代の137~139か445/tcpが開いていて
  • UAC周りがよしなにされている

ならPsExecは動きます。