sexta-feira, 2 de julho de 2010

Netcat - Canivete Suíço de Redes do Linux

Me lembro como se fosse hoje das aulas do curso de redes e segurança em linux, onde durante uma das aulas, estávamos testando recursos como roteamento avançado, VPNs, entre outras e, num dado momento, usando o netcat, montei um esquema de shell remoto usando três telas.

Claro que isso era totalmente desnecessário, mas foi algo que me ajudou no trabalho de configuração das VPNs. E hoje, revendo o material, me lembrei do episódio e resolvi falar um pouco mais sobre essa ferramenta, que é um canivete suíço de redes.

nc -l 1234 | /bin/bash | nc -l 5678

Netcat é uma ferramenta usada para ler e escrever dados em conexões de rede usando o protocolo TCP/IP. Dada sua grande versatilidade, o Netcat é considerado pelos hackers o canivete suíço do TCP/IP, podendo ser usado para fazer desde portscans até brute force...




O nome netcat vem do comando "cat" do Linux. O cat concatena arquivos e envia para a saída padrão (stdout). O netcat faz praticamente o mesmo, porém ao invés de concatenar arquivos, o netcat concatena sockets TCP e UDP.

Como o Netcat funciona

A princípio o Netcat foi lançado para ser um telnet aprimorado. Até então a única utilidade que ele teria seria se conectar a um host. E eu te garanto, até hoje a única coisa que ele faz é isso mesmo, se conectar a um host. Mas aí você me pergunta: "Se ele só faz isso, como ele pode ser tão útil?"

É aí que entra a grande sacada. Como o netcat pega os dados da entrada padrão (stdin) e envia pra outra ponta da conexão, que as escreve na saída padrão (stdout), você pode utilizar ele em conjunto com o shell pra fazer uma infinidade de coisas, limitadas somente pela sua criatividade.

Por exemplo: na imagem do início do post, o que estou fazendo é um "telnet reverso", onde, na máquina que quero que os comandos sejam executados, eu crio um servidor com nc ouvindo na porta 1234 e tudo o que chegar no netcat é enviado para o bash, que processa o que chegar e envia para outro servidor netcat ouvindo na porta 5678. Qual a utilidade disso? Aparentemente nenhuma, pois o telnet e o ssh cumprem muito melhor essa função. No entanto, é uma dica minha e o que me ajudou bastante à detectar problemas na minha configuração de VPN no curso de administração de sistemas linux.

Já que sei que vocês estão curiosos pra saber quais são as utilidades do netcat, vou citar algumas que conheço. Só aviso que o teste dessas técnicas é por sua própria conta e risco. No entanto, se você testar, gostaria que comentasse suas experiências com a ferramenta e quem sabe dar dicas de outros usos, já que o que limita o uso dela é só sua criatividade.

Escaneando portas com o Netcat

Será feita uma tentativa de conexão à um IP ou host e será estipulada as portas da tentativa de conexão:

$ nc -vv localhost -z 1-3000

Aqui serão escaneadas desde a porta 1 até a 10000.

Bruteforce com Netcat

O brute-force é o método de tentativa de obtenção de senhas utilizado quando um cliente se conecta a um host e tenta se logar, utilizando uma seqüência de senhas que estão em um arquivo. Ou seja, se eu pegar o Netcat eu posso me CONECTAR ao host e com uma linha de comando, posso completar o comando com a comparação para obtenção das senhas.

$ nc -vv 79 < ~/wordlist.txt > nc_log.log

Perceba, que conectaremos a porta do FINGER(79) e redirecionaremos o conteúdo do arquivo wordlists.txt para essa porta. Quando algum resultado for válido ele será salvo em nc_log.log para que você possa analizar posteriormente.

Sniffer com Netcat

O Netcat pode capturar todo o tráfego de uma rede. Eu acho que você já sabe como fazer isso se observar os redirecionamentos utilizados no exemplo anterior. Mas vamos lá.

Iremos nos conectar a uma porta e mandar o netcat "dar eco" nela, ou seja, exibir TUDO o que passa por ela. Após isso, é só redirecionar tudo o que o Netcat gravou para um arquivo. Veja a sintaxe, para melhor compreensão:

$ nc -vv localhost 80 > ~/sniffer.log

Transferência de arquivos com Netcat

Sim, é possível transferir arquivos de maneira fácil usando o Netcat. A vantagem em relação à outros métodos é a velocidade. No entanto, desde que você queira somente transferir um único arquivo, ou uns poucos, o Netcat pode ser uma excelente solução para isso:

Primeiro vamos montar nosso servidor, que ficará esperando uma conexão e direcionaremos sua saída para um arquivo, que chamaremos de arquivo.zip

nc -l 1234 > arquivo.zip

Em seguida, vamos abrir uma conexão com nosso servidor, e direcionaremos um arquivo, por exemplo original.zip, para a entrada padrão desse cliente, da seguinte forma:

nc localhost 1234 < original.zip Chat simples usando o Netcat

Acho que todo mundo que já usou o netcat já deve ter feito isso. Pra mim uma opção extremamente simples e que pode ser muito útil em determinadas situações.

Simplesmente crie um servidor do netcat e abra uma conexão cliente para essa porta. O que você digitar de um lado, aparecerá do outro ...

nc -l 1234

nc localhost 1234

Fazendo Spoof em servidores HTTP

Você pode usar o netcat para se conectar a um servidor web usando cabeçalhos totalmente personalizados. Você pode adicionar quaisquer USER-AGENT, referer, ou qualquer outra informação de cabeçalho HTTP. Eu sinceramente acho isso muito útil, e foi usando o netcat e o wireshark (shiffer de rede) que eu descobri uma forma de enviar scraps em massa para o orkut, na época do layout antigo (Scraptimizer, não funciona mais).

$ nc google.com 80
GET / HTTP/1.1
Host: google.com
User-Agent: Vindex
Referrer: http://tocadoelfo.blogspot.com


HTTP/1.0 200 OK
Content-Type: text/html; charset=UTF-8
Last-Modified: Fri, 02 Jul 2010 21:02:58 GMT
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Expires: Fri, 02 Jul 2010 22:07:19 GMT
Date: Fri, 02 Jul 2010 22:07:19 GMT
Cache-Control: public, max-age=0, proxy-revalidate, must-revalidate
ETag: "73202059-b4d7-4150-bdb0-e42c3bbe0c0b"
Server: GSE
X-Cache: HIT from gw.ifto.edu.br
Via: 1.0 gw.ifto.edu.br (squid/3.0.STABLE16)
Proxy-Connection: close


Aqui o exemplo do cabeçalho. Não vou colar o código todo.

Clonar partições via rede com o Netcat

Uma das técnicas um pouco perigosas é a clonagem de partições via rede. Eu já fiz o teste em duas máquinas de manutenção, que não tinha problema perder dados, e a técnica funcionou de boua. NÃO FAÇA NA SUA MAQUINA SE VOCÊ NÃO SOUBER O QUE SIGNIFICA!

Primeiro, eu crio um servidor com o netcat e redireciono a saída dele para o comando dd:

$ nc -l 1234 | dd of=/dev/sda

Em seguida, eu rodo o dd, que vai fazer uma varredura no disco e enviar tudo para a entrada padrão (stdin) do netcat, que se conectará à nosso servidor previamente configurado:

$ dd if=/dev/sdb | nc localhost 1234

É claro, você precisará estar com os discos desmontados para que o comando funcione. Minha sugestão é usar um LiveCD nas máquina. Nesse nosso caso eu me conectei à mesma máquina, mas nada impede que essa conexão se dê via rede ou mesmo via internet.

Criando um servidor web simples com o netcat

Esse é meu truque favorito, não vou mentir. Apesar de nunca ter usado ele para algo mais do que passar cola de um trabalho pra meus colegas de sala, essa técnica é interessante e mostra um pouco mais da interação do shell com o netcat:

$ while true; do nc -l 80 -q 1 < pagina.html; done Esse comando roda o netcat infinitamente e a cada vez que ele roda, o arquivo pagina.html é enviado para o cliente, no nosso caso o browser, que você pode acessar com o endereço http://localhost Conclusão

Apesar de ser capaz de fazer tudo o que ele faz, o netcat ainda está em conformidade com a filosofia Unix de ao fazer uma coisa fazê-la bem. Netcat foi projetado para uma única finalidade - a ler e escrever pacotes de dados em conexões de rede. E por causa de sua singular finalidade pode ser utilizada de uma miríade de formas.

É irônico, mas quanto mais características mais você adicionar à sua aplicação, mais especializado ele fica.

Eu já ouvi falar que a ferramenta socat é mais poderosa que a netcat por ter ainda mais funcionalidades. Pessoalmente, eu não usei essa ferramenta. No entanto, acredito que qualquer coisa que essa ferramenta fizesse, poderia ser feito, de alguma forma, com o netcat.

É isso pessoal. Espero que esse tutorial seje de uma utilidade tão grande como foi para mim. Até uma próxima postagem!

Fonte: manpage do netcat