Comprobación de conexiones TCP/IP activas en Windows con PowerShell
Muchos administradores suelen utilizar el
netstatherramienta de consola o gráfico
TCPViewpara mostrar información sobre conexiones TCP/IP activas y puertos TCP abiertos en Windows. En lugar de netstat, puede utilizar el
Get-NetTCPConnectioncmdlet en PowerShell para obtener información sobre conexiones de red activas en Windows, puertos TCP abiertos y procesos en ejecución que utilizan el protocolo TCP/IP. PowerShell facilita la escritura de scripts complejos para obtener información y monitorear puertos TCP abiertos, procesos y conexiones de red establecidas.
Intenta ejecutar el
Get-NetTCPConnection
Comando sin ninguna opción.
Al igual que netstat, el comando ha mostrado la lista de todas las conexiones activas con direcciones IP locales y remotas, puertos, estado de conexión (Escuchar, Internet establecida, Tiempo de espera, Bound, CloseWait, SynReceived, SynSent) y el ID de proceso (PID) que utiliza este Conexión TCP.
Puede mostrar una lista de puertos abiertos (de escucha) en su computadora local:
Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, RemoteAddress, RemotePort, State | Sort-Object LocalPort |ftEste
Get-NetUDPEndpointcmdlet se utiliza para obtener información sobre los puertos UDP.
Solo puede mostrar conexiones externas (Internet):
Get-NetTCPConnection -AppliedSetting InternetPuede mostrar nombres DNS de hosts remotos y nombres de procesos para conexiones 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 |ftEste script de PowerShell resolvió todas las direcciones IP de host en nombres DNS y nombres de procesos específicos para todas las conexiones.
Por el nombre de un PID de proceso principal, puede mostrar la lista de servicios de Windows relacionados que están usando la red:
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, PathNamePuede ver solo las conexiones de red iniciadas por el proceso específico. Para hacerlo, puede usar el siguiente script de PowerShell:
$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
}
}Puede usar el cmdlet Get-NetTCPConnection en varios escenarios. Por ejemplo, puede crear un script de PowerShell simple para rastrear si la conexión se establece desde la dirección IP específica al puerto local especificado y mostrar una notificación emergente al administrador.
En el siguiente ejemplo, un script de PowerShell comprueba si aparece una conexión desde la dirección IP especificada en el puerto RDP predeterminado 3389. Si aparece la conexión, el script mostrará una notificación emergente y registrará la fecha y la hora de la conexión en un archivo de texto:
$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
}
}De la misma manera, puede monitorear y registrar conexiones de red sobre cualquier otro protocolo, como SSH, SMB, FTP, SMTP, etc. Este script de PowerShell puede convertirse en un servicio de Windows que se iniciará automáticamente.
Puede usar el script junto con el que discutimos anteriormente: RDP Brute Force Attack Protection with Powershell.
Puede obtener una lista de conexiones y puertos TCP abiertos en equipos remotos mediante los cmdlets remotos de PowerShell (Enter-PSSession e Invoke-Command).
Invoke-Command -ComputerName be-dc01 {Get-NetTCPConnection -State Established}El cmdlet Get-NetTCPConnection (así como Test-NetConnection) puede ser muy útil para rastrear y diagnosticar conexiones de red en Windows.



