Nmap Network Scanning
Autor: Rafael Holanda | Publicado: 2017-01-27T09:55:00-02:00





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 hosts ativos e interessantes. Escanear cada porta de cada endereço IP é vagaroso e normalmente desnecessário. É claro que o que torna um host interessante depende muito do propósito do 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 hosts na rede interna, enquanto um profissional externo de análise de vulnerabilidades (penetration tester) pode utilizar um conjunto diversificado de dezenas de sondagens em uma tentativa de burlar as restrições do firewall.

As necessidades para o descobrimento de 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 host às vezes é chamada de ping scan, mas ela vai muito além dos simples pacotes ICMP de echo request associados com a ferramenta onipresente conhecida como ping. Os usuários podem pular a etapa do ping inteiramente com uma lista de scan (-sL) ou desabilitanto 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 ativo (é utilizado por um host ou dispositivo de rede). Em muitas redes, apenas uma pequena percentagem dos endereços IP está ativa em um dado momento. Isso é particularmente comum com o espaço de endereçamento privativo abençoado pela 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 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 scan ARP é utilizado para cada alvo localizado na rede ethernet local. Para usuários Unix sem privilégios, com shell, um pacote SYN é enviado ao invés do ack utilizando a chamada de sistema connect(). Esses valores padrão equivalem às opções -PA -PE. Esta descoberta de host freqüentemente é suficiente para escanear redes locais, mas um conjunto de sondagens mais abrangentes é recomendado para auditoria de segurança.

As opções -P* (que selecionam tipos de ping) podem ser combinadas. Você pode aumentar as chances de penetrar em um firewall rígido 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 padrão contra alvos na rede ethernet local mesmo que você especifique outras opções -P* , porque é quase sempre mais rápida e eficiente.

Por definição, o Nmap faz a descoberta de host e então executa um escaneamento de portas contra cada host que ele determina que está ativo. Isto é verdade mesmo que você especifique tipos de busca não-padronizadas de hosts, tais como sondagens UDP (-PU). Leia sobre a opção -sP para saber como executar apenas uma descoberta de hosts, ou utilize -P0 para pular a descoberta de hosts e escanear as portas de todos os hosts-alvo. As seguintes opções controlam a descoberta de hosts:

-sL (Scan Listagem)
O scan listagem é uma forma degenerada de descoberta de hosts que simplesmente lista cada host da rede especificada, sem enviar nenhum pacote aos hosts-alvos. Por padrão o Nmap fará a resolução de DNS reverso dos 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. O scan listagem é um bom teste de sanidade para assegurar que você está com a lista correta de endereços IP dos seus alvos. Se os hosts mostrarem nomes de domínios que você não reconhece, vale a pena investigar melhor para evitar scanear a 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 scan de portas, detecção de SO, ou scan utilizando ping, não podem ser combinadas com esta opção. Se você deseja desabilitar o scan utilizando ping enquanto executa funções de nível elevado, leia a opção -P0.

-sP (Scan usando Ping)
Esta opção diz ao Nmap para somente executar um scan usando o ping (descoberta de hosts), e então mostrar os hosts disponíveis que responderam ao scan. Nenhum teste adicional (tais como escaneamento de portas e deteção de SO) é executado. Isto é um pouco mais intrusivo que o scan listagem, 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 pelo scan listagem com cada endereço IP e seu nome de 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 em um endereço de broadcast, pois muitos 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 padrão. 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 escanear 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 padrão (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écnicas 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 pula completamente o estágio de descoberta do Nmap. Normalmente o Nmap utiliza este estágio para determinar as máquinas ativas para escaneamento mais agressivo. Por padrão, o Nmap apenas executa sondagens agressivas tais como escaneamento de portas, detecção de versões, ou detecções do SO contra hosts que foram verificados como ativos. Desabilitar a descoberta de hosts com -P0 faz com que o Nmap teste as funções de escaneamento 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 escaneados. O segundo caracter da opção -P0 é um zero e não a letra O. A descoberta de hosts apropriada é desconsiderada como no scan listagem, 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 ativo.

-PS [listadeportas] (Ping usando TCP SYN)
Esta opção envia um pacote TCP vazio com a flag SYN marcada. A porta de destino padrão é 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 você está tentando estabelecer uma comunicação. Normalmente a porta de destino estará fechada e um pacote RST (reset) será enviado de volta. Se acontecer de a porta estar 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-nascida 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 caixas UNIX, apenas o usuário privilegiado root é capaz, normalmente, de enviar e receber pacotes TCP em estado bruto. 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 host alvo, em uma tentativa de se 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 host é marcado como disponível. Se a tentativa de conexão for deixada largada 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 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 você poderia imaginar, é que a flag TCP ACK é marcada ou invés da flag SYN. Tal pacote ACK finge reconhecer dados de uma conexão TCP estabelecida, quando nenhuma conexão existe de fato. Então os hosts remotos deveriam sempre responder com pacotes RST, revelando sua existência no processo.

A opção -PA utiliza a mesma porta padrão que a sondagem SYN (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 roteadores e outros firwalls simples para bloquear pacotes SYN entrantes exceto aqueles destinados a serviços públicos como o site web da empresa ou servidor de correio eletrônico. Isso evita as demais conexões entrantes 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 uns poucos recursos no firewall/roteador 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 tais como essas são implementadas, sondagens de ping usando SYN (-PS) muito provavelmente serão bloqueadas quando forem enviadas à portas fechadas. Em tais 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 hosts é o ping usando UDP, que envia um pacote UDP vazio (a menos que --data-length seja especificado) para as portas informadas. O argumento "listadeportas" tem o mesmo formato que os discutidos anteriormente nas opções -PS e -PA. Se nenhuma porta for especificada, o padrão é 31338. Esse padrão pode ser configurado em tempo de compilação alterando DEFAULT_UDP_PROBE_PORT no nmap.h. Uma porta alta incomum é utilizada como padrão porque enviar para portas abertas normalmente é indesejado para este tipo particular de scan.

Ao bater contra uma porta fechada na máquina-alvo, a sondagem UDP deve causar um pacote ICMP de porta inalcançável como resposta. Isso diz ao Nmap que a máquina está ativa e disponível. Muitos outros tipos de erros ICMP, tais como host/rede inalcançável ou TTL excedido são indicativos de um host inativo 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 padrão é 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 roteador broadband sem-fio Linksys BEFW11S4. A interface externa desse dispositivo filtrava todas as portas TCP por padrão, mas as sondagens UDP ainda causavam mensagens de porta inalcançável, entregando assim o dispositivo.

-PE; -PP; -PM (Tipos de Ping do ICMP)
Além dos tipos incomuns de descoberta de hosts TCP e UDP discutidos anteriormente, o Nmap pode enviar os pacotes-padrão que normalmente são enviados pelo onipresente 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 host disponível. Infelizmente para muitos exploradores de rede, muitos hosts e firewalls atualmente bloqueiam esses pacotes, ao invés de responder como é requerido pela RFC 1122. Por essa razão, 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 ativar 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 hosts. Um sistema que responda está ativo e disponível. O Nmap não implementa atualmente os pacotes de requisição de informações, pois eles não são amplamente suportados. A RFC 1122 insiste que “um 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 é escanear a LAN ethernet. Na maioria das LANs, especialmente aquelas que utilizam a faixa de endereçamento privativo abençoado pela RFC1918, a vasta maioria dos endereços IP não são utilizados nunca. Quando o Nmap tenta enviar um pacote IP em estado bruto, tal como um ICMP echo request, o sistema operacional 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 operacionais não foram escritos com a expectativa de que precisariam fazer milhões de requisições ARP contra hosts indisponíveis em um curto período de tempo.

O scan ARP encarrega o Nmap e seus algoritmos otimizados de fazer as requisições ARP. E se ele conseguir uma resposta de volta, o Nmap não precisa nem se preocupar com os pacotes ping baseados em IP, uma vez que ele já sabe que o host está ativo. Isso torna o scan ARP muito mais rápido e mais confiável que os scans baseados em IP. Portanto isso é feito por padrão quando se escaneia hosts ethernet que o Nmap detecta estarem posicionados em uma rede ethernet local. Mesmo se tipos diferentes de ping (tais como -PI ou -PS) seja especificados, o Nmap usa o ARP no lugar para cada um dos alvos que estiverem na mesma LAN. Se você não quiser de forma nenhuma fazer um scan ARP, especifique --send-ip.

-n (Não faça resolução DNS)
Diz ao Nmap para nunca fazer uma resolução DNS reversa nos endereços IP ativos 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 sempre fazer uma resolução DNS reversa nos endereços IP-alvos. Normalmente isto apenas é executado quando uma máquina está ativa.

--system-dns (Usa a resolução DNS do sistema)
Por padrão, o Nmap resolve o endereço IP através do envio de pesquisas (queries) diretamente aos servidores de nome configurados em seu host, e então escuta as respostas. Muitas das pesquisas (dezenas) são executadas em paralalo para um melhor desempenho. Especifique esta opção se desejar utilizar a resolução DNS do seu sistema (um endereço IP por vez, através da chamada getnameinfo()). Isto é mais lente e raramente útil, a não ser que haja um bug no código de DNS do Nmap -- por favor, entre em contato conosco se for o caso. A resolução DNS do sistema é sempre usada em escaneamento IPv6.

--dns-servers &lt;servidor1[,servidor2],...&gt; (Servidores a utilizar para a pesquisa DNS reversa)
Por padrão o Nmap irá tentar determinar os seus servidores DNS (para a resolução DNS reversa) através do arquivo resolv.conf (UNIX) ou do registry (Win32). Opcionalmente você pode usar esta opção para especificar servidores alternativos. Esta opção não é honrada se você estiver usando --system-dns ou um escaneamento IPv6. Utilizar múltiplos servidores DNS é, normalmente, mais rápido e mais furtivo do que pesquisar apenas em um servidor. O melhor desempenho é frequentemente obtido especificando-se todos os servidores que tem autoridade sobre a faixa de endereços IP.