Nhiều quản trị viên thường sử dụng netstat
công cụ bảng điều khiển hoặc đồ họa TCPView
để hiển thị thông tin về các kết nối TCP / IP đang hoạt động và mở các cổng TCP trong Windows. Thay vì netstat, bạn có thể sử dụng Get-NetTCPConnection
lệnh ghép ngắn trong PowerShell để nhận thông tin về các kết nối mạng đang hoạt động trong Windows, mở cổng TCP và chạy các quy trình đang sử dụng giao thức TCP / IP. PowerShell giúp bạn dễ dàng viết các tập lệnh phức tạp để lấy thông tin và giám sát các cổng TCP đang mở, các quy trình và các kết nối mạng đã thiết lập.
Cố gắng chạy Get-NetTCPConnection
lệnh mà không có bất kỳ tùy chọn nào.
Giống như netstat, lệnh đã hiển thị danh sách tất cả các kết nối đang hoạt động với địa chỉ IP cục bộ và từ xa, cổng, trạng thái kết nối ( Nghe , Internet được thành lập , TimeWait , Ràng buộc , CloseWait , SynReceive , SynSent ) và ID xử lý (PID) đang sử dụng kết nối TCP này.
Bạn có thể hiển thị danh sách các cổng đang mở (đang nghe) trên máy tính cục bộ của mình:
Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, RemoteAddress, RemotePort, State | Sort-Object LocalPort |ft
Get-NetUDPEndpoint
lệnh ghép ngắn được sử dụng để lấy thông tin về các cổng UDP. Bạn chỉ có thể hiển thị các kết nối bên ngoài (Internet):
Get-NetTCPConnection -AppliedSetting Internet
Bạn có thể hiển thị tên DNS của máy chủ từ xa và tên quá trình cho các kết nối TCP:
Get-NetTCPConnection -State Established |Select-Object -Property LocalAddress, LocalPort,@{name='RemoteHostName';expression={(Resolve-DnsName $_.RemoteAddress).NameHost}},RemoteAddress, RemotePort, State,@{name='ProcessName';expression={(Get-Process -Id $_.OwningProcess). Path}},OffloadState,CreationTime |ft
Tập lệnh PowerShell này đã giải quyết tất cả địa chỉ IP máy chủ thành tên DNS và tên quy trình được chỉ định cho tất cả các kết nối.
Theo tên của PID quy trình mẹ, bạn có thể hiển thị danh sách các dịch vụ Windows có liên quan đang sử dụng mạng:
Get-WmiObject Win32_Service | Where-Object -Property ProcessId -In (Get-NetTCPConnection).OwningProcess | Where-Object -Property State -eq Running | Format-Table ProcessId, Name, Caption, StartMode, State, Status, PathName
Bạn chỉ có thể xem các kết nối mạng được khởi tạo bởi quá trình cụ thể. Để làm điều đó, bạn có thể sử dụng tập lệnh PowerShell sau:
$TrackProcessName = "*chrome*"
$EstablishedConnections = Get-NetTCPConnection -State Established |Select-Object -Property LocalAddress, LocalPort,@{name='RemoteHostName';expression={(Resolve-DnsName $_.RemoteAddress).NameHost}},RemoteAddress, RemotePort, State,@{name='ProcessName';expression={(Get-Process -Id $_.OwningProcess). Path}}, OffloadState,CreationTime
Foreach ($Connection in $EstablishedConnections)
{
If ($Connection.ProcessName -like $TrackProcessName)
{
$Connection|ft
}
}
Bạn có thể sử dụng lệnh ghép ngắn Get-NetTCPConnection trong các tình huống khác nhau. Ví dụ:bạn có thể tạo một tập lệnh PowerShell đơn giản để theo dõi xem kết nối có được thiết lập từ địa chỉ IP cụ thể đến cổng cục bộ được chỉ định hay không và hiển thị thông báo bật lên cho quản trị viên.
Trong ví dụ sau, tập lệnh PowerShell kiểm tra xem kết nối từ địa chỉ IP được chỉ định có xuất hiện trên cổng RDP mặc định 3389 hay không. Nếu kết nối xuất hiện, tập lệnh sẽ hiển thị thông báo bật lên và ghi lại ngày và giờ kết nối vào một tệp văn bản:
$SourceIP = “192.168.13.125”
$TargetPort =”3389”
$log = "C:\PS\rdp_connection_log.txt"
$EstablishedConnections = Get-NetTCPConnection -State Established
Foreach ($Connection in $EstablishedConnections)
{
If (($Connection.RemoteAddress -eq $SourceIP) -and ($Connection.LocalPort -eq $TargetPort))
{
Add-Type -AssemblyName System.Windows.Forms
$global:balmsg = New-Object System.Windows.Forms.NotifyIcon
$path = (Get-Process -id $pid).Path
$balmsg.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
$balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning
$balmsg.BalloonTipText = "New RDP connection to your computer from $($Connection.RemoteAddress)"
$balmsg.BalloonTipTitle = "New RDP connection from ($Connection.RemoteAddress)"
$balmsg.Visible = $true
$balmsg.ShowBalloonTip(10000)
(Get-Date).ToString() + ' ' + $Connection.RemoteAddress + ' an RDP connection is established ' >> $log
}
}
Theo cách tương tự, bạn có thể theo dõi và ghi nhật ký các kết nối mạng qua bất kỳ giao thức nào khác, như SSH, SMB, FTP, SMTP, v.v. Tập lệnh PowerShell này có thể được chuyển đổi thành một dịch vụ Windows sẽ tự động khởi động.
Bạn có thể sử dụng script cùng với script mà chúng ta đã thảo luận trước đó:RDP Brute Force Attack Protection with Powershell.Bạn có thể nhận danh sách các cổng và kết nối TCP đang mở trên các máy tính từ xa bằng cách sử dụng lệnh ghép ngắn xóa PowerShell (Enter-PSSession và Invoke-Command).
Invoke-Command -ComputerName be-dc01 {Get-NetTCPConnection -State Established}
Lệnh ghép ngắn Get-NetTCPConnection (cũng như Test-NetConnection) có thể rất hữu ích để theo dõi và chẩn đoán các kết nối mạng trong Windows.