← as aulas · Núcleo de Segurança Neon · aula 01

As janelas da máquina

Quantas portas o seu computador tem abertas agora? Quase ninguém sabe responder — e essa é a aula inteira.

começar

a receita, igual em toda aula

1 · o erro

O código errado, como quase todo mundo faz.

2 · o porquê

Por que aquilo é perigoso, em português.

3 · a correção

O código certo.

4 · a prova

O terminal respondendo.

01 A lista escrita à mão

superfície de ataque

1 · o erro

Este foi o primeiro programa do projeto. Dezoito linhas, escritas para responder aquela pergunta — e ele funciona:

import socket

alvo = "127.0.0.1"
portas = [21, 22, 80, 443, 5432]

for porta in portas:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(0.5)

    codigo_retorno = s.connect_ex((alvo, porta))

    if codigo_retorno == 0:
        print(f"Alvo: {alvo} | Porta {porta}: [ ABERTA ]")
    else:
        print(f"Alvo: {alvo} | Porta {porta}: [ FECHADA ]")

    s.close()

O erro não está em nenhuma linha. Está na linha 4:

portas = [21, 22, 80, 443, 5432]

Essa lista foi escrita à mão. Ela só contém as portas em que alguém já tinha pensado.

2 · o porquê

Porta aberta é um programa esperando conexão. É uma janela: alguém do lado de fora pode bater. Se o programa que atende tiver um defeito, é por ali que se entra.

Um scanner de lista fixa responde "as cinco que você perguntou estão assim". Mas a porta que derruba uma máquina é quase sempre a que o dono não sabia que existia — aberta por um programa que ele instalou e esqueceu.

E tem uma diferença que decide tudo, escrita no endereço:

  • 127.0.0.1:5432Só a própria máquina alcança. É uma porta para dentro de casa — o Postgres, aqui, está assim.
  • 0.0.0.0:8777Qualquer aparelho na mesma rede alcança. O 0.0.0.0 quer dizer "por todas as entradas". É porta para a rua.

O mesmo programa, o mesmo código, com uma diferença de endereço — e um está disponível para a casa inteira do vizinho.

3 · a correção

Não adivinhe a lista. O sistema já tem ela inteira e responde na hora:

ss -tulpn | grep LISTEN

Lê-se: mostre os soquetes tcp e udp que estão escutando (l), com o programa dono de cada um e o número da porta sem traduzir para nome.

Decore este comando. Rode de novo toda vez que instalar qualquer coisa — é aí que aparecem as janelas que você não abriu de propósito.

4 · a prova

O scanner de lista fixa, rodando de verdade. Cinco portas perguntadas, uma aberta:

$ python3 neon_core.py
Alvo: 127.0.0.1 | Porta 21: [ FECHADA ]
Alvo: 127.0.0.1 | Porta 22: [ FECHADA ]
Alvo: 127.0.0.1 | Porta 80: [ FECHADA ]
Alvo: 127.0.0.1 | Porta 443: [ FECHADA ]
Alvo: 127.0.0.1 | Porta 5432: [ ABERTA ]

Conclusão do scanner: uma janela aberta. Agora a mesma máquina, no mesmo dia, perguntando para o sistema em vez de adivinhar:

$ ss -tulpn | grep -c LISTEN
20

Vinte. O scanner tinha achado uma. Ele não errou — ele respondeu exatamente o que foi perguntado. A lista curta era a pergunta curta.

Das vinte, dezenove estavam em 127.0.0.1, portas para dentro. Uma estava em 0.0.0.0, porta para a rua — e era um programa do próprio dono, ligado com uma opção --rede que ele mesmo digitou, semanas antes, para abrir o painel pelo celular.

Não era invasão. Era uma escolha antiga que ninguém tinha revisto.

o scanner das 18 linhas existe hoje só na captura de tela de 4 de setembro de 2026, 10:06 — foi reescrito no mesmo arquivo no dia seguinte. A saída acima é a da captura das 10:00.

antes de publicar esta página

O que foi apagado daqui

Uma aula sobre não vazar segredo não pode vazar o segredo de quem escreve. A lista completa das vinte portas não está nesta página: ela diz quais programas rodam nesta máquina e por onde entrar em cada um.

Ficou o número, que ensina, e sumiu o mapa, que entrega. Essa decisão é a aula 06 — e você toma ela toda vez que publica uma foto do seu terminal.

para levar

Porta aberta quase nunca é invasão. É escolha — sua, antiga, esquecida. O trabalho não é fechar tudo: é conseguir explicar, uma por uma, por que cada janela está aberta.

Núcleo de Segurança Neon · aula 01 de 6 · todo código desta página foi copiado de um arquivo real do projeto — nenhum exemplo foi inventado