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 anfitriões(hosts) actuem como verdadeiros semelhantes, servindo e obtendo informações uns dos outros. As pessoas poderiam aceder a 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 rastreio(scan) FTP bounce, um rastreio(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 rastreios(scans) feitos com o Nmap porque os rastreios(scans) são, às vêzes, 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 activa. 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 actividades inocentes são diagnosticadas erradamente 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 objectivo 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 rastreio(scan) solicitado (incluindo rastreios(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 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, pode especificar o seu próprio tamanho de quebra com a opção --mtu. Não especifique também o -f se 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 rastreio(scan) enquanto executa um sniffer como o Ethereal para ter a certeza de que pacotes enviados estão fragmentados. Se o SO do seu anfitrião(host) estiver causando problemas tente a opção --send-eth para passar por cima da camada IP e enviar frames ethernet em estado bruto(raw).

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

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

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

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

Chamarizes são utilizados tanto no rastreio(scan) com ping inicial (usando ICMP, SYN, ACK ou qualquer outro) como também durante a fase real de rastreio(scan) 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 rastreio(scan) TCP connect().

Vale a pena observar que usar chamarizes demais pode deixar seu rastreio(scan) lento e potencialmente até torná-lo menos preciso. Outra coisa, alguns provedores 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 deseja utilizar para enviar os pacotes.

Outro uso possível para esta flag é para disfarçar o rastreio(scan) e fazer com que os alvos achem que alguma outra pessoa está fazendo o rastreio(scan). Imagine uma empresa que está constantemente sofrendo rastreios(scans) 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 activas 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 frequentemente 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 activo 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. Normalmente ele esquecem-se de fazer as actualizaçõ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 rastreios(scans) TCP, incluindo o rastreio(scan) SYN, suportam a opção completamente assim como o rastreio(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 afectados mas a maioria dos pacotes de ping e rastreio(scan) de portas são. Isso atrasa as coisas mas pode tornar um rastreio(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 anfitriões(hosts)-alvo)

Informa ao Nmap que ele deve embaralhar cada grupo de, no máximo, 8096 anfitriões(hosts) antes de efectuar o rastreio(scan). Isso torna os rastreios(scans) menos óbvios a vários sistemas de monitoramento de rede, especialmente quando combina isso com as opções de temporização lentas. Se deseja que 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 rastreio(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.