Descoberta de Hosts

Um dos primeiros passos em qualquer missão de reconhecimento de uma rede é reduzir um conjunto (às vezes enorme) de faixas de endereços IP, em uma lista de anfitriões(hosts) activos e interessantes. Efectuar o rastreio(scan) de cada porta de cada endereço IP é lento e normalmente desnecessário. É claro que o que torna um anfitrião(host) interessante depende muito do propósito do rastreio(scan). Administradores de rede podem estar apenas interessados em hosts que executam um determinado serviço, enquanto os auditores de segurança podem se importar com cada dispositivo que possuir um endereço IP. Um administrador pode se sentir à vontade em usar o ping ICMP para localizar os anfitriões(hosts) na rede interna, enquanto um profissional externo de análise de vulnerabilidades (penetration tester) pode utilizar um conjunto diversificado de dezenas de sondagens numa tentativa de enganar as restrições da firewall.

As necessidades para o descobrimento de anfitrião(host) são muito diversas e, por isso, o Nmap oferece uma ampla variedade de opções para customizar as técnicas utilizadas. A descoberta de anfitrião(host) às vezes é chamada de rastreo ping(ping scan), mas ela vai muito além dos simples pacotes ICMP de echo request associados com a popular ferramenta conhecida como ping. Os usuários podem saltar a etapa do ping inteiramente com uma lista de rastreio(scan) (-sL) ou desactivado o ping (-P0), ou enfrentar a rede com combinações arbitrárias de sondagens multi-portas TCP SYN/ACK, UDP, e ICMP. O objetivo dessas sondagens é solicitar respostas que mostrem que um endereço IP está realmente activo (é utilizado por um afitrião(host) ou dispositivo de rede). Em muitas redes, apenas uma pequena percentagem dos endereços IP está activa em um dado momento. Isso é particularmente comum com o espaço de endereçamento privado ao abrigo do RFC1918 como, por exemplo, 10.0.0.0/8. Essa rede tem 16 milhões de IPs, mas eu já a vi sendo utilizado em empresas com menos de mil máquinas. A descoberta de anfitriões(hosts) pode encontrar essas máquinas escassamente alocadas em um mar de endereços IP.

Se nenhuma opção de descoberta de hosts for dada, o Nmap envia um pacote TCP ACK destinado a porta 80 e uma procura ICMP Echo Request a cada máquina-alvo. Uma exceção a isso é que um rastreio(scan) ARP é utilizado para cada alvo localizado na rede ethernet local. Para usuários Unix sem privilégios de shell, um pacote SYN é enviado ao invés do ack utilizando a chamada de sistema connect(). Esses valores default equivalem às opções -PA -PE. Esta descoberta de anfitrião(host) frequentemente é suficiente para o rastreio(scan) de redes locais, mas um conjunto de sondagens mais abrangentes é recomendado para auditoria de segurança.

As opções -P* (que seleccionam tipos de ping) podem ser combinadas. Você pode aumentar as chances de penetrar numa firewall enviando muitos tipos de sondagens, utilizando diferentes portas/flags TCP e códigos ICMP. Note também que a descoberta por ARP (-PR) é feita por default contra alvos na rede ethernet local mesmo que especifique outras opções -P* , porque é quase sempre mais rápida e mais eficiente.

As seguintes opções controlam a descoberta de anfitriões(hosts).

-sL (Listagem de rastreio(scan))

A listagem de rastreio(scan) é uma forma degenerada de descoberta de anfitriões(hosts) que simplesmente lista cada anfitrião(host) da rede especificada, sem enviar nenhum pacote aos hosts-alvos. Por default o Nmap fará a resolução de DNS dos anfitriões(hosts) para descobrir seus nomes. Ainda é surpreendente a quantidade de informações úteis que simples nomes de hosts podem dar. Por exemplo, fw.chi.playboy.com é o firewall do escritório de Chicago da Playboy Enterprises. Nmap também reporta o número total de endereços IP ao final. A listagem de rastreio(scan) é um bom teste de sanidade para assegurar que está com a lista correta de endereços IP dos seus alvos. Se os anfitriões(hosts) mostrarem nomes de domínios que não reconhece, vale a pena investigar melhor para evitar o rastreio(scan) da rede da empresa errada.

Uma vez que a idéia é apenas mostrar uma lista dos hosts-alvos, as opções de funcionalidade de nível mais alto tais como o rastreio(scan) de portas, detecção de SO, ou rastreio(scan) utilizando ping, não podem ser combinadas com esta opção. Se deseja desactivar o rastreio(scan) utilizando ping enquanto executa funções de nível elevado, leia a opção -P0.

-sP (Rastreio(scan) usando Ping)

Esta opção diz ao Nmap para somente executar um rastreio(scan) usando o ping (descoberta de anfitriões(hosts)), e então mostrar os hosts disponíveis que responderam ao scan. Nenhum teste adicional (tais como o rastreio(scan) de portas e deteção de SO) é executado. Isto é um pouco mais intrusivo que a listagem de rastreio(scan), e pode ser usado para os mesmos propósitos. Permite um reconhecimento leve de uma rede-alvo sem chamar muita atenção. Saber quantos hosts estão ativos é mais valioso para invasores que a lista fornecida pela listagem de rastreio(scan) com cada endereço IP e seu nome de anfitrião(host).

Administradores de sistemas frequentemente acham esta opção valiosa. Ela pode ser facilmente utilizada para contar o número de máquinas disponíveis em uma rede ou monitorar a disponibilidade dos servidores. Isto é normalmente chamado de varredura com ping (ping sweep), e é mais confiável do que fazer um ping num endereço de broadcast, pois muitos anfitriões(rastreio(scan)hosts) não respondem a pesquisas com broadcast.

A opção -sP envia um ICMP echo request e um pacote TCP para a porta 80 por default. Quando executada por um usuário sem privilégios, um pacote SYN é enviado (usando uma chamada connect()) para a porta 80 no alvo. Quando um usuário privilegiado tenta rastrear(scan) alvos na rede ethernet local, requisições ARP (-PR) são utilizadas, a menos que --send-ip tenha sido especificado. A opção -sP pode ser combinada com qualquer um dos tipos de sondagens de descobrimento (as opções -P* , excluindo -P0) para maior flexibilidade. Se qualquer uma dessas opções de tipos de sondagens e número de porta for utilizada, as sondagens default (ACK e echo request) são sobrepostas. Quando firewalls restritivos estão posicionados entre o host de origem que executa o Nmap e a rede-alvo, utilizar essas técnica avançadas é recomendado. Do contrário, hosts podem ser perdidos quando o firewall ignorar as sondagens ou as respostas delas.

-P0 (Sem ping)

Esta opção salta completamente a fase de descoberta do Nmap. Normalmente o Nmap utiliza este estágio para determinar as máquinas activas para o rastreio(scan) mais agressivo. Por default, o Nmap apenas executa sondagens agressivas tais como o rastreio(scan) de portas, detecção de versões, ou detecções do SO contra afitriões(hosts) que foram verificados como activos. Desactivar a descoberta de anfitriões(hosts) com -P0 faz com que o Nmap teste as funções de rastreio(scan) solicitadas contra todos os endereços IP alvos especificados. Portanto se um espaço de endereçamento alvo do tamanho de uma classe B (/16) for especificado na linha de comando, todos os 65.536 endereços IP serão alvo do rastreio(scan). O segundo caracter da opção -P0 é um zero e não a letra O. A descoberta de anfitriões(hosts) apropriada é desconsiderada como na listagem de rastreio(scan), mas ao invés de parar e mostrar a lista de alvos, o Nmap continua a executar as funções solicitadas como se cada alvo IP estivesse activo.

-PS [listadeportas] (Ping usando TCP SYN)

Esta opção envia um pacote TCP vazio com a flag SYN marcada. A porta de destino default é a 80 (configurada em tempo de compilação pela variável DEFAULT_TCP_PROBE_PORT no nmap.h), mas uma porta alternativa pode ser especificada como um parâmetro. Até uma lista de portas separadas por vírgula pode ser especificada (p.ex. -PS22,23,25,80,113,1050,35000), nesse caso as sondagens serão tentadas contra cada porta em paralelo.

A flag SYN sugere aos sistemas remotos que está tentando estabelecer uma comunicação. Normalmente a porta de destino estará fechada e um pacote RST (reset) será enviado de volta. Se a porta estiver aberta, o alvo irá dar o segundo passo do cumprimento-de-três-vias (3-way-handshake) do TCP respondendo com um pacote TCP SYN/ACK TCP. A máquina executando o Nmap então derruba a conexão recém-criada respondendo com um RST ao invés de enviar um pacote ACK que iria completar o cumprimento-de-três-vias e estabelecer uma conexão completa. O pacote RST é enviado pelo kernel da máquina que está executando o Nmap em resposta ao SYN/ACK inesperado, e não pelo próprio Nmap.

O Nmap não se importa se a porta está aberta ou fechada. Tanto a resposta RST ou SYN/ACK discutidas anteriormente dizem ao Nmap se o hosts está disponível e responsivo.

Em máquinas UNIX apenas o usuário privilegiado root é capaz, normalmente, de enviar e receber pacotes TCP em estado bruto(raw packets). Para usuários não privilegiados um contorno é automaticamente empregado em concordância com a chamada de sistema connect() iniciada contra cada porta-alvo. Isso tem o efeito de enviar um pacote SYN ao anfitrião(host) alvo em uma tentativa de estabelecer uma conexão. Se o connect() retornar com sucesso rápido ou com uma falha ECONNREFUSED, a pilha TCP subjacente deve ter recebido um SYN/ACK ou RST e o anfitrião(host) é marcado como disponível. Se a tentativa de conexão for abandonada até que um timeout ocorra, o host é marcado como indisponível. Esse contorno também é usado para conexões IPv6, pois o suporte a construção de pacotes IPv6 em estado bruto(raw) ainda não está disponível no Nmap.

-PA [listadeportas] (Ping usando TCP ACK)

O ping usando TCP ACK é muito similar ao recém-discutido ping usando SYN. A diferença como poderia imaginar, é que a flag TCP ACK é marcada ou invés da flag SYN. O pacote ACK finge reconhecer dados de uma conexão TCP estabelecida, quando nenhuma conexão existe de facto. Então os anfitriões(hosts) remotos deveriam sempre responder com pacotes RST revelando sua existência no processo.

A opção -PA utiliza a mesma porta default que a sondagem SYM (80) e pode também obter uma lista de portas destino no mesmo formato. Se um usuário privilegiado tenta isto, ou se um alvo IPv6 é especificado, o contorno connect() discutido anteriormente é utilizado. Esse contorno é imperfeito pois o connect() está realmente enviando um pacote SYN ao invés de um ACK.

O motivo para oferecer ambas as sondagens ping, que utilizam SYN e ACK, é maximizar as chances de passar por firewalls. Muitos administradores configuram routers e outros firewalls simples para bloquear a entrada de pacotes SYN excepto aqueles destinados a serviços públicos como o site web da empresa ou servidor de correio electrónico. Isso evita as demais conexões entradas na organização, permitindo aos usuários fazer conexões desobstruidas à Internet. Essa aproximação não-orientada à conexão (non-stateful ou stateless) consome poucos recursos no firewall/router e é amplamente suportada por filtros de hardware e software. O firewall de software Netfilter/iptables do Linux oferece a conveniência da opção --syn para implementar essa abordagem stateless. Quando regras stateless do firewall como essas são implementadas, sondagens de ping usando SYN (-PS) muito provavelmente serão bloqueadas quando forem enviadas à portas fechadas. Nesses casos, a sondagem ACK se destaca pois ela simplesmente passa por essas regras.

Outro tipo comum de firewall utiliza regras orientadas a conexão que descartam pacotes inesperados. Esta característica era encontrada inicialmente apenas em firewalls de alto-nível, embora tenha se tornado mais comum com o passar dos anos. O sistema Netfilter/iptables do Linux suporta esta característica através da opção --state, que categoriza os pacotes baseados no estado da conexão. Uma sondagem SYN tem maiores chances de funcionar contra um sistema assim, pois pacotes ACK inesperados são normalmente reconhecidos como falsos e descartados. Uma solução para esse dilema é enviar ambas as sondagens SYN e ACK especificando -PS e -PA.

-PU [listadeportas] (Ping usando UDP)

Outra opção de descoberta de anfitriões(hosts) é o ping usando UDP, que envia um pacote UDP vazio (a menos que --data-length seja especificado) para as portas informadas. A listadeportas tem o mesmo formato que os discutidos anteriormente nas opções -PS e -PA. Se nenhuma porta for especificada, o default é 31338. Esse default pode ser configurado em tempo de compilação alterando DEFAULT_UDP_PROBE_PORT no nmap.h. Uma porta alta não comum é utilizada como default porque enviar para portas abertas normalmente é indesejado para este tipo particular de rastreio(scan).

Ao bater contra uma porta fechada na máquina-alvo, a sondagem UDP deve criar um pacote ICMP de porta inalcançável como resposta. Isso diz ao Nmap que a máquina está activa e disponível. Muitos outros tipos de erros ICMP, tais como anfitrião(host)/rede inalcançável ou TTL excedido são indicativos de um anfitrião(host) inactivo ou inalcançável. A falta de resposta também é interpretada dessa forma. Se uma porta aberta é alcançada, a maioria dos serviços simplesmente ignoram o pacote vazio e falham em retornar qualquer resposta. É por isso que a porta de sondagem default é 31338, que pouco provavelmente estará em uso. Uns poucos serviços, tal como o chargen, irá responder a um pacote UDP vazio, e com isso revelará ao Nmap que a máquina está disponível.

A principal vantagem deste tipo de scan é que ele passa por firewalls e filtros que apenas examinam o TCP. Por exemplo, uma vez eu tive um router broadband sem-fios Linksys BEFW11S4. A interface externa desse dispositivo filtrava todas as portas TCP por default, mas as sondagens UDP ainda causavam mensagens de porta inalcançável, denunciando assim o dispositivo.

-PE; -PP; -PM (Tipos de Ping do ICMP)

Além dos tipos incomuns de descoberta de anfitriões(hosts) TCP e UDP discutidos anteriormente, o Nmap pode enviar os pacotes-padrão que normalmente são enviados pelo popular programa ping. O Nmap envia um pacote ICMP do tipo 8 (echo request) ao endereço IP alvo, esperando como resposta um tipo 0 (Echo Reply) do anfitrião(host) disponível. Infelizmente para muitos exploradores de rede, muitos anfitriões(hosts) e firewalls actualmente bloqueiam esses pacotes, ao invés de responder como é requerido pela RFC 1122. Por essa razão, rastreios(scans) puramente ICMP são raramente confiáveis o suficiente contra alvos desconhecidos na Internet. Mas para administradores de sistemas monitorando uma rede interna eles podem ser uma abordagem prática e eficiente. Utilize a opção -PE para activar esse comportamento echo request.

Embora o echo request seja a pesquisa padrão de um ping ICMP, o Nmap não pára aqui. A padronização do ICMP (RFC 792) também especifica timestamp request, information request, e pacotes address mask request como códigos 13, 15, e 17, respectivamente. Apesar do propósito ostensivo dessas pesquisas seja obter informações tais como a máscara do endereço e hora corrente, eles podem ser facilmente utilizados para descoberta de anfitriões(hosts). Um sistema que responda está activo e disponível. O Nmap não implementa actualmente os pacotes de requisição de informações, pois eles não são amplamente suportados. A RFC 1122 insiste que um anfitrião(host) NÃO DEVERIA implementar essas mensagens. Pesquisas de marcação de hora (Timestamp) e máscara de endereço podem ser enviadas com as opções -PP e -PM , respectivamente. Uma resposta timestamp reply (código ICMP 14) ou uma resposta address mask reply (código 18) revela que o host está disponível. Essas duas pesquisas podem ser valiosas quando os administradores bloqueiam pacotes echo request especificamente e esquecem que outras pesquisas ICMP podem ser usadas com o mesmo propósito.

-PR (Ping usando ARP)

Um dos cenários de uso mais comuns do Nmap é o rastreio(scan) da LAN ethernet. Na maioria das LANs, especialmente aquelas que utilizam a faixa de endereçamento privado ao abrigo do RFC1918, a vasta maioria dos endereços IP nuca são utilizados. Quando o Nmap tenta enviar um pacote IP em estado bruto(raw), tal como um ICMP echo request, o sistema operativo deve determinar o endereço físico de destino (ARP) correspondente ao IP-alvo de forma que ele possa endereçar adequadamente o frame ethernet. Isso normalmente é lento e problemático, pois os sistemas operativos não foram escritos com a expectativa de que precisariam fazer milhões de requisições ARP contra anfitriões(hosts) indisponíveis em um curto período de tempo.

O rastreio(scan) ARP encarrega o Nmap e seus algorítmos optimizados de fazer as requisições ARP. E se ele conseguir uma resposta de volta, o Nmap não precisa de se preocupar com os pacotes ping baseados em IP, uma vez que ele já sabe que o anfitrião(host) está activo. Isso torna o rastreio(sca) ARP muito mais rápido e mais confiável que os rastreios(scans) baseados em IP. Portanto isso é feito por default quando se faz o rastreio(scan) de anfitriões(hosts) ethernet que o Nmap detecta estarem posicionados em uma rede ethernet local. Mesmo se tipos diferentes de ping (tais como -PI ou -PS) sejam especificados, o Nmap usa o ARP em vez, para cada um dos alvos que estiverem na mesma LAN. Se não quiser de forma alguma fazer um ratreio(scan) ARP, especifique --send-ip.

-n (Não faça resolução DNS)

Diz ao Nmap para nunca fazer uma resolução DNS nos endereços IP activos que ele encontrar. Uma vez que o DNS é normalmente lento, isso acelera as coisas.

-R (resolução DNS para todos os alvos)

Diz ao Nmap para fazer sempre uma resolução DNS reversa nos endereços IP-alvos. Normalmente isto apenas é executado quando uma máquina está activa.