有網友問起 PowerShell 查詢遠端 Windows 安全事件,在測試環境小測一下但卡在 Windows 防火牆設定。演練了一下觀察系統需要開通哪些防火牆的操作技術,整理筆記分享。

在 Windows 預設設定下,跨主機的 Get-WinEvent 將傳回 The RPC server is unavailable 錯誤訊息:

爬文得知多半是因為遠端主機未啟用防火牆造成,而 RPC 原則上會走 135。而我想驗證真的是連線 135 Port 時被擋,可以怎麼做?

做法是在進階防火牆設定按右鍵選 Properties [1],點開所屬網路位置(延伸閱讀:Windows 的網路位置(公用、私人、網域)與防火牆) [2] (本案例之 10.2.0.4 屬 Public Profile),在 Logging 項目點 Customize [3],將 Log dropped packets 設為 Yes [4]:

重新執行 Get-WinEvent 重現連線被擋的狀況,此時可在 Windows\system32\LogFiles\Firewall\pfirewall.log 查到連線被封鎖的記錄,果真是連 135 Port 被封鎖:

但在 Inbound Rules 加一條開放接受 TCP 135 連線,系統仍會出錯,此時 Log 變成 49666 Port 被封鎖:

49666 Port 推測是隨機決定的,多試幾次可觀察到它會變成不同數字確認了這點。此時有個技巧,可由最後一欄的 pid (Process ID) 2044 查詢它是哪一個程序。在 Task Manager 找到 2044 按右鍵選 Go to service(s):

得知 2044 為 EventLog,Wndows Event Log 服務:

回頭查 135 Port 的 pid 1068,可知它有兩個服務,RpcEptMapper (RPC EndPoint Mapper)、RpcSs (Remote Procedure Call (RPC)):

由此大概可以拼湊出,呼叫端會先用 135 Port 連上 RPC EndPoint Mapper,再決定要用哪個 Port 跟 Windows Event Log 服務溝通。故我們不可能透過開通特定 Port 的方式打通防火牆,應有專屬的設定。靠蒐集到的關鍵字,查到這篇:Setting up Windows to read events from remote computers over a local network.

Inbound Rules 有一些預先設好但未啟用的 Event Log Management 規則,實測有兩個要啟用,分別是 Remote Event Log Management(RPC)、Remote Event Log Management (RPC-EPMAP),可對映到 1068 的 RPC 及 RPC EndPoint Mapper。啟用這兩項規則後,便能在區域網路內使用 Get-WinEvent 查詢 10.2.0.4 的系統事件了。

而觀察這兩條規則,可以發現它們的遠端網址限定 Local subnet,Port 號為特殊設定:RPC Dynamic Ports、RPC EndPoint Mapper,可對映到先前的觀察結果,所有線索都吻合,打完收工。


Comments

# by William

Window防火牆能否限制特定的程式才能連外到特定ip跟port 其餘drop 例c如:\putty.exe才能ptt.cc其他的如c:\temp\putty.exe就不能。我自己測試後不能

# by Jeffrey

to William,所謂的不能是所有 Putty.exe 都放行還是通通都連不出去?

Post a comment