Evitando e enganando o Firewall/IDS

Muitos pioneiros da Internet vislumbraram uma rede mundial aberta com um espaço de endereçamento IP universal que permitisse conexões virtuais entre quaisquer dois nós. Isso permite que os hosts atuem como verdadeiros semelhantes, servindo e obtendo informações uns dos outros. As pessoas poderiam acessar seus computadores domésticos do trabalho, mudando os ajustes do controle de climatização ou abrindo as portas para convidados. Essa visão de conectividade universal foi sufocada pela falta de espaço de endereçamento e preocupações com a segurança. No início dos anos 1990, as empresas começaram a instalar firewalls para o propósito claro de reduzir a conectividade. Rede enormes foram isoladas da Internet-sem-fronteiras por proxies de aplicativos, tradução de endereçamento de rede (network address translation) e filtros de pacotes. O fluxo irrestrito de informações deu a vez à regulamentação acirrada de canais de comunicação autorizados e ao conteúdo que neles trafegam.

As obstruções de rede, como o firewall, podem tornar o mapeamente de uma rede extremamente difícil. E isso não vai se tornar mais fácil, pois sufocar as sondagens casuais é, freqüentemente, o objetivo principal de se instalar esses dispositivos. Apesar disso, o Nmap oferece muitas ferramentas para ajudar a entender essas redes complexas, e para verificar que os filtros estão funcionando como esperado. Ele até suporta mecanismos para passar por cima de defesas mal implementadas. Um dos melhores métodos para se entender a postura de segurança de uma rede é tentar derrubá-la. Pense com a mente de uma pessoa que quer atacá-lo, e aplique técnicas desta seção contra a sua rede. Lance um scan FTP bounce, um scan idle, um ataque de fragmentação ou tente "tunelar" (criar um túnel) através de um de seus próprios proxies.

Além de restringir a atividade de rede, as empresas estão monitorando o tráfego cada vez mais, com sistemas de detecção de intrusão (IDS). Todos os principais IDS vêm com regras designadas para detectar escaneamentos feitos com o Nmap porque os scans são, às vezes, precursores de ataques. Muitos desses produtos foram recentemente metamorfoseados em sistemas de prevenção de intrusão (IPS) que bloqueiam o tráfego considerado malicioso de forma ativa. Infelizmente, para administradores de rede e vendedores de IDS, detectar confiavelmente as más intenções através da análise de dados de pacotes é um problema difícil. Atacantes com paciência, habilidade e a ajuda de certas opções do Nmap podem normalmente passar por um IDS sem serem detectados. Enquanto isso, os administradores devem lidar com um alto número de resultados do tipo falso-positivo, onde atividades inocentes são diagnosticadas erroneamente e recebem alertas ou são bloqueadas.

De vez em quando, as pessoas sugerem que o Nmap não deveria oferecer opções que permitam evitar as regras de firewalls ou passar desapercebidos por IDSs. Elas argumentam que essas características são tão sujeitas à má-utilização por atacantes quanto são utilizadas por administradores para aumentar a segurança. O problema com esta lógica é que esses métodos ainda assim seriam utilizados pelos atacantes, que encontrariam outras ferramentas ou então acrescentariam essa funcionalidade no Nmap. Enquanto isso, os administradores achariam muito mais difícil executar suas tarefas. Instalar apenas servidores FTP modernos e corrigidos é uma defesa muito melhor do que tentar evitar a distribuição de ferramentas que implementem o ataque FTP bounce.

Não existe uma carta mágica (ou opção do Nmap) para detectar e subverter firewalls e sistemas IDS. É necessário habilidade e experiência. Um tutorial está além do escopo deste guia de referência, que apenas lista as opções relevantes e descreve suas funções.

-f (fragmenta os pacotes); --mtu (usando a MTU especificada)

A opção -f faz com que o scan solicitado (incluindo scans usando ping) utilize pequenos pacotes IP fragmentados. A idéia é dividir o cabeçalho TCP em diversos pacotes para tornar mais difícil para os filtros de pacotes, os sistemas de detecção de intrusão, e outros aborrecimentos, detectar o que você está fazendo. Tenha cuidado com isto! Alguns programas tem problemas para lidar com estes pequenos pacotes. O sniffer da velha-guarda chamado Sniffit sofria uma falha de segmentação assim que recebia o primeiro fragmento. Especifique esta opção uma vez e o Nmap dividirá os pacotes em 8 bytes ou menos após o cabeçalho IP. Portanto, um cabeçalho TCP de 20 bytes seria dividido em 3 pacotes. Dois com oito bytes do cabeçalho TCP e um com os quatro restantes. É claro que cada fragmento também tem um cabeçalho IP. Especifique -f novamente para usar 16 bytes por fragmento (reduzindo o número de fragmentos). Ou então, você pode especificar o seu próprio tamanho de quebra com a opção --mtu. Não especifique também o -f se você usar o --mtu. A quebra deve ser um múltiplo de 8. Embora os pacotes fragmentados não passem por filtros de pacotes e firewalls que enfilerem todos os fragmentos IP, tal como a opção CONFIG_IP_ALWAYS_DEFRAG do kernel do Linux faz, algumas redes não aguentam o impacto no desempenho que isso causa, deixando a opção desabilitada. Outros não conseguem habilitar isso porque os fragmentos podem seguir por rotas diferentes na rede. Alguns sistemas de origem desfragmentam pacotes de saída no kernel. O Linux e o módulo de reastreamento de conexão do iptables é um exemplo desse tipo. Faça um scan enquanto executa um sniffer como o Ethereal para ter a certeza de que pacotes enviados estão fragmentados. Se o SO do seu host estiver causando problemas, tente a opção --send-eth para passar por cima da camada IP e enviar frames ethernet em estado bruto.

-D <chamariz1 [,chamariz2][,ME],...> (Disfarça um scan usando chamarizes)

Faz com que um scan com chamarizes seja executado, o que parece ao host remoto que, o(s) host(s) que você especificou como chamarizes também estejam escaneando a rede-alvo. Com isso, o IDS poderá reportar 5 a 10 scans de portas de endereços IP únicos, mas não saberá qual IP estava realmente escaneando e qual era um chamariz inocente. Embora isso possa ser desvendado através de rastreamento de caminho de roteador, descarte de respostas (response-dropping) e outros mecanismos ativos, normalmente é uma técnica eficaz para esconder o seu endereço IP.

Separe cada host-chamariz com vírgulas, e você pode opcionalmente usar ME como um dos chamarizes para representar a posição do seu endereço IP real. Se você colocar ME na 6a. posição ou acima, alguns detectores de scan de portas comuns (como o excelente scanlogd da Solar Designer) pouco provavelmente irão mostrar o seu endereço IP. Se você não utilizar o ME, o nmap irá colocá-lo em uma posição aleatória.

Observe que os hosts que você utilizar como chamarizes devem estar ativos ou você poderá, acidentamente, inundar com SYN os seus alvos. Também será bastante fácil determinar qual é o host que está escaneando se houver apenas um host realmente ativo na rede. Você pode preferir usar endereços IP ao invés de nomes (de forma que as redes chamarizes não vejam você em seus logs dos servidores de nomes).

Chamarizes são utilizados tanto no scan com ping inicial (usando ICMP, SYN, ACK ou qualquer outro), como também durante a fase real de escaneamento de portas. Chamarizes também são usados durante a detecção de SO remoto (-O). Chamarizes não funcionam com a detecção de versão ou com o scan TCP connect.

Vale a pena observar que usar chamarizes demais pode deixar seu scan lento e potencialmente até torná-lo menos preciso. Outra coisa, alguns provedores de internet (ISP) irão filtrar os seus pacotes disfarçados, mas muitos não restringem pacotes IP disfarçados.

-S <Endereço_IP> (Disfarça o endereço de origem)

Em algumas circunstâncias, o Nmap pode não conseguir determinar o seu endereço de origem (o Nmap irá dizer se for esse o caso). Nesta situação, use o -S com o endereço IP da interface que você deseja utilizar para enviar os pacotes.

Outro uso possível para esta flag é para disfarçar o scan e fazer com que os alvos achem que alguma outra pessoa está escaneando-as. Imagine uma empresa que está constantemente sofrendo scan de portas de um concorrente! A opção -e normalmente seria requerida para este tipo de uso e -P0 seria recomendável.

-e <interface> (Usa a interface especificada)

Diz ao Nmap qual interface deve ser utilizada para enviar e receber pacotes. O Nmap deveria ser capaz de detectar isto automaticamente, mas ele informará se não conseguir.

--source-port <númerodaporta>; -g <númerodaporta> (Disfarça o número de porta de origem)

Um erro de configuração surpreendentemente comum é confiar no tráfego com base apenas no número da porta de origem. É fácil entender como isso acontece. Um administrador configura um firewall novinho em folha, só para ser inundado com queixas de usuários ingratos cujas aplicações param de funcionar. Em particular, o DNS pode parar de funcionar porque as respostas DNS UDP de servidores externos não conseguem mais entrar na rede. O FTP é outro exemplo comum. Em tranferências FTP ativas, o servidor remoto tenta estabelecer uma conexão de volta com o cliente para poder transferir o arquivo solicitado.

Soluções seguras para esses problemas existem, freqüentemente na forma de proxies no nível da aplicação ou módulos de firewall para análise de protocolo. Infelizmente também há soluções mais fáceis e inseguras. Observando que as respostas DNS chegam pela porta 53 e o FTP ativo pela porta 20, muitos administradores caem na armadilha de apenas permitir tráfego vindo dessas portas. Eles normalmente assumem que nenhum atacante irá notar e explorar essas brechas no firewall. Em outros casos, os administradores consideram isso uma medida provisória de curto prazo até que eles possam implementar uma solução mais segura. Então, eles normalmente se esquecem de fazer as atualizações de segurança.

Administradores de rede sobrecarregados não são os únicos a caírem nessa armadilha. Diversos produtos foram empacotados com essas regras inseguras. Mesmo a Microsoft é culpada. Os filtros IPsec que vieram com o Windows 2000 e com o Windows XP contém uma regra implícita que permite todo o tráfego TCP ou UDP da porta 88 (Kerberos). Em outro caso bastante conhecido, versões do firewall pessoal Zone Alarm, até a versão 2.1.25, permitiam qualquer pacote UDP entrante com a porta de origem 53 (DNS) ou 67 (DHCP).

O Nmap oferece as opções -g e --source-port (elas são equivalentes) para explorar essas fraquezas. Apenas forneça um número de porta e o Nmap irá enviar pacotes dessa porta onde for possível. O Nmap utiliza números de porta diferentes para que certos testes de detecção de SO funcionem direito, e as requisições DNS ignoram a flag --source-port porque o Nmap confia nas bibliotecas de sistema para lidar com isso. A maioria dos scans TCP, incluindo o scan SYN, suportam a opção completamente, assim como o scan UDP.

--data-length <número> (Acrescenta dados aleatórios nos pacotes enviados)

Normalmente o Nmap envia pacotes minimalistas contendo apenas o cabeçalho. Dessa forma os pacotes TCP têm normalmente 40 bytes e os echo requests ICMP tem só 28. Esta opção faz com que o Nmap acrescente o número informado de bytes aleatórios na maioria dos pacotes que envia. Os pacotes de detecção de SO (-O) não são afetados, pois a precisão exige consistência das sondagens, mas a maioria dos pacotes de ping e scan de portas funcionam assim. Isso atrasa um pouco as coisas, mas pode tornar um scan ligeiramente menos chamativo.

--ttl <valor> (Establece o valor do campo time-to-live)

Estabelece que o campo tempo-de-vida (time-to-live) dos pacotes enviados terá o valor informado.

--randomize-hosts (Torna aleatória a ordem dos hosts-alvo)

Informa ao Nmap que ele deve embaralhar cada grupo de, no máximo, 8096 hosts antes de escaneá-los. Isso torna os scans menos óbvios a vários sistemas de monitoramento de rede, especialmente quando você combina isso com as opções de temporização lentas. Se você deseja fazer isso em grupos maiores, aumente o PING_GROUP_SZ no nmap.h e recompile. Uma solução alternativa é gerar uma lista de endereços IP-alvos com um scan de lista (-sL -n -oN <nomedoarquivo>), embaralhar a lista com um script Perl e então fornecer a lista completa para o Nmap com -iL.

--spoof-mac <endereço mac, prefixo, ou nome do fabricante> (Disfarça o endereço MAC)

Solicita ao Nmap que utilize o endereço MAC informado para todos os frames ethernet em estado bruto (raw) que ele enviar. Esta opção implica em --send-eth para assegurar que o Nmap realmente envie pacotes no nível ethernet. O MAC fornecido pode assumir diversos formatos. Se for apenas a string 0, o Nmap irá escolher um MAC completamente aleatório para a sessão. Se a string informada for um número par de dígitos hexa (com os pares opcionalmente separados por dois pontos), o Nmap irá usa-la como o MAC. Se menos do que 12 dígitos hexa forem informados, o Nmap preenche o restante dos 6 bytes com valores aleatórios. Se o argumento não for um 0 ou uma string hexa, o Nmap irá procurar no nmap-mac-prefixes para encontrar o nome de um fabricante contendo a string informada (não é sensível a maiúsculas ou minúsculas). Se encontrar, o Nmap usa o OUI (prefixo de 3 bytes) do fabricante e preenche os 3 bytes restantes aleatoriamente. Exemplos de argumentos --spoof-mac válidos são Apple, 0, 01:02:03:04:05:06, deadbeefcafe, 0020F2 e Cisco.

--badsum (Send packets with bogus TCP/UDP checksums)

Solicita ao Nmap que utilize uma soma de verificação (checksum) TCP ou UDP inválida para os pacotes enviados aos hosts. Uma vez que virtualmente todos as pilhas (stack) IP do host irão rejeitar esses pacotes, quaisquer respostas recebidas são provavelmente vindas de um firewall ou IDS que nem se incomodou em verificar a soma de verificação. Para mais detalhes desta técnica, veja https://nmap.org/p60-12.txt