130 lines
4.1 KiB
Markdown
130 lines
4.1 KiB
Markdown
+++
|
|
date = '2024-10-31T22:00:53-03:00'
|
|
title = 'Netcat'
|
|
description = "Post no blog do Thanwer sobre a ferramenta netcat."
|
|
tags = [
|
|
"GNU/Linux",
|
|
"Tools",
|
|
]
|
|
canonical = "/posts/netcat"
|
|
+++
|
|
|
|
Já ouvi muitas vezes de algum colega de trabalho, ou de algum prestador de serviços frases como "Tem algo de errado com a rede", ou "Essa porta não está aberta!".
|
|
|
|
Voce pode usar testes online para verificar as portas abertas, uma rapida pesquisa no Google vai te trazer resultados bons, porem nem sempre isso é o suficiente.
|
|
|
|
## O problema
|
|
Vamos supor que voce seguiu meu outro post sobre [restringir por endereço de origem no iptables({{< ref "/posts/iptables-basics" >}} "Iptables basics"), nesse caso essas ferramentas aleatórias não vão lhe ajudar, então voce pode usar o nmap!
|
|
|
|
Farei um post sobre o nmap no futuro, por enquanto vamos usa-lo de forma bem simples para verificar se uma porta está aberta:
|
|
|
|
```bash
|
|
$ sudo nmap -sS -p 80 example.com
|
|
Password:
|
|
Starting Nmap 7.95 ( https://nmap.org ) at 2024-10-31 22:08 -03
|
|
Nmap scan report for example.com (192.0.0.4)
|
|
Host is up (0.18s latency).
|
|
Other addresses for example.com (not scanned): 2001:db8::192:0:0:4
|
|
|
|
PORT STATE SERVICE
|
|
80/tcp open http
|
|
|
|
Nmap done: 1 IP address (1 host up) scanned in 0.39 seconds
|
|
```
|
|
|
|
Como voce pode ver, a parte importante é o -p 80, que especifica a porta que queremos testar, 80 nesse caso, e o ultimo argumento é o host que estamos escaneando.
|
|
|
|
Agora vamos supor que a outra pessoa está configurando uma central telefonica, que é um exemplo clássico... Eu tenho muitas historias para contar sobre essa galera da telefonia... Por exemplo, ele pode ter errado uma configuração simples, como o gateway ou a mascara de rede, e isso vai fazer com que o seu serviço não funcione. Ele vai fazer os testes que expliquei acima e em vez da porta aparecer como "open" ela vai dizer "filtered".
|
|
|
|
Com isso ele vai ter o argumento pronto, e vai culpar a sua rede por isso. Como podemos provar que as nossas regras de firewall estão corretas e funcionando?
|
|
|
|
A forma mais simples é usar o netcat!
|
|
|
|
## netcat (nc)
|
|
|
|
O netcat é uma ferramenta super simples, porem muito poderosa para esses casos. Com ela voce pode subir rapidamente um serviço em qualquer porta TCP ou UDP!
|
|
|
|
### Instalação
|
|
|
|
A instalação é muito simples! Em um sistema Debian basta executar o seguinte comando:
|
|
```bash
|
|
$ sudo apt install netcat
|
|
```
|
|
|
|
### Usando a ferramenta
|
|
|
|
Lhes convido a ler a [man page do nc](https://linux.die.net/man/1/nc).
|
|
|
|
Os principais argumentos que precisamos são:
|
|
|
|
* -p : Isso especifica a porta que queremos escutar.
|
|
* -k : Isso mantem o netcat aberto mesmo depois do cliente desconectar.
|
|
* -u : Isso faz o netcat escutar UDP em vez de TCP.
|
|
|
|
### Casos de uso
|
|
|
|
#### Testar comunicação de rede
|
|
|
|
Escutar na porta 2000:
|
|
```bash
|
|
$ nc -l 2000
|
|
|
|
```
|
|
Isso inicia um serviço na porta 2000.
|
|
|
|
Agora vamos abrir outro terminal e conectar um cliente a essa porta:
|
|
```bash
|
|
$ nc localhost 2000
|
|
|
|
```
|
|
|
|
Em ambos os terminais voce deve ver algo semelhante a um chat funcionando, isso é transmitido atravéz da rede!
|
|
|
|
Veja um exemplo disso funcionando:
|
|
|
|

|
|
|
|
#### Transferencia de arquivos
|
|
|
|
O netcat tambem pode ser usado para transferir arquivos entre dois hosts, isso é util em casos de ambientes sem acessos FTP ou SCP.
|
|
|
|
No receptor:
|
|
|
|
```bash
|
|
$ nc -l -p 1234 > arquivo_recebido.txt
|
|
```
|
|
No transmissor, assumindo que o receptor seja o IP 192.0.0.2::
|
|
|
|
```bash
|
|
$ nc 192.0.0.2 -p 1234 < arquivo_para_enviar.txt
|
|
```
|
|
|
|
Isso pode ser util para transferir um arquivo de log, por exemplo.
|
|
|
|
#### Port scac
|
|
|
|
nc pode ser usado como uma alternativa "mais barata" para o nmap:
|
|
```bash
|
|
$ nc -z host.example.com 20-30
|
|
Connection to host.example.com 22 port [tcp/ssh] succeeded!
|
|
Connection to host.example.com 25 port [tcp/smtp] succeeded!
|
|
```
|
|
|
|
#### Falar diretamente com servidores
|
|
|
|
nc também pode ser usado como alternativa para o telnet em alguns casos para troubleshooting.
|
|
|
|
Por exemplo, podemos falar diretamente com um servidor SMTP na porta 25:
|
|
|
|
```bash
|
|
$ nc localhost 25 << EOF
|
|
HELO host.example.com
|
|
MAIL FROM: <user@host.example.com>
|
|
RCPT TO: <user2@host.example.com>
|
|
DATA
|
|
Body of email.
|
|
.
|
|
QUIT
|
|
EOF
|
|
```
|