Nmap

El primer pas de qualsevol projecte de hacking ètic és obtenir el màxim d’informació sobre l’objectiu. L’eina més coneguda i que més gent utilitza és l’anomenada Nmap.

Nmap és un programa que, mitjançant l’enviament de paquets IP contra l’objectiu, és capaç de determinar quins ports estan oberts, quins serveis estan funcionant i quines versions tenen. En certes condicions pot extreure informació rellevant de la màquina i explotar vulnerabilitats.

Per mostrar correctament els exemples i els paquets que s’intercanvia el client i el servidor he utilitzat Wireshark. I com a servidor, he instal·lat una màquina virtual de Damn Vulnerable Web Application.

Nota: tots els exemples que veuràs a continuació s’han fet contra una màquina local amb l’IP 192.168.1.105. Si vols provar-ho a casa, hauràs de canviar aquesta IP per la de l’objectiu.

Introducció

Abans d’entrar en matèria vull fer una breu introducció sobre alguns conceptes bàsics de xarxes, ja que la meva intenció és aprofundir una mica tècnicament en les explicacions sobre com funcionen alguns dels paràmetres d’Nmap.
Si només vols saber quins paràmetres utilitzar sense l’explicació tècnica, pots passar directament al següent apartat.

Ports i serveis

Un ordinador és una màquina electrònica que rep i processa dades per a convertir-les en informació útil. Per defecte, si no se li fa res, l’ordinador està aïllat de qualsevol màquina, incloent Internet. Per a que es pugui comunicar amb altres ordinadors, s’han d’obrir el que es coneixen com a ports.

Un port és un punt virtual on l’ordinador assigna un servei en concret. Això permet la comunicació entre ordinadors que tinguin el mateix servei executant-se. Per exemple, si et vols connectar a una pàgina web en concret, és necessari que el servidor que allotja la web tingui el port 443 obert amb un servei (HTTPS) que permeti comunicar-se amb el teu ordinador per enviar-te la pàgina web.

Un altre exemple seria que depenent de la feina que tinguis, potser t’has adonat que quan connectes l’ordinador a la xarxa de l’empresa, pots accedir a unes carpetes compartides. Això és possible gràcies a que tots els ordinadors tenen configurat el servei SMB o Samba el qual permet la comunicació entre diferents ordinadors que estiguin a la mateixa xarxa.

Hi ha un total de 65535 ports, pots consultar la pàgina de Internet Assigned Numbers Authority (IANA) si vols tenir-ne un llistat. Estan dividits en les següents categories:

  • Ports coneguts: van del 0 al 1023 i són els que s’utilitzen habitualment. Normalment són processos que necessiten privilegis, executen els servidors i es queden escoltant possibles connexions entrants.
  • Ports registrats: són ports que normalment utilitzen aplicacions d’usuari de forma temporal quan es connecten als servidors, però també els poden utiltizar serveis de tercers. Van del 1024 al 49151. Per exemple, quan el teu ordinador es connecta al port 443 (HTTPS) d’un servidor, el port que utilitza el teu ordinador no és el 443, sinó podria ser el 31564. Així que la comunicació aniria des del port 31564 del client al 443 del servidor.
  • Ports dinàmics/privats: són ports que poden ser utilitzar per aplicacions d’usuari, però no són comuns. Van des del 49152 al 65535.

Els ports coneguts més utilitzats són:

  • Ports 20 i 21: File Transfer Protocol (FTP). Protocol que permet intercanviar fitxers entre client i servidor.
  • Port 22: Secure Shell (SSH): Protocol que permet crear connexions xifrades entre dos ordinadors. Permet a l’usuari connectar-se remotament a un altre ordinador.
  • Port 25: Simple Mail Transfer Protocol (SMTP). És el que utilitzen els servidors de mail per enviar emails.
  • Port 80: Hypertext Transfer Protocol (HTTP). L’útilitzen servidors que allotjen pàgines web. S’ha de tenir en compte que aquest protocol no xifra les comunicacions.
  • Port 443: HTTP Secure (HTTPS). És el mateix que el port 80 però amb comunicacions xifrades. És el protocol que uitilitzen la majoria de les pàgines web avui en dia.
  • Port 3389: Remote Desktop Protocol (RDP). Servei que permet a l’usuari connectar-se remotament a un ordinador (escriptori remot).

Handshake

El conegut com Handshake fa referència a la negociació entre dos extrems. En anglès Handshake vol dir “donar-se la mà”. Bàsicament és un protocol que permet a dos ordinadors presentar-se abans d’enviar-se informació. D’aquesta manera permet assegurar-se de que ambdós màquines poden establir una connexió per a realitzar un intercanvi de dades.

Per saber si el port d’un ordinador està obert, s’utilitza el protocol de Handshake amb tres passos (SYN, SYN/ACK, ACK):

  1. El client envia un paquet SYN al servidor
  2. Si el servidor té el port tancat, respondrà amb un RST. Sinó, respondrà amb un paquet SYN/ACK.
  3. Finalment, el client tanca la negociació amb un paquet ACK.
File:Tcp-handshake.svg
Handshake iniciar comunicació

A partir d’aquí, client i servidor es poden enviar dades. Cal tenir en compte que cada paquet enviat té un paràmetre seq (seqüència) i ack (rebuda) que permeten validar la correcte recepció dels paquets. Si per exemple, el client està esperant el paquet 130 i el servidor passa del 129 al 131, vol dir que un s’ha perdut. De tal manera, que el client ho detectarà i enviarà una petició al servidor demanant una altra vegada el 130.

Per tancar la comunicació, s’utilitza la negociació en 4 passos (FIN, ACK, FIN, ACK) des de cada una de les bandes. Tot i així, es pot fer igualment amb la negociació en 3 passos (FIN, ACK/FIN, ACK):

Hanshake tancar comunicació

TCP i UDP

TCP significa Transmision Control Protocol i és el més utilitzat d’Internet. El protocol TCP garantitza que el destinatari rebrà tots els paquets en ordre. Per fer-ho, utilitza el Handshake i l’enumeració que he explicat al punt anterior.
A més a més, també es comprova que els paquets no continguin cap error. Aquest és el motiu del perquè els fitxers que et descarregues no es corrompen, inclús quan hi ha problemes amb la xarxa.

User Datagram Protocol (UDP) és un protocol que funciona similar a TCP però elimina les comprovacions d’errors. Quan s’envien paquets al destinatari, el servidor no esperarà a assegurar-se que l’hagi rebut correctament, sinó que seguirà enviant-los fins que s’acabin, no l’importa si alguns s’han perdut pel camí.
UDP s’utilitza quan es prioritza la velocitat davant a la correcció d’errors. Per exemple, quan es fan transmissions en viu o en videojocs online.

Concluïnt, tan TCP com UDP són protocols utilitzats per enviar paquets entre màquines a través d’Internet. UDP és un protocol sense connexió i TCP és un protocol orientat a la connexió. Això vol dir que amb UDP el servidor origen no estableix una connexió inicial amb el destinatari, sinó que simplement envia paquets sense preocupar-se si hi ha hagut algun error. En canvi, TCP estableix un una comunicació inicial entre client i servidor i s’assegura que tots els missatges s’han enviat i rebut correctament.

Així que TCP és un protocol més lent que UDP però té garanties de que no hi ha hagut errors.

Descobriment

nmap IP

Per defecte Nmap realitza un TCP Handshake (marcat en vermell), abans de enviar els paquets de descobriment de ports, per saber si l’objectiu està actiu o no:

Handshake inicial (en vermell)

No obstant això, si no t’interessa saber si l’objectiu està actiu o ja ho saps per altres mitjans, potser t’interessa utilitzar el paràmetre -Pn per evitar-ho.

nmap -Pn IP

D’aquesta manera, l’escaneig anirà una mica més ràpid:

No hi ha handshake inicial

Tècniques d’escaneig

Paràmetre sT

nmap -sT IP

Quan llances Nmap sense permisos d’administrador, per escanejar els ports TCP Nmap utiltiza una funció del sistema anomenada connect(). Aquesta funció realitza tot el Handshake complet (SYN, SYN/ACK, ACK) el qual és més lent però assegura que la comunicació s’obri i es tanqui. Si es fa tot el Handshake implica que el port està obert, sinó Nmap el marca com a tancat.
Pots afegir el paràmetre -sT per forçar que la connexió es faci així.

Escaneig port 443

Nota: si has de fer auditories internes, la recomanació és utilitzar el paràmetre -sT per evitar problemes. Sobretot si saps que l’infraestructura és molt antiga.

Paràmetre sS

sudo nmap -sS IP

Aquest paràmetre és el que utilitza Nmap per defecte si l’executes amb permisos d’administració. És més ràpid que el sT perquè no utilitza cap crida de sistema i no acaba dels connexions.

Com pots veure a la següent captura amb Wireshark, Nmap determina que el port està obert en el moment on rep el SYN/ACK. En lloc de tancar la comunicació enviant l’ACK, passarà a escanejar el següent port:

Escaneig ports 80 (en blau) 443 (en vermell)

Si enlloc de rebre el SYN/ACK rep un RST/ACK o directament no rep resposta del servidor, implica que el port està tancat:

Escaneig port tancat 8000

IMPORTANT: es recomana utilitzar el paràmetre sS només quan s’escanegin objectius d’Internet o es sàpiga del cert que la xarxa interna no és molt antiga. Sinó, el fet de no tancar les connexions podria provocar una denegació de servei a alguns firewalls antics configurats incorrectament.

Paràmetre sU

sudo nmap -sU IP

Aquest paràmetre s’utilitza per escanejar ports UDP i es pot combinar amb el sT o sS.
Escanejar ports UDP amb Nmap pot ser lent, ja que aquest protocol no té control d’errors i Nmap seguirà enviant paquets si no rep cap resposta. Després d’alguns intents determina:

  • Port obert: l’objectiu respon
  • Port tancat: l’objectiu respon amb un ICMP
  • Port open/filtered: no hi ha cap resposta de l’objectiu i per tant, Nmap no pot determinar si està obert o tancat.

Nota: una possible estratègia per escanejar tots els ports UDP sense perdre tant de temps és utilitzar el programa unicornscan, ja que aquest escaneja de manera asíncrona i va més ràpid. Els resultats es poden combinar amb Nmap per extreure més informació.

Obtenir informació

Paràmetre O

nmap -O IP

Nmap intentarà esbrinar quin sistema operatiu està corrent a la màquina objectiu. Cal tenir en compte que és una suposició, no t’ho prenguis com un resultat 100% verídic.
Normalment acostuma a encertar correctament si el sistema és un Windows o un Linux però acostuma a fallar amb la versió.

Nmap detectant el sistema operatiu

Si tens més curiositat per saber les proves que realitza, pots fer-li una ullada aquí: enllaç (https://nmap.org/book/osdetect-methods.html)

Paràmetre sV

nmap -sV IP

Quan Nmap detecta un port obert, normalment indica quin servei hi ha a darrere, sobretot si el port forma part dels ports coneguts (entre 0 i 1023). No obstant això, és possible que t’interessi obtenir més informació d’aquest servei, com per exemple la versió:

Versions dels serveis

Per a poder obtenir tota aquesta informació, Nmap utilitza diverses tècniques depenent de quin port estigui analitzant. Si el port és 80 per exemple, nmap envia simplement una petició GET i analitza les capçaleres de la resposta:

Versió del servidor a la capçalera “Server” de la resposta

Altres serveis com SSH o FTP, inicia una connexió i analitza l’informació del servidor:

Versió de SSH a la resposta del servidor

Paràmetre sC

nmap -sC IP

A la carpeta /usr/share/namp/scripts/ hi ha una sèrie d’scripts que serveixen per obtenir més informació o inclús per explotar alguna vulnerabilitat en concret. El paràmetre sC farà que Nmap llanci scrips no perillosos amb l’objectiu d’obtenir més informació sobre el servei o la màquina:

Informació extra obtinguda amb scripts

Paràmetre A

nmap -A IP

Aquest paràmetre és una combinació dels tres anterior (-O, -sC i -sV):

Combinació comandes sV (en blau), sC (en vermell) i O (en verd)

Especificació de ports

Paràmetre p

Per defecte Nmap escaneja els 1000 ports més comuns, que no els 1000 primers ports. Amb el paràmetre -p pots especificar quins ports vols que analitzi, per exemple el port 80 i 443:

nmap -p 80,443 IP

Si vols que escanegi tots els ports (65535) ho pots indicar de la següent manera:

nmap -p- IP

Paràmetre top-ports

Si vols que l’escaneig vagi més ràpid, potser t’interessa reduir el nombre de ports a escanejar. Ho pots fer amb el paràmetre top-ports. Per exemple, si poses 400, Nmap escanejarà els 400 ports més utilitzats:

nmap --top-ports 400 IP

Paràmetre F

nmap -F IP

Aquest paràmetre escaneja només el 100 ports més utilitzats. Va bé si vols escanejar ràpidament o simplement vols saber si una màquina està activa o no.

Temps d’execució i rendiment

Nmap té 6 modes diferents d’executar-se que tenen un impacte directe en el temps i rendiment (del T0 al T5). Per defecte, Nmap utilitza el T3. No obstant això, ho pots canviar manualment:

nmap -T5 IP

Si no estàs escanejant xarxes molt antigues o sistemes SCADA, no es recomanen els modes T0, T1 i T2 perquè són molt lents. Normalment els pentesters utilitzen els modes T3 i T4. Per últim, el mode T5 només és recomana si estàs segur de que no saturaràs la xarxa, ja que va molt ràpid però per contra és possible que alguns resultats siguin incongruents.

A la següent taula pots veure en detall la diferència entre cada mode:

T0T1T2T3T4T5
PropietatParanoidSneakyPoliteNormalAgressiveInsane
min-rtt-timeout [ms]10010010010010050
max-rtt-timeout [ms]300.00015.00010.00010.0001.250300
initial-rtt-timeout [ms]300.00015.0001.0001.000500250
max-retries1010101062
host-timeout [ms]00000900.000
parallelismNoNoNoSiSiSi
Taula de temps

Cada atribut es pot modificar manualment afegint l’atribut com a paràmetre, per exemple:

nmap -T3 --initial-rtt-timeout 500 IP

Scripts

Nmap té una serie d’scripts a la carpeta /usr/share/nmap/scripts/. Pots executar qualsevol script utilitzant el paràmetre –scripts:

nmap --scripts NOM_SCRIPT IP

Per exemple, executant un script per obtenir informació sobre el xifrat d’una pàgina:

Resultat de l’execució de l’script ssl-enum-ciphers

Els scripts estan agrupats per categories per si vols llençar-los de cop amb un objectiu en concret:

  • Auth: executa els scripts relacionats amb autenticació
  • Default: executa els scripts per defecte
  • Discovery: executa scripts d’extracció d’informació
  • External: executa scripts per utilitzar recursos externs
  • Intrusive: executa scripts que es consideren intrusius o perillosos per l’objectiu
  • Malware: executa scripts que busquen si hi ha conexions obertes per códi maliciós o backdoors
  • Safe: executa scripts no intrusius
  • Vulns: executa scripts que descobreixen vulnerabilitats conegudes
  • All: executa abolutament tots els scripts

Per exemple, si vols escanejar vulnerabilitats:

nmap --script vuln IP
Exemples de vulnerabilitats web trobades

Per últim, indicar que també pots utilitzar el símbol * per executar scripts que tinguin el mateix nom. Per exemple, si vols executar tots els scripts d’escaneig de vulnerabilitats de smb pots fer-ho així:

nmap --script smb-vuln* IP

Comandes i truquillos

A continuació et mostro les comandes i estratègies que més utilitzo durant les proves de hacking ètic.

Comandes

La comanda per defecte que acostumo a utilitzar és la següent:

sudo nmap -Pn -sS -T4 -sC -sV IP

Bàsicament perquè vagi ràpid indico el paràmetre -sS i -Pn. Utilitzo els paràmetres -sC i -sV enlloc del -A per evitar que m’escanegi el sistema operatiu, ja que és quelcom que normalment no m’interessa i pot tardar bastant.

Estratègia

Si només vols escanejar un objectiu, aquest punt et serà una mica igual. Hi ha vegades que m’ha tocat escanejar milers de IPs d’una empresa i com deus suposar, no és viable escanejar tots els ports de cada una d’elles.

Aquesta estratègia l’he anat desenvolupant al llarg dels anys tenint en compte també les següents estadístiques, tenint en compte el temps que tinc per intentar aconseguir el millor resultat possible:

  • Analitzant el Top 100 de ports es descobreix el 80% dels ports de l’objectiu.
  • Analitzant el Top 1000 de ports es descobreix el 98% dels ports de l’objectiu.
  • Analitzant els 65535 ports es descobreix el 100% dels ports de l’objectiu.

Així que moltes vegades, no cal invertir moltíssimes hores analitzant tots els ports de milers de servidors, sinó que surt a compte analitzar només el Top 1000 i acceptar el risc de no descobrir un 2% dels ports.

Segueixo els següent passos:

Descobriment

Comprovar si les màquines responen correctament a PING. Si és així, identificar els servidors actius amb el paràmetre -sP:

nmap -sP IP/rang

Si no és factible perquè el firewall bloqueja el protocol ICMP, escanejar els TOP 100 dels ports amb el paràmetre -F:

sudo nmap -Pn -sS -T4 -F IP/rang

Obtenció d’informació

Una vegada s’ha obtingut una llista dels servidors actius, llençar scripts de descobriment bàsic als top 1000 ports (el paràmetre -iL serveix per indicar a Nmap que agafi les IPs d’un llistat):

sudo nmap -Pn -sS -T4 -sC -sV -iL IP_ACTIVES.txt

Analitzar tots els ports

Si és necessari per l’auditoria descobrir tots els ports de cada servidor, recomano fer-ho sense llençar scripts. Sobretot perquè si hi ha moltes màquines actives, tardarà moltíssim:

sudo nmap -Pn -sS -T4 -p- -iL IP_ACTIVES.txt

Anàlisis manual

Una vegada tens tots els resultats, toca analitzar-los manualment. Pots ajudar-te d’eines com nmap-parse-output per centralitzar i resumir els resultats obtinguts.

A partir d’aquí, si detectes un servei interessant, pots llençar Nmaps més específics utilitzant scripts o realitzar proves o atacs manualment.

Deixa un comentari