30代半ばの事務職員がITエンジニアになった話

おおよそタイトルのとおり、30代半ばにしてITエンジニアのタマゴになってしまった会社員の話

【Windows】ファイヤーウォールのポートを閉じてリモートデスクトップで接続できない

いろいろあって、
FTPSの通信に使われているポートの
検証のためにWindowsサーバーの
ファイヤーウォールのポート
1024から65536までを閉じる設定をして
ファイヤーウォールを有効にする
ボタンを押した瞬間、

「ブツッ」

リモートデスクトップが切断される…
リモートデスクトップで使用されている
3389ポートを閉じてしまったのだから
当然だが、途方もないやっちまった感と
素人丸出し感に多少の自虐を覚える


きっと誰もが通る道だ
と言い聞かせながら解決策をさぐる

その1 net use と sc コマンド


コマンドプロンプトからサービスの
制御ができる net コマンドと
sc コマンドがあるらしい


どうやらnetコマンドは自身のみ
scコマンドはネットワークのPCの
サービスを制御できるっぽい


でもネットワーク上のPCに
ログインするためには
net use コマンドを使う
このへんはよく理解してない

まずネットワーク上のPCにadmin権限でログイン
net use \\192.168.0.10 /user:[ユーザー名] [パスワード]

PCを指定してサービスをストップ
sc \\192.168.0.10 stop mpssvc
(mpssvcはファイヤーウォールのサービス名)

ログアウトする
net use \\192.168.0.10 /delete


意外と簡単にリカバリできたじゃん
と思いきや


通信ができなくなる
pingも通らない
電源はON
つまりハングってる状態


AWSのようなクラウド環境だったので
コンソールからの再起動で
最悪の状態からは復帰できたが


しかし、原因は不明
たまたまだったのか
サービスを起動するときの
アカウントが
LocalServiceになっていることが
関係しているのだろうか…

f:id:ykk333:20190930223053p:plain
ファイヤーウォールのサービスの実行アカウント


その2 Telnet


なんとなく古風な通信方式のイメージ
しかしポートはLinuxSSHでおなじみの
22ポート、ということはわりと
何でもできるのでは?と期待大

telnet 192.168.0.10

が、事前にサーバーにTelnetをインストール
しておく必要があるらしく

NG

その3 PowerShell (WinRM)


名前はよく聞くけど実は理解していない
「今どきはbatchじゃなくてpowershell
だよな!」なんて話を聞いた
batchよりもっと複雑な処理ができる、
みたいなイメージなんだけど
合ってるだろうか


こんなかんじでリモートでbatchを起動できるようだ

PS> Invoke-Command -ComputerName 192.168.0.10 -Credential [user] {C:\test.bat}


が、これも事前にファイヤーウォール

Windows リモート管理 (HTTP 受信)

を有効にしておく必要があるらしい
しかもポートは5985…

どちらにしてもNG


その4 WMI


わりと簡単な手順とコマンドで
いろんなことができそうなサービス
以前に別のところで使ったことがあるので
いけるのではないかと思ったが

WMIC /NODE:192.168.0.10 /user:[user] /password:[pass] process call create "C:\test.bat"


これも事前にファイヤーウォール

Windows Management Instrumentation (WMI)

グループを有効化しておく必要がある


やむなくNG


その4 PsExec


Windows純正のソフトをクライアントに
入れて実行するといろいろできるらしい


が、使用するのは
135ポート
445ポート
1025~65535ポート


ということでNG


使用する場合には

PsExec.exe -u [user] -p [pass] \\192.168.0.10 C:\test.bat

のようにするみたい

その5 タスクスケジューラ


atコマンド

at \\192.168.0.10 09:00 C:\test.bat

のようなかんじで
タスクスケジューラを外部から
操作できるらしい


しかし事前にファイヤーウォール

ファイルとプリンターの共有

グループを有効化しておく必要がある
ファイルの共有自体はできていたので
グループのなかの必要な項目が
有効になっていなかったのだと思われる


atコマンドより高機能なschtasksコマンドが
あるらしい

schtasks /Create /S 192.168.0.10 /U [user] /P [pass] /TN sample /SC ONCE /SD 1900/01/01 /ST 00:00 /TR C:\test.bat
schtasks /Run /S 192.168.0.10 /U [user] /P [pass] /TN sample

のように使う

こちらもファイヤーウォール

スケジュールされたリモート タスク管理

グループを有効化しておく必要があり


やっぱりNG


しかしまだタスクスケジューラを
あきらめない、あきらめたら試合終了だ


幸いにもファイル共有はいきているので

net use \\192.168.0.10 /user:[ユーザー名] [パスワード]

でログインしたあと


エクスプローラーのアドレスバーに

\\192.168.0.10\C$

と打ち込むとサーバーの
ディレクトリが表示されて
読み込みも書き込みもできる


タスクスケジューラのタスクは
下記のフォルダにxml形式で
保存されているので
開いて中身を確認できる

C:\Windows\System32\Tasks


たまたま毎日定時に実行している
どうでもいいbatchがあった


(ちなみにここのファイルを直接編集しても
反映されずエラーになるので都合のいい
タスクがないとお手上げ)


batchファイルの最初の行に

netsh advfirewall set allprofiles state off

を追加してbatchが起動したら
ファイヤーウォールをすべて
無効化するように仕込む


これでスケジューラが起動したら
ファイヤーウォールが無効化されて
復旧完了、と翌朝ウキウキして
確認すると


batchがうごいていない…


こればっかりは謎のまま


それはともかくとして
万策が尽きてくる

その6 リモートでレジストリを変更


レジストリエディタを開き、

ファイル⇒ネットワークレジストリへの接続
"選択するオブジェクト名を選択してください"に
\\192.168.0.10を入力⇒OK

f:id:ykk333:20191002230556p:plain
レジストリエディタ


これでサーバーのレジストリを開ける


これもおそらくファイヤーウォール
リモートレジストリを受け付けるか
どうかの設定があるのだろうけど
意外にも有効になっていたらしい

\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\PublicProfile
\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile
\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile

がそれぞれファイヤーウォール
・パブリックプロファイル
ドメインプロファイル
・プライベートプロファイル
に相当すると思われる


それぞれの

EnableFirewallのデータ値を(0)に設定

することでファイヤーウォール
無効になる


ただし設定値を有効にするには
再起動が必要


実はいろいろあって再起動しておらず
というのは結局クラウドのコンソールから
復旧できたりしたので顛末は不明のまま



しかし、不測の事態に備えて
リモートデスクトップ以外でも
ある程度操作できるようにしておいた
ほうがいいのではと思う反面、
セキュリティホールにもなり得るので
ある意味ジレンマなのだと思う

(今回の件もどうにかして侵入して
ファイヤーウォールを無効化とか
ハッキングにも通ずる気がするし)

ともあれ
トラブルの対策がいちばん技術の
上達に役立つという話