Como ver portas abertas no Windows com Get-NetTCPConnection

Como ver portas abertas no Windows com Get-NetTCPConnection

Você sabe quais portas o seu Windows está expondo agora mesmo? Uma conexão aberta que você não autorizou pode ser malware comunicando com um servidor de comando, um serviço mal configurado ou simplesmente um programa que esqueceu de fechar o socket. O PowerShell tem um cmdlet feito para isso: Get-NetTCPConnection. É mais poderoso que o velho netstat e dá pra filtrar, combinar e automatizar direto no pipeline.

Get-NetTCPConnection vs netstat: qual a diferença?

O netstat -ano existe desde o DOS e ainda funciona — mas a saída é texto puro, difícil de filtrar sem redirecionar pra findstr. O Get-NetTCPConnection retorna objetos PowerShell, então você usa Where-Object, Select-Object, Sort-Object e até exporta pra CSV sem esforço. A diferença prática: filtrar por processo, estado e endereço remoto ao mesmo tempo — algo que no netstat exige dois comandos e regex na mão.

Comandos básicos para começar

Como listar todas as conexões ativas no Windows?

Execute Get-NetTCPConnection sem parâmetros e você vê todas as conexões TCP do sistema, independente do estado. A coluna State é o filtro mais útil:

# Todas as conexões, ordenadas por porta local
Get-NetTCPConnection | Sort-Object LocalPort
# Só o que está escutando (portas abertas aguardando conexão)
Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, State | Sort-Object LocalPort
# Conexões estabelecidas (alguém conectado agora)
Get-NetTCPConnection -State Established | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort

Os estados que mais importam no dia a dia:

  • Listen — porta aberta aguardando conexão. Todo serviço ativo tem pelo menos uma.
  • Established — conexão ativa. Pode ser seu navegador, Teams, atualização em segundo plano ou malware.
  • TimeWait / CloseWait — conexão encerrando. Normal aparecer por alguns segundos após fechar um programa.

Descobrir qual processo usa qual porta

O campo OwningProcess retorna o PID. Para chegar no nome do executável, cruze com Get-Process:

Get-NetTCPConnection -State Listen |
  Select-Object LocalPort, OwningProcess |
  Sort-Object LocalPort |
  ForEach-Object {
    $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
    [PSCustomObject]@{
      Porta      = $_.LocalPort
      PID        = $_.OwningProcess
      Processo   = $proc.Name
      Executavel = $proc.Path
    }
  }

A coluna Executavel mostra o caminho completo do binário. Se aparecer algo em %APPDATA%\Roaming ou %TEMP% escutando em porta incomum, é sinal de alerta — executável legítimo do Windows raramente roda a partir dessas pastas.

Como detectar conexões suspeitas

Qual o jeito mais rápido de ver conexões externas ativas?

Filtre por State Established e exclua endereços locais — o que sobrar são conexões reais para servidores externos.

Get-NetTCPConnection -State Established |
  Where-Object { $_.RemoteAddress -notmatch '^(127\.|::1|0\.0\.0\.0)' } |
  Select-Object LocalPort, RemoteAddress, RemotePort, OwningProcess |
  Sort-Object RemoteAddress

Para cada IP remoto desconhecido, resolva o nome:

[System.Net.Dns]::GetHostEntry("IP_AQUI").HostName

Muito do que aparece é legítimo — telemetria do Windows, CDNs, Office 365. Mas se aparecer IP de país incomum com processo em pasta temporária, confirme a reputação no AbuseIPDB ou VirusTotal antes de agir. Esse tipo de análise casa direto com o que abordamos no post sobre auditoria de segurança com PowerShell no Windows.

Para salvar um snapshot e comparar depois de um incidente:

Get-NetTCPConnection | Export-Csv -Path "$env:USERPROFILE\Desktop\conexoes.csv" -NoTypeInformation

Verificando portas UDP com Get-NetUDPEndpoint

TCP não é a única superfície. UDP aparece em DNS (porta 53), VPNs, jogos online e muito mais. O cmdlet equivalente é Get-NetUDPEndpoint:

# Todos os endpoints UDP ativos
Get-NetUDPEndpoint | Select-Object LocalAddress, LocalPort, OwningProcess | Sort-Object LocalPort

A sintaxe é idêntica — mesmos campos, mesma lógica de cruzamento com Get-Process. A diferença é que UDP não tem estado (não existe "Established"), então você só vê o que está escutando.

Automatizando um alerta simples

Se você administra uma máquina e quer saber quando uma porta nova aparecer em Listen, pode rodar esse snippet via tarefa agendada com schtasks:

$portas_esperadas = @(80, 443, 445, 135, 5040)
$novas = Get-NetTCPConnection -State Listen |
  Where-Object { $_.LocalPort -notin $portas_esperadas }

if ($novas) {
  $novas | Out-File "$env:TEMP\portas_novas.txt"
  # Aqui você pode adicionar: envio de e-mail, escrita no Event Log, etc.
}

Defina $portas_esperadas com o que é normal no seu ambiente — tudo fora da lista vira alerta. Para registrar o evento no log do Windows e cruzar com outras informações de diagnóstico, combine com o que vimos no tutorial de investigação de erros com Get-WinEvent.

Conclusão

Get-NetTCPConnection é uma ferramenta de diagnóstico que todo administrador Windows deveria ter no repertório. Combinar com Get-Process leva menos de 10 linhas de PowerShell e entrega informação que o netstat só daria com pipes e regex. Se você está começando agora, o post de introdução ao PowerShell para iniciantes cobre os conceitos de pipeline e filtragem que tornam esses comandos possíveis.

Comentários