Técnicas de Rastreio(Scan) de Portas

Como um novato executando uma reparação automóvel posso perder horas tentando usar minhas ferramentas rudimentares (martelo, fita adesiva, grifo, etc.) nas tarefas. Quando eu falho miseravelmente e reboco minha lata-velha para um mecânico de verdade ele invariavelmente pesca aqui e ali em um enorme baú de ferramentas até pegar a coisa perfeita que torna a tarefa numa brincadeira. A arte de rastrear(scaning) portas é similar. Os peritos entendem as dezenas de técnicas de rastreio(scan) e escolhem as que são apropriadas (ou uma combinação) para uma dada tarefa. Usuários inexperientes e script kiddies, por outro lado, tentam resolver todos os problemas com o scan SYN default. Uma vez que o Nmap é gratuito a única barreira para a mestria em rastreio(scaning) de portas é o conhecimento. Isso certamente é melhor que no mundo automóvel onde pode ser necessário uma grande habilidade para determinar que precisa de um compressor de molas e então tem que pagar milhares de euros por um.

A maioria dos tipos de rastreio(scan) está disponível apenas para usuários privilegiados. Isso acontece porque eles enviam e recebem pacotes em estado bruto(raw), o que requer acesso de root em sistemas Unix. Utilizar a conta de administrador no Windows é recomendado, embora o Nmap às vêzes funcione com usuários sem privilégios nessa plataforma quando o WinPcap foi carregado no SO. Requerer privilégio de root era uma séria limitação quando o Nmap foi lançado em 1997, pois muitos usuários apenas tinham acesso a contas de shell compartilhadas. Agora o mundo é diferente. Computadores estão mais baratos, muito mais pessoas tem acesso directo e permanente à Internet e computadores desktop Unix (incluindo Linux e MAC OS X) são comuns. Uma versão para o Windows do Nmap se encontra actualmente disponível permitindo que se use em muito mais computadores desktop. Por todas essas razões os usuários têm menos necessidade de executar o Nmap a partir de contas de shell compartilhadas e limitadas. Isso é muito bom pois as opções privilegiadas tornam o Nmap muito mais poderoso e flexível.

Embora o Nmap tente produzir resultados precisos tenha em mente que todas as deduções são baseadas em pacotes devolvidos pelas máquinas-alvo (ou firewalls na frente delas). Tais anfitriões(hosts) podem não ser confiáveis e enviar respostas com o propósito de confundir ou enganar o Nmap. Muito mais comum são os anfitriões(hosts) não-de-acordo-com-a-rfc que não respondem como deveriam às sondagens do Nmap. As sondagens FIN, Null e Xmas são particularmente suscetíveis a esse problema. Tais questões são específicas de determinados tipos de scan e portanto são discutidos nas entradas individuais de cada um dos tipos.

Esta seção documenta as dezenas de técnicas de rastreio(scan) de portas suportadas pelo Nmap. Apenas um método pode ser utilizado de cada vezm excepto que um scan UDP (-sU) pode ser combinado com qualquer um dos tipos de scan TCP. Como uma ajuda para a memória as opções dos tipos de rastreio(scan) de portas estão no formato -s<C>, onde <C> é um caracter proeminente no nome do rastreio(scan), normalmente o primeiro. A única excepção a essa regra é para o rastreio(scan) denominado FTP bounce (-b). Por default o Nmap executa um rastreio(scan) SYN, embora ele substitua por um rastreio(scan) Connect() se o usuário não tiver os privilégios adequados para enviar pacotes em estado bruto(raw) (requer acesso de root no UNIX) ou se alvos IPv6 forem especificados. Dos rastreios(scans) listados nesta secção os usuários não privilegiados podem apenas executar os rastreios(scans) connect() e ftp bounce.

-sS (rastreio(scan) TCP SYN)

O rastreio(scan) SYN é a opção de rastreio(scan) default e a mais popular por boas razões. Pode ser executada rapidamente fazendo o rastreio(scan) a milhares de portas por segundo em uma rede rápida, não bloqueada por firewalls intrusivos. O rastreio(scan) SYN é relativamente não-obstrusivo e camuflado, uma vez que ele nunca completa uma conexão TCP. Ele também trabalha contra qualquer pilha TCP padronizada ao invés de depender de factores específicos de plataformas como os rastreios(scans) Fin/Null/Xmas, Maimon e Idle fazem. Ele também permite uma diferenciação limpa e confiável entre os estados aberto (open), fechado (closed), e filtrado (filtered).

Esta técnica é freqüentemente chamada de rastreio(scan) de porta entreaberta (half-open scanning), porque não abre uma conexão TCP completamente. Você envia um pacote SYN, como se fosse abrir uma conexão real e então espera uma resposta. Um SYN/ACK indica que a porta está ouvindo (aberta) enquanto um RST (reset) é indicativo de uma não-ouvinte. Se nenhuma resposta é recebida após diversas retransmissões a porta é marcada como filtrada. A porta também é marcada como filtrada se um erro ICMP de inalcançável é recebido (tipo 3, código 1,2, 3, 9, 10, ou 13).

-sT (rastreio(scan) TCP connect())

O rastreio(scan) TCP Connect() é o rastreio(scan) default do TCP quando o rastreio(scan) SYN não é uma opção. Esse é o caso quando o usuário não tem privilégios para criar pacotes em estado bruto(raw) ou rastrear redes IPv6. Ao invés de criar pacotes em estado bruto(raw) como a maioria dos outros tipos de rastreio(scan) fazem, o Nmap pede ao sistema operativo para estabelecer uma conexão com a máquina e porta alvos enviando uma chamada de sistema connect(). Essa é a mesma chamada de alto nível que os navegadores da web, clientes P2P, e a maioria das outras aplicações para rede utilizam para estabelecer uma conexão. É parte do interface de programação conhecida como API de Sockets de Berkeley. Ao invés de ler as respostas em pacotes em estado bruto(raw) directamente dos fios, o Nmap utiliza esta API para obter informações do estado de cada tentativa de conexão.

Quando um rastreio(scan) SYN está disponível é normalmente a melhor escolha. O Nmap tem menos controle sobre a chamada de alto nível connect() do que sobre os pacotes em estado bruto(raw) tornando-o menos eficiente. A chamada de sistema completa as conexões nas portas-alvo abertas ao invés de executar o reset de porta entreaberta que o rastreio(scan) SYN faz. Isso não só leva mais tempo e requer mais pacotes para obter a mesma informação mas também torna mais provável que as máquinas-alvo registrem a conexão. Um sistema IDS decente irá detectar qualquer um deles, mas a maioria das máquinas não tem esse tipo de sistema de alarme. Muitos serviços na maioria dos sistema Unix irão acrescentar uma nota na syslog e às vêzes uma mensagem de erro obscura, quando o Nmap se conecta e então fecha a conexão sem enviar nenhum dado. Serviços verdadeiramente patéticos irão travar quando isso acontecer embora isso seja incomum. Um administrador que vê um punhado de tentativas de conexão nos registros vindos de um único sistema deveria saber que foi rastreado(scanned) com connect.

-sU (rastreios(scans) UDP)

Embora os serviços mais populares na Internet operem sobre o protocolo TCP, os serviços UDP são amplamente difundidos. O DNS, o SNMP e o DHCP (registrados nas portas 53, 161/162, e 67/68) são três dos mais comuns. Pelo facto do rastreio(scan) UDP ser normalmente mais lento e mais difícil que o TCP alguns auditores de segurança ignoram essas portas. Isso é um erro pois serviços UDP passíveis de exploração são bastante comuns e invasores certamente não ignoram o protocolo inteiro. Felizmente o Nmap pode ajudar a inventariar as portas UDP.

O rastreio(scan) UDP é activado com a opção -sU. Ele pode ser combinado com um tipo de rastreio(scan) TCP como o rastreio(scan) SYN (-sS) para averiguar ambos protocolos na mesma execução.

O SYN UDP funciona enviando um cabeçalho UDP vazio (sem dados) para cada porta pretendida. Se um erro ICMP de porta inalcançável (tipo 3, código 3) é retornado a porta está fechada. Outros erros do tipo inalcançável (tipo 3, códigos 1, 2, 9, 10, ou 13) marcam a porta como filtrada. Ocasionalmente um serviço irá responder com um pacote UDP provando que está aberta. Se nenhuma resposa é recebida após as retransmissões a porta é classificada como aberta|filtrada. Isso significa que a porta poderia estar aberta ou talvez que filtros de pacotes estejam bloqueando a comunicação. Rastreios(scans) de versões (-sV) podem ser utilizados para ajudar a diferenciar as portas verdadeiramente abertas das que estão filtradas.

Um grande desafio com o rastreio(scan) UDP é fazê-lo rapidamente. Portas abertas e filtradas raramente enviam alguma resposta, deixando o Nmap esgotar o tempo (time out) e então efectuar retransmissões para o caso de a sondagem ou a resposta ter sido perdida. Portas fechadas são normalmente um problema ainda maior. Elas costumam enviar de volta um erro ICMP de porta inalcançável. Mas, ao contrário dos pacotes RST enviados pelas portas TCP fechadas em resposta a um rastreio(scan) SYN ou Connect, muitos anfitriões(hosts) limitam a taxa de mensagens ICMP de porta inalcançável por default. O Linux e o Solaris são particularmente rigorosos quanto a isso. Por exemplo, o kernel 2.4.20 do Linux limita a quantidade de mensagens de destino inalcançável a até uma por segundo (no net/ipv4/icmp.c).

O Nmap detecta a limitação de taxa e diminui o ritmo de acordo para evitar inundar a rede com pacotes inúteis que a máquina-alvo irá descartar. Infelizmente, um limite como o do Linux de um pacote por segundo faz com que um rastreio(scan) de 65.536 portas leve mais de 18 horas. Idéias para acelerar o rastreio(scan) UDP incluem rastrear(scan) mais anfitriões(hosts) em paralelo, fazer um rastreio(scan) rápido apenas das portas mais comuns primeiro, rastrear(scan) por detrás de um firewall e utilizar --host-timeout para saltar os anfitriões(hosts) lentos.

-sN; -sF; -sX (rastreios(scans) TCP Null, FIN, e Xmas)

Estes três tipos de rastreio(scan) (até mais são possíveis com a opção --scanflags descrita na próxima secção) exploram uma brecha subtil na RFC do TCP para diferenciarem entre portas abertas e fechadas. A página 65 diz que se a porta [destino] estiver FECHADA .... um segmento de entrada que não contenha um RST irá causar o envio de um RST como resposta. Então a página seguinte discute os pacotes enviados a portas abertas sem os bits SYN, RST ou ACK marcados, afirmando que: é pouco provável que chegue aqui, mas se chegar, descarte o segmento e volte.

Quando se rastreia(scan) sistemas padronizados com o texto desta RFC, qualquer pacote que não contenha os bits SYN, RST ou ACK irá resultar em um RST como resposta se a porta estiver fechada e nenhuma resposta se a porta estiver aberta. Contanto que nenhum desses três bits esteja incluídos qualquer combinação dos outros três (FIN, PSH e URG) é válida. O Nmap explora isso com três tipos de rastreio(scan):

rastreio(scan) Null (-sN)

Não marca nenhum bit (o cabeçalho de flag do tcp é 0)

rastreio(scan) FIN (-sF)

Marca apenas o bit FIN do TCP.

rastreio(scan) Xmas(-sX)

Marca as flags FIN, PSH e URG, iluminando o pacote como uma árvore de Natal.

Estes três tipos de rastreio(scan) são exatamente os mesmos em termos de comportamento exceto pelas flags TCP marcadas no pacotes de sondagem. Se um pacote RST for recebido a porta é considerada fechada e nenhuma resposta significa que está aberta|filtrada. A porta é marcada como filtrada se um erro ICMP do tipo inalcançável (tipo 3, código 1, 2, 3, 9, 10, ou 13) for recebido.

A vantagem principal destes tipos de rastreio(scan) é que eles podem bisbilhotar através de alguns firewalls não-orientados à conexão e de routers que filtram pacotes. Outra vantagem é que esses tipos de rastreio(scan) são um pouco mais camuflados do que o rastreio(scan) SYN. Mas não conte com isso -- a maioria dos produtos IDS modernos podem ser configurados para detectá-los. O maior problema é que nem todos os sistemas seguem a RFC 793 ao pé-da-letra. Diversos sistemas enviam respostas RST para as sondagens independentemente do facto da porta estar aberta ou não. Isso faz com que todas as portas sejam classificadas como fechadas. A maioria dos sistemas operativos que fazem isso são Microsoft Windows, muitos dispositivos Cisco, BSDI e o IBM OS/400. Esse rastreio(scan) funciona realmente contra a maioria dos sistemas baseados em Unix. Outro ponto negativo desses rastreios(scans) é que eles não conseguem diferenciar portas abertas de alguns tipos de portas filtradas deixando com a resposta abera|filtrada.

-sA (rastreio(scan) TCP ACK)

Este rastreio(scan) é diferente dos outros discutidos até agora pelo facto de que ele nunca determina se uma porta está aberta (ou mesmo aberta|filtrada). Ele é utilizado para mapear conjuntos de regras do firewall determinando se eles são orientados à conexão ou não e quais portas estão filtradas.

O pacote de sondagem do rastreio(scan) ACK tem apenas a flag ACK marcada (a menos que use --scanflags). Quando se rastreia(scan) sistemas não-filtrados as portas abertas e fechadas irão devolver um pacote RST. O Nmap então coloca nelas o rótulo não-filtradas (unfiltered) significando que elas estão alcançáveis pelo pacote ACK, mas se elas estão abertas ou fechadas é indeterminado. Portas que não respondem ou que devolvem certas mensagens de erro ICMP (tipo 3, código 1, 2, 3, 9, 10, ou 13), são rotuladas como filtradas.

-sW (rastreio(scan) da Janela TCP)

Rastreio(scan) da Janela é exactamente o mesmo que o rastreio(scan) ACK excepto que ele explora um detalhe da implementação de certos sistemas de forma a diferenciar as portas abertas das fechadas ao invés de sempre mostrar não-filtrada quando um RST é devolvido. Ele faz isso examinando o campo Janela TCP (TCP Window) do pacote RST devolvido. Em alguns sistemas as portas abertas usam um valor positivo de tamanho de janela (mesmo para pacotes RST) enquanto que as portas fechadas têm um valor igual a zero. Então, ao invés de mostrar sempre uma porta como não-filtrada quando se recebe um RST de volta, o rastreio(scan) da Janela mostra a porta como aberta ou fechada se o valor da Janela TCP no reset for positivo ou zero, respectivamente.

Este rastreio(scan) se baseia em um detalhe de implementação de uma minoria de sistemas na Internet, portanto não se pode confiar sempre nele. Sistemas que não suportam isso irão normalmente devolver todas as portas como fechadas. É claro que é possível que a máquina realmente não tenha nenhuma porta aberta. Se a maioria das portas rastreadas(scaned) estiver fechada mas uns poucos números de portas comuns (tais como 22, 25, 53) estão filtrados, o sistema muito provavelmente está vulnerável. De vez em quando os sistemas irão mostrar exatamente o comportamento oposto. Se o seu rastreio(scan) mostrar 1000 portas abertas e 3 fechadas ou filtradas, então essas três podem muito bem ser as verdadeiramente abertas.

-sM (rastreio(scan) TCP Maimon)

O rastreio(scan) Maimon recebeu o nome de seu descobridor, Uriel Maimon. Ele descreveu a técnica na Phrack Magazine, edição 49 (Novembro de 1996). O Nmap, que incluiu essa técnica, foi lançado duas edições mais tarde. A técnica é exatamente a mesma que os rastreios(scans) Null, FIN e Xmas, exceto que a sondagem é FIN/ACK. De acordo com a RFC 793 (TCP) um pacote RST deveria ser gerado em resposta a tal sondagem se a porta estiver aberta ou fechada. Entretanto, Uriel notou que muitos sistemas derivados do BSD simplesmente descartavam o pacote se a porta estivesse aberta.

--scanflags (rastreio(scan) TCP Customizado)

Usuários verdadeiramente avançados do Nmap não precisam se limitar aos tipos de rastreios(scans) enlatados oferecidos. A opção --scanflags permite que desenhe seu próprio rastreio(scan) permitindo a especificação de flags TCP arbitrárias. Deixe sua imaginação correr solta enquanto dribla sistemas de detecção de intrusão cujos fabricantes apenas olharam rapidamente a página man do Nmap adicionando regras específicas!

O argumento do --scanflags pode ser um valor numérico da marca (flag) como o 9 (PSH e FIN), mas usar nomes simbólicos é mais fácil. Apenas esprema alguma combinação de URG, ACK, PSH, RST, SYN, e FIN. Por exemplo, --scanflags URGACKPSHRSTSYNFIN marca tudo, embora não seja muito útil para rastreio(scan). A ordem em que essas marcas são especificadas é irrelevante.

Além de especificar as marcas desejadas pode especificar um tipo de rastreio(scan) TCP (como o -sA ou -sF). Esse tipo-base diz ao Nmap como interpretar as respostas. Por exemplo, um rastreio(scan) SYN considera nenhuma-resposta como uma indicação de porta filtrada enquanto que um rastreio(scan) FIN trata a mesma como aberta|filtrada. O Nmap irá se comportar da mesma forma que o tipo de rastreio(scan)-base escolhido, excepto que ele irá usar as marcas TCP que especificar. Se não escolher um tipo-base, o rastreio(scan) SYN é utilizado.

-sI <hostzumbi[:portadesondagem]> (rastreio(scan) Idle)

Este método avançado de rastreio(scan) permite um rastreio(scan) TCP realmente cego das portas do alvo (significando que nenhum pacote é enviado para o alvo do seu endereço IP real). Ao invés disso um ataque canal-lateral (side-channel) explora a previsível geração de sequência de ID, consequência da fragmentação do IP no anfitrião(host) zumbi, para juntar informações sobre as portas abertas no alvo. Sistemas IDS irão mostrar o rastreio(scan) como se viessem da máquina zumbi que especificou (que deve estar activa e obedecer a alguns critérios). Este tipo fascinante de rastreio(scan) é complexo demais para se descrever completamente aqui neste guia de referência, então eu escrevi e postei um trabalho informal com detalhes completos em https://nmap.org/book/idlescan.html.

Além de ser extraordinariamente camuflado (devido à sua natureza cega), este tipo de rastreio(scan) permite mapear relações de confiança baseadas em IP entre máquinas. A listagem de portas mostra as portas abertas da perspectiva do anfitrião(host) zumbi. Portanto pode tentar rastrear(scan) um alvo usando vários zumbis que acha que podem ser confiáveis (via regras de router/filtro de pacotes).

Você pode adicionar os dois-pontos seguindo do número da porta ao nome do anfitrião(host) zumbi, se quiser sondar uma porta em particular no zumbi verificando as mudanças de IPID. Do contrário o Nmap irá utilizar a porta que ele normalmente usa por default para pings tcp (80).

-sO (Rastreios(Scans) do protocolo IP)

Scans do Protocolo IP permitem que determine quais protocolos IP (TCP, ICMP, IGMP, etc.) são suportados pelas máquina-alvo. Isso não é tecnicamente um rastreio(scan) de portas, pois ele varia os números do protocolo IP ao invés dos números de portas TCP e UDP. Ainda assim, ele utiliza a opção -p para seleccionar os números de protocolos a rastrear(scan), mostra os resultados dentro do formato normal da tabela de portas e até usa o mesmo mecanismo de rastreio(scan) dos métodos de descoberta de portas. Portanto ele é parecido o suficiente com um rastreio(scan) de portas e por isso pertence a este lugar.

Além de ser útil de certa forma, o rastreio(scan) de protocolo mostra o poder do software de código aberto. Embora a idéia fundamental seja bastante simples, eu não tinha pensado em adicioná-la e nem havia recebido nenhuma solicitação para essa funcionalidade. Então, no verão de 2000, Gerhard Rieger concebeu a idéia, escreveu uma excelente alteração (patch) implementando-a e enviou-a para a lista de discussão nmap-hackers. Eu incorporei a alteração na árvore do Nmap e lancei uma nova versão no dia seguinte. Poucos produtos de software comercial tem usuários entusiasmados o suficiente para desenhar e contribuir com melhorias!

O rastreio(scan) de protocolo funciona de uma forma similar a um rastreio(scan) UDP. Ao invés de ficar repetindo alternando o campo de número de porta de um pacote UDP, ele envia cabeçalhos de pacote IP e faz a repetição alternando o campo de protocolo IP de 8 bits. Os cabeçalhos normalmente estão vazios, sem conter dados, nem mesmo o cabeçalho apropriado do suposto protocolo. As três excepções são o TCP, o UDP e o ICMP. Um cabeçalho de protocolo apropriado para estes é incluído, uma vez que alguns sistemas não os enviarão caso não tenham e porque o Nmap tem as funções para criá-los ao invés de observar as mensagens de erro ICMP de porta inalcançável, o rastreio(scan) de protocolo fica de olho nas mensagens ICMP de protocolo inalcançável. Se o Nmap recebe qualquer resposta de qualquer protocolo do anfitrião(host)-alvo, o Nmap marca esse protocolo como aberto. Um erro ICMP de protocolo não-alcançável (tipo 3, código 2) faz com que o protocolo seja marcado como fechado. Outros erros ICMP do tipo inalcançável (tipo 3, código 1, 3, 9, 10, ou 13) fazem com que o protocolo seja marcado como filtrado (embora eles provem, ao mesmo tempo, que o ICMP está aberto). Se nenhuma resposta for recebida após as retransmissões, o protocolo é marcado como aberto|filtrado.

-b <anfitrião(host) para relay de ftp> (Rastreio(Scan) de FTP bounce)

Uma característica interessante do protocolo FTP (RFC 959) é o suporte a conexões denominadas proxy ftp. Isso permite que um usuário conecte-se a um servidor FTP e então solicite que arquivos sejam enviados a um terceiro servidor. Tal característica é sujeita a abusos em diversos níveis, por isso a maioria dos servidores parou de suportá-la. Um dos abusos permitidos é fazer com que o servidor FTP efectue o rastreio(scan) das portas de outros anfitriões(hosts). Simplesmente solicite que o servidor FTP envie um arquivo para cada porta interessante do anfitrião(host)-alvo. A mensagem de erro irá descrever se a porta está aberta ou não. Esta é uma boa forma de passar por cima de firewalls porque os servidores FTP de empresas normalmente são posicionados onde tem mais acesso a outros anfitriões(hosts) internos que os velhos servidores da Internet teriam. O Nmap suporta o rastreio(scan) de ftp bounce com a opção -b. Ela recebe um argumento no formato <nomedousuário>:<senha>@<servidor>:<porta>. <Servidor> é o nome ou endereço IP de um servidor FTP vulnerável. Assim como em uma URL normal, pode omitir <nomedousuário>:<senha>, neste caso as credenciais de login anónimo (usuário: anonymous senha:-wwwuser@) serão usados. O número da porta (e os dois-pontos) podem ser omitidos, e então a porta FTP default (21) no <servidor> será utilizada.

Esta vulnerabilidade espalhou-se em 1997 quando o Nmap foi lançado mas foi corrigida amplamente. Servidores vulneráveis ainda estão por aí, então pode valer a pena tentar se tudo o mais falhar. Se passar por cima de um firewall é o seu objetivo, faça o rastreio(scan) da rede-alvo procurando por uma porta 21 aberta (ou mesmo por qualquer serviço FTP se rastrear(scan) todas as portas com a detecção de versão), então tente um rastreio(scan) bounce usando-as. O Nmap irá dizer se o anfitrião(host) é vulnerável ou não. Se estiver apenas tentando encobrir suas pegadas, não precisa (e, na verdade, não deveria) limitar-se a anfitriões(hosts) na rede-alvo. Antes de sair rastreando endereços aleatórios na Internet procurando por servidores FTP, considere que os administradores de sistemas podem não apreciar o seu abuso nos servidores deles.