O
netcat, ou simplesmente
nc em muitas distribuições, é "apenas" um programa que permite enviar ou receber pacotes TCP ou UDP em qualquer porta. O "apenas" é porque ele também permite realizar coisinhas um tanto perversas. No Windows, por exemplo, basta colocar para executar o comando:
C:\>
netcat -p 8000 -l -e cmd.exe
Que agora, ao se conectar na porta 8000 desta máquina, você terá um prompt do DOS. Hoje esta brincadeira já não dá tão certo, pois o firewall do Windows bloqueia portas! Era o comando preferido dos hackers quando podiam executar comandos remotos através de um IIS bugado.
Aproveitando o exemplo anterior, alguns parâmetros do netcat merecem destaque:
- -u: indica ser pacotes UDP;
- -t: indica ser tcp. Na ausência de -u ou -t, será considerado TCP;
- -l: indica escutar (listen) na porta;
- -p: número da porta em que se escutará;
A figura a seguir mostra o uso do netcat para apenas enviar dados da máquina para a mesma máquina usando a porta 8000:
Então, depois desta rápida explicação do netcat, pode-se agora criar o túnel no braço, pois administrador que é administrador não fica usando "ferramentinha" de túnel. :-D
Para tornar mais divertido e ilustrativo, considera-se que a máquina 172.20.1.132 (uma máquina virtual nos meus testes) não consegue acessar o site vivaolinux.com.br em sua porta 80. Parece que o roteador está, por alguma razão, bloqueando este acesso, conforme pode ser visto na figura a seguir.
Observe a figura. Aparentemente a máquina cliente não tem acesso a página do
Viva o Linux, mas tem acesso a máquina 172.20.1.1 (está pingando). Como o usuário desta máquina tem uma conta na 172.20.1.1, pronto, ele pode usar um túnel para acessar o Viva o Linux.
E como ele faz isto com um simples netcat? Claro, seria mais fácil usar uma ferramenta própria para criar o túnel, mas agora deseja-se provar que com um pouco de criatividade, saca-se um túnel até mesmo com o netcat.
No caso ele precisa colocar o netcat para escutar em uma porta alta na máquina 172.20.1.1. Porta alta, pois portas baixas apenas o usuário root pode usar. Ele precisa fazer com que tudo que for enviado a esta porta alta seja reenviado para o www.vivaolinux.com.br na porta 80. Este é o princípio de um túnel.
Na máquina 172.20.1.1 o nosso criativo usuário pode executar:
mkfifo vol.fifo
$ while true; do netcat -l -p 7000 < vol.fifo | netcat vivaolinux.com.br 80 > vol.fifo ;done
(se você estiver reproduzindo isto em seu computador, talvez tenhas problemas para cancelar o laço, pois um Control+C irá cancelar apenas o netcat. Para fazer o cancelamento, proceda da seguinte forma: pressione Control+Z no terminal onde está executando o laço. Você verá uma mensagem de Stopped. Após digite, no mesmo terminal, o comando fg, o que fará ele voltar a executar o último netcat. Agora sim pressione Control+C para cancelar este netcat)
Como o netcat não foi desenvolvido para isto, um pouco de criatividade se fez necessário, criando um arquivo do tipo pipe para intermediar a comunicação dos dois comandos. São recursos disponíveis no Linux e que qualquer usuário pode usar. A criação deste arquivo é necessária pois quero que a saída do primeiro netcat seja a entrada do segundo (isto o "|" faz), mas também quero que a saída do segundo seja a entrada do primeiro (e isto o "vol.fifo" faz).
Prender o netcat dentro de um laço é necessário, pois a cada conexão o netcat encerra e para montar uma página podem ser necessárias várias conexões.
É uma solução esquisita, mas funciona. Veja como ficou o navegador da máquina cliente com este comando em execução:
As imagens não foram carregadas. Fui investigar o porque disto e vi que as imagens são lidas de outro site, o img.vivaolinux.com.br. Teria que ter um túnel para este também. Mas, tudo bem, este exemplo não era para ser perfeito mesmo, era para ser ilustrativo.
Qualquer aplicação que permite se conectar em uma porta e escutar em outra poderia ser usado como túnel.
A figura a seguir ilustra como a comunicação ocorreu entre todas as partes, o que já demonstra o funcionamento de um túnel.
Bom, claro, para que sofrer, não é? Minha intenção foi apenas mostrar o que é um túnel, como ele funciona e como ele pode ser construído usando criatividade e algumas ferramentas já existentes. Este túnel "xinfrim" tem sérios problemas, seja por sua implementação complexa e esquisita, seja pelas limitações de uso (não funcionou para img.vivaolinux.com.br).
Mas sua maior limitação é o de não fazer uso de criptografia. Os dados não estão cifrados em momento algum. Poderia incrementar os pipes sacando um gnupg da manga e ligando ele na sequência de pipes (deixo como desafio aos leitores), mas, simplificando: que tal o ssh para isto?