Home Security Optimizando NMAP

Optimizando NMAP

by José Luis Sánchez Borque

La herramienta que permite escanear puertos por definición es NMAP. Ya he publicado algún otro POST al respecto:

Taller de Hacking I (nmap a fondo + metasploit básico)

En los cursos que imparto siempre digo que es importante aplicar la técnica de “divide y vencerás”. En el caso de NMAP estoy hablando de intentar separar las técnicas de descubrimiento de host de la de puertos y/o vulnerabilidades.

Resumiendo, no es aconsejable lanzar un escaneo a todos los hosts de una red, a la vez que examinamos para cada uno de dichos hosts todos los posibles puertos abiertos y vulnerabilidades.

☹ #nmap -sS -A -T4 -p- 192.168.1.0/24

Primero os aconsejo aplicar técnicas de descubrimiento de HOSTs, es decir, posibles objetivos conectados. Debéis “rascar” la ayuda de la propia documentación de NMAP para entender la diferencia de los parámetros -sn, -PA, -PS, etc…

No es lo mismo aplicar técnicas en la red local que en una red remota…¿Por qué? Os suena ARP, no? Pues eso… que hay que entender las cosas. Si no lo tenemos claro, nos dejaremos posibles objetivos por descubrir..

Quiero comentaros un detalle que aprendí en HACKTHEBOX, y que me pareció interesante y en la línea de lo que estoy comentando en este POST.

Imaginemos que en primer lugar queremos escanear toda nuestra red de área local para escanear posibles objetivos.

En una red local podemos emplear nmap de la siguiente manera:

# nmap -n -sn 192.168.1.0/24 -oG - | awk '/Up$/{print $2}' > hosts.up
# cat hosts.up

192.168.1.1
192.168.1.10
192.168.1.192

-n desactiva la resolución inversa, solo queremos las IPs. Se gana velocidad evitando las consultas DNS.

-sn para cada host UP, es decir conectado, no se lanza el escaneo por defecto de puertos. Eso lo hacemos luego…

-oG especificamos como formato de salida GREP. El “-“ que añadimos a continuación es para que salga por pantalla. En caso contrario espera un nombre de fichero

– Luego con awk seleccionamos las líneas donde aparece la palabra UP, y visualizamos la segunda columna.

– Todo lo que sale lo enviamos al fichero hosts.up que lo podemos tratar más adelante con el propio nmap o escáneres de vulnerabilidades como OpenVAS o NESSUS.

Para entender todo esto lo suyo es ejecutar antes el comando sin la parte del pipe awk, y nos ayudará a entenderlo todo.

# nmap -n -sn 192.168.1.0/24 -oG -

Ya tenemos las IPs de los hosts que están conectados (UP). Ahora se trata de analizar todos los puertos abiertos para cada host descubierto. La idea no es lanzar un nmap a lo “loco” sobre todos los puertos y con todos los scripts a ver que encontramos….

Lo haremos de una forma algo más elegante y por supuesto eficiente. La idea es obtener el listado de puertos en primer lugar, y luego aplicar los scripts solo sobre los puertos en cuestión y no todos.

Veamos como obtener un listado de los puertos abiertos. En primer lugar, y para ver el resultado hagamos un escáner normal sobre la IP 192.168.1.192

# nmap -p- 192.168.1.192

Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-05 18:38 CEST

Nmap scan report for 192.168.1.192

Host is up (0.0040s latency).

Not shown: 65505 closed ports

PORT STATE SERVICE

21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
25/tcp open smtp
53/tcp open domain
80/tcp open http
111/tcp open rpcbind
139/tcp open netbios-ssn
445/tcp open microsoft-ds
etc……

Con la siguiente orden conseguimos guardar en la variable ports TODOS los puertos TCP abiertos separados por comas. Valor que luego utilizaremos para realizar un examen más profundo de cada host.

# ports=$(nmap -p- --min-rate=1000 -T4 192.168.1.192 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//);

Si visualizamos la variable vemos el resultado guardado en la variable ports

# echo $ports

21,22,23,25,53,80,111,139,445,512,513,514,1099,1524,2049,2121,3306,3632,5432,5900,6000,6667,6697,8009,8180,8787,37006,50158,52858,56658

grep ^[0-9] filtra solo las líneas que presentan un dígito numérico del 0 al 9 en la primera columna. Que si nos fijamos son las líneas de los diferentes puertos abiertos.

# nmap -p- 192.168.1.192 | grep ^[0-9]

21/tcp open ftp
22/tcp open ssh

cut -d ‘/’ -f 1 para cada línea recibida del grep utiliza como delimitador de campos el carácter ‘/’ y se queda solo con el primer campo. En el ejemplo lo que está a la izquierda de la barra, es decir, el número de puerto TCP.

# nmap -p- 192.168.1.192 | grep ^[0-9] | cut -d '/' -f 1

21
22
23
25

tr ‘\n’ ‘,’ sustituimos el salto de línea por el carácter ‘,’

# nmap -p- 192.168.1.192 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ','

21,22,23,25,53,80,111,139,445,512,513,514,1099,1524,2049,2121,3306,3632,5432,5900,6000,6667,6697,8009,8180,8787,38868,53724,56040,57870,

sed s/,$// quitamos la última ‘,’ de la línea que sobra para los procesos posteriores.

# nmap -p- --min-rate=1000 -T4 192.168.1.192 | grep ^[0-9] | cut -d '/' -f1 | tr '\n' ',' | sed s/,$//

21,22,23,25,53,80,111,139,445,512,513,514,1099,1524,2049,2121,3306,3632,5432,5900,6000,6667,6697,8009,8180,8787,38868,53724,56040,57870

Ahora solo queda para cada host del fichero hosts.up realizar un escáner más profundo, en mi caso -A, para todos los puertos almacenados en la variable ports.

Para ello leemos cada línea del fichero hosts.up con un bucle for. Con -n “$ports” controlamos el caso que no haya puertos abiertos, en cuyo caso no hacemos el escaneo sobre dicho host.

Pongamos todo en un script…. En nuestro ejemplo para la red 192.168.1.0/24. Puedes ajustar el valor a tu red evidentemente.

#!/bin/bash

nmap -n -sn 192.168.1.0/24 -oG - | awk '/Up$/{print $2}' > hosts.up
for line in $(cat hosts.up);
do
  echo "Analizando host $line";
  ports=$(nmap -p- --min-rate=1000 -T4 $line | grep ^[0-9] | cut -d '/' -f1 | tr '\n' ',' | sed s/,$//);

  if [ -n "$ports" ]; then
    echo " [$line]: analizando puertos $ports";
    nmap -A -T4 -p$ports $line -oX $line.xml;
  else
    rm -f $line.xml
    echo " [$line]; no se han detectado puertos TCP abiertos";
  fi
done

El resultado final será un fichero xml por cada hosts analizado. Podemos mejorar el script juntando toda la información o pasando como parámetro el valor de la red que deseamos analizar.

# ls *.xml
192.168.1.10.xml 192.168.1.1.xml 192.168.1.192.

Espero os sea de utilidad este script y las técnicas descriptas en este POST.

You may also like

Leave a Comment