Coluna do Kurt COLUNA Túneis secretos Como transferir dados de e para sistemas Linux sem aparecer no radar. T odos nós já estivemos lá: você liga seu computador à rede (com ou sem fio) e ele não funciona. Depois, você tenta entrar no servidor por SSH e recebe a mensagem “falha de conexão”. Ao tentar conectar-se ao seu servidor de email na porta 25 usando TLS (ou seja, criptografia), você vê apenas o banner do proxy de email do provedor local, ou recebe outra falha de conexão. Mas nem tudo está perdido – pelo menos você consegue navegar na Web. Infelizmente, toda vez que você digita alguma URL errada, acaba na página de busca do provedor, e qualquer coisa com conteúdo questionável, como hacking, é bloqueada. Neste ponto, você tem duas escolhas: encontrar um bom livro para ler ou usar um software de VPN para se conectar a uma máquina remota sem sofrer com os filtros ou problemas de conexão. Entretanto, alguns provedores realmente cruéis – ou simplesmente incompetentes – também bloqueiam softwares comuns para VPN e SSH na tentativa de evitar acesso sem filtros à Internet por meio de suas redes. Assim como tentar impedir um gato de entrar na caixa, quando você tenta evitar que geeks façam algo, provavelmente eles simplesmente vão tentar com mais afinco. Se você conseguir passar alguma forma de dado para um sistema remoto (IPSec, SSH, http, mensagens instantâneas, sinais de fumaça), é possível usar esse canal para transportar qualquer dado. Um provador só consegue bloquear ou filtrar certa quantidade de tráfego antes de se tornar completamente inutilizável. O truque é encontrar um protocolo de rede que seja permitido e não sofra modificações, e que consiga isso com softwares já existentes que permitam enviar os dados por túnel. Felizmente, três protocolos de rede básicos – ICMP, DNS e http – quase sempre são permitidos, assim como uma grande variedade de outros protocolos, como SSH e mensagens instantâneas. Com sorte, você conseguirá usar softwares como SSH com encaminhamento de por16 tas ou capacidades de VPN sobre uma porta permitida, como 80. E se você tiver azar, o provedor vai forçá-lo a atravessar seus próprios proxies web e servidores DNS para acessar a Internet. Túnel via ICMP O ICMP é um ótimo protocolo para enviar dados por túneis, pois quase sempre é permitido (bloqueá-lo causa problemas em muitos níveis) e consegue transportar um monte de dados [1]. Um pacote ICMP possui 20 bytes de dados no cabeçalho (origem, destino etc.) e 8 bytes de dados do conteúdo (tipo de mensagem, código etc.), além de uma quantidade variável de outros dados. A quantidade desses outros dados enviados pelo pacote ICMP geralmente é limitada apenas pelo tamanho máximo do pacote na rede (em Ethernet e Wi-fi, geralmente são 1.500 bytes). Isso significa que é possível enviar montes de dados por pacotes ICMP com pouco overhead. Há algumas opções de softwares para túneis sobre ICMP, mas a melhor opção é o Ping Tunnel (Ptunel), pois é o mais atualizado [2]. Instalar o Ptunnel é relativamente simples; há RPMs para a segunda versão mais recente no repositório Dag. Para instalar e compilar os fontes, digite: rpm -Uvm http://dag.wieers.com/rpm/packages/ptunnel/ ptunnel-0.61-1.rf.src.rpm cd /usr/src/redhat/ rpmbuild -ba ptunnel.spec Se você desejar a versão mais recente do Ptunnel, será preciso atualizar o source RPM ou compilá-lo diretamente. Para obter e compilar os fontes: wget http://www.cs.uit.no/~daniels/PingTunnel/ PingTunnel-0.70.tar.gz tar -xf PingTunel-0.70.tar.gz http://www.linuxmagazine.com.br Insegurança | COLUNA cd PingTunnel make make install Usar o Ptunnel não é muito mais difícil do que compilálo. No lado servidor (o proxy), basta executar o Ptunnel com um dispositivo de rede opcional (-c) e uma senha (-x). No lado cliente, é preciso especificar o endereço do servidor proxy, a porta local onde escutar e o endereço e porta remotos onde se deseja conectar. O exemplo a seguir supõe que um servidor proxy em ptunnel.exemplo.org esteja conectado à Internet pela eth0, com um proxy Squid no servidor squid.exemplo.org na porta 3128 com senha blabla para manter a segurança da conexão: Servidor: ./ptunnel -c eth0 -x blabla Cliente: ./ptunnel -p ptunnel.exemplo.org \ -lp 3128 -da squid.exemplo.org \ -dp 3128 -x blabla Agora simplesmente configure seu navegador web para usar como proxy a máquina local na porta 3128, então o tráfego http será convertido para ICMP e depois enviado para ptunnel.exemplo.org. Nesse local, ele será desempacotado e enviado para o servidor proxy squid. exemplo.org, e então enviado para a Internet. O servidor Squid pode ser executado localmente no mesmo servidor com o Ptunnel, que permite que se atravesse qualquer filtragem ou problema da rede do provedor. Túnel via DNS Embora não seja tão confiável quanto o ICMP, o DNS é outro protocolo que pode ser usado para criar túneis de dados. Alguns provedores redirecionam sistemas não registrados ou desconhecidos para um gateway de pagamento. Para isso, eles respondem requisições DNS com o endereço IP do gateway de pagamento. Outros provedores simplesmente usam um proxy web transparente para interceptar todas as requisições WWW e redirecioná-las para seu gateway de pagamento (nesse caso, provavelmente é possível enviar seu tráfego pelo túnel sobre DNS). O DNS tem várias vantagens sobre o ICMP. Apesar de bloqueios ao ICMP causarem problemas, eles são possíveis. Entretanto, bloquear o DNS quebra tudo. Apesar de o Ping Tunnel 0.70 agora suportar a transmissão de dados pela porta UDP 53, ele não envia realmente pacotes DNS válidos, então não é possível passar esse tráfego por servidores DNS. Para isso, é preciso ter uma conexão direta com o servidor proxy. Nesse caso, é possível simplesmente usar o OpenVPN ou OpenSSH sobre a porta 53. Linux Magazine #56 | Julho de 2009 Listagem 1: Proxytunnel 01 Host proxytunnel.exemplo.org 02 ProtocolKeepAlives 30 03 ProxyCommand /caminho/do/proxytunnel -p proxy. cliente.com:8080 -u user -s password -d proxytunnel.exemplo.org:443 Para um proxy de verdade que encapsule os dados em pacotes DNS válidos, há o OzymanDNS [3]. Porém, sem atualização desde a versão inicial, o OzymanDNS está um tanto desatualizado. Túnel via http A última opção é enviar o tráfego por meio de um túnel http ou https [4]. É bem provável que a rede suporte conexões https para fora. O https é melhor que o http porque criptografa o tráfego, então reduz a probabilidade de modificação dos dados pelo provedor. Assim como o software de tunelamento ICMP, é possível compilar o Proxytunnel [5] dos fontes ou baixar um pacote RPM (fonte ou binário). Para usar o Proxytunnel, simplesmente execute-o no servidor como um daemon independente ou por meio do inetd. No lado cliente, adicione-o como um ProxyCommand ao cliente OpenSSH (listagem 1). Como se pode ver, há uma variedade de opções para enviar dados por túneis, dependendo dos protocolos disponíveis. Algumas configurações antes do problema podem economizar bastante trabalho quando você se vir enjaulado em uma rede problemática, filtrada ou simplesmente defeituosa. n Mais informações [1]Túnel por ICMP: http://www.phrack.org/ issues.html?issue=49&id=6#article [2]Ping Tunnel: http://www.cs.uit.no/~daniels/PingTunnel/ [3]Howto OzymanDNS: http://www.dnstunnel.de/ [4]Túnel SSH sobre http(s): http://dag.wieers.com/howto/ssh-http-tunneling/ [5]Proxytunnel: http://proxytunnel.sourceforge.net/ Kurt Seifried é consultor de segurança da informação especializado em redes e Linux desde 1996. Ele frequentemente se pergunta como a tecnologia funciona em grande escala mas costuma falhar em pequena escala. 17