Túneis cifrados com SSH

Deseja acessar de forma segura o seu banco de dados e sem precisar abrir porta no firewall? Túnel. Acessar a porta 25 fazendo relay sem mudar as configurações do Postfix? Túnel. Existem inúmeras vantagens do uso de um túnel, inclusive a implantação de uma VPN é feita utilizando-se um túnel. Este artigo destina-se a explicar como usar o recurso de tunelamento existente no próprio SSH.

[ Hits: 140.531 ]

Por: Elgio Schlemer em 31/07/2009 | Blog: https://profelgio.duckdns.org/~elgio


Construindo um túnel tosco com netcat



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:
Linux: Túneis cifrados com SSH
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.
Linux: Túneis cifrados com SSH
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:
Linux: Túneis cifrados com SSH
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.
Linux: Túneis cifrados com SSH
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?

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. O que é e como funciona um túnel?
   3. Construindo um túnel tosco com netcat
   4. Usando o recurso de túnel do SSH
   5. Situações práticas onde um túnel SSH pode ser uma saída
   6. Conclusão e referências
   7. ANEXO: script que uso para realizar um túnel SMTP
Outros artigos deste autor

Parâmetros interessantes do scanf e do printf em C

Estrutura do Iptables

Armazenamento de senhas no Linux

Guerra Infinita, uma análise da Ciência da Computação

Fundamentos da criptografia assimétrica

Leitura recomendada

Integrando ModSecurity ao NGINX e Apache

Race condition - vulnerabilidades em suids

Implementação de WAF mod_security e integração com Graylog utilizando Filebeat e Logstash

Como recuperar a senha de root usando uma live distro

HoneyPots em Linux

  
Comentários
[1] Comentário enviado por cesar em 31/07/2009 - 08:38h

Boa elgio!


[]'s

[2] Comentário enviado por marcolinux em 31/07/2009 - 09:58h

Simplesmente dEStruIU! Parabéns excelente artigO!

[3] Comentário enviado por marciomarkes em 31/07/2009 - 11:56h

Meu caro Elgio... Sem comentários... Parabéns..

Abs..

[4] Comentário enviado por cytron em 03/08/2009 - 01:23h

É! Dá pra ver que ssh não tem limites kkkkk

[5] Comentário enviado por danlsgiga em 03/08/2009 - 22:22h

Excelente... dicas práticas e diretas. Parabéns!! Adorei o artigo.

[6] Comentário enviado por andre.vmatos em 04/08/2009 - 18:23h

Muito bom, novamente, Elgio. Artigo explendido, simplesmente didaticamente perfeito. Continue assim, por favor, nos enriquecendo com seu conhecimento. Só uma dúvida. No título da página 5, vc quis dizer SSH ou SSL mesmo? É pq não encontrei menção ao protocolo SSL na página, e sim ao SSH, motivo do artigo. Abçss
Atenciosamente,

[7] Comentário enviado por elgio em 04/08/2009 - 19:21h

Obrigado André.

Realmente, foi um erro meu.
Apesar de SSL ão ser completamente errado, estou falando do SSH.

Já foi corrigido. Obrigado pelo aviso.

[8] Comentário enviado por rsscwb em 17/09/2009 - 14:13h

Elgio,

Parabéns por seus artigos, são Excelentes!!! Não apenas este, mas todos!

Agora estou utilizando este túnel para acessar o webmin no meu servidor. Eu bloqueei o acesso externo na porta 10000 pelo iptables e, cada vez que eu precisava acessar o webmin, tinha que rodar um script pelo ssh liberando a porta pro meu ip local atual (que é dinâmico).

Agora apenas crio o túnel na minha máquina local e pronto! Nem tenho o trabalho de digitar minha senha, pois configurei a autenticação por desafio e resposta, conforme vc explicou em outro artigo. Simples e fácil!

Att,
Robson

[9] Comentário enviado por ikichl em 23/09/2009 - 09:23h

Bom dia
estou com um grande problema aqui tenho um sistema em php que faz conexoes
automaticas atravez e chave de seguranca, instalada na maquina remota, porem cada
nova conexao ele pede a confirmacao antes e conectar a primeira vez:

Are you sure you want to continue connecting (yes/no)?

ja tentei diversos meio para auto aceitar a conexao, mas sempre sem sucesso
echo -e "yes" | ssh root@200.175.121.18


[10] Comentário enviado por ikichl em 23/09/2009 - 09:42h

Acho que descobri como fazer, ele adiciona automaticamente a chave sem confirmar.


ssh root@200.175.121.18 -p 22 -o StrictHostKeyChecking=no


Obrigado

[11] Comentário enviado por removido em 04/10/2009 - 23:39h

Buenas tchê.
Estava afastado da TI e do VOL, ao retornar encontro este artigo muito bem escrito, com um assunto palpável e com exemplos que realmente funcionam. Estas de parabéns.
Sei que existem alguns de meus usuários, os mais espertos, tunelando conexões em uma porta bem conhecida que meu firewall necessita deixar passar mas, estou estudando as técnicas disponíveis e em busca de soluções.

[12] Comentário enviado por _m4n14c_2 em 20/10/2011 - 04:06h

Só lembrando, o própro ssh possui uma switch para passar os dados pelo gzip (-C). Como voce propos usar o tar seria mais vantajoso usar algoritmo bzip no lugar do gzip, bastar usar a switch j no lugar do z. Assim ganha-se um pouco de velocidade na transmissão dos dados, já que o bzip é mais eficiente que o gzip:

tar cj dados/ | ssh root@172.20.1.132 "tar xj && echo SUCESSO na cópia. SCP é para os fracos"

[13] Comentário enviado por emtudo em 31/08/2012 - 22:00h

Cara, preciso dizer:


excelente artigo...

[14] Comentário enviado por jwolff em 18/12/2012 - 16:47h

Eu iria criar um Artigo com Script sobre Tunelamento por SSH para burlar firewall e squid. Mas você mostrou todos os pontos fracos neste Post e seria em vão meu Artigo.
O que me resta é lhe dar os Parabéns,você é muito bom!

[15] Comentário enviado por c4rnivor3 em 18/02/2013 - 21:39h

Otimo artigo. Muito grato pelo conhecimento! Se possível, faz um sobre o Netcat. Ficar no aguardo!

[16] Comentário enviado por qxada07 em 29/12/2014 - 13:36h

Parabéns...

Ótimo exemplo a forma de utilizar para acessar os switch's.

Show de bola


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts