Probablemente muchos de los lectores de este blog conocen bastante
bien el funcionamiento de Nmap y los principales tipos de escaneos que
se pueden llevar a cabo con esta potente herramienta. Se trata de una
utilidad muy especial en el arsenal de cualquier hacker o pentester,
aunque sin duda lo es más, entender cuándo y en qué momento se debe
lanzar un escaneo de un tipo determinado contra un objetivo, es decir,
contar con el conocimiento sobre el modelo OSI y cómo se comunican los
ordenadores entre si. Si bien Nmap permite cosas que otras herramientas
similares no soportan, como por ejemplo sus capacidades de scripting por
medio del motor NSE, es interesante conocer otras soluciones y
proyectos que van por la misma línea de Nmap. Una de estas herramientas
es “Zmap” un escáner de puertos muy interesante, especialmente desde el
punto de vista de un investigador de seguridad. Lo que diferencia a este
escáner de otros tan conocidos como Hping, Nmap, Queso, entre otros, es
que cuenta con varias opciones para lanzar escaneos contra el espacio
de direcciones IPv4 completo. Esto se traduce a que con “Zmap” es
posible analizar de forma sistemática, todas las direcciones IPv4 que se
encuentran disponibles en Internet. Dicho esto, hay que tener en cuenta
ciertas limitaciones, especialmente relacionadas con la capacidad de
computo del ordenador con el que se lanza la herramienta y la velocidad
de la conexión a Internet. Evidentemente en la mayoría de los casos es
mucho más interesante realizar escaneos específicos contra un segmento
de red en Internet o en una Intranet en lugar de hacerlo contra el rango
completo de direcciones IP, para ello Zmap también permite especificar
subnets en formato CIDR y controlar la velocidad con la que se envían
los paquetes de datos al objetivo del escaneo. Por defecto, la
herramienta se encarga de realizar un escaneo del tipo TCP SYN sin
realizar el TCP handshake completo contra el objetivo. Además, intenta
hacerlo con la tasa de transferencia más rápida posible. Este
comportamiento por defecto también se puede personalizar por medio de
una serie de interruptores que se encuentran disponibles en la
herramienta para cambiar el número de direcciones IP que se deben
analizar, el tipo de escaneo, la velocidad de transferencia, listado de
puertos, entre otras.
Instalación y uso de Zmap
Se puede instalar directamente sobre un sistema basado en Debian
utilizando la herramienta “apt-get” o en sistemas basados en RedHat con
la herramienta “yum”, sin embargo, en este tipo de herramientas suele
ser más interesante descargar la última versión de su repositorio de
fuentes y posteriormente compilar e instalar manualmente. El repositorio
del proyecto se encuentra en la siguiente ruta y para instalarlo basta
con ejecutar los siguientes comandos.
>git clone https://github.com/zmap/zmap.git
>sudo apt-get install build-essential cmake libgmp3-dev libpcap-dev gengetopt byacc flex libjson-c-dev
>cd zmap
>cmake -DENABLE_DEVELOPMENT=OFF
>make && make install |
Una vez instalado, se puede comenzar a ejecutar el comando “zmap” y
qué mejor forma que hacerlo utilizando el interruptor “–help” para ver
las opciones de configuración que se encuentran disponibles en la
herramienta.
Los argumentos básicos para utilizar zmap son “-p”, “-o”, “-b”, “-w” y “-f”. A continuación se explica su uso mediante ejemplos.
>sudo zmap -p 80
>sudo zmap -p 80 192.168.0.0/16
>sudo zmap -p 80 192.168.0.0/16 -B 10M
>sudo zmap -B 10M -p 80 -n 10000 -o results.csv |
Loa anteriores son ejemplos básicos sobre el uso de la herramienta,
en donde el interruptor “-p” permite especificar el listado de puertos
que serán escaneados en el objetivo, “-B” permite establecer un límite
máximo en la velocidad de transferencia, “-n” permite establecer un
límite máximo en el número total de máquinas que se deben analizar y
“-o” permite establecer un fichero en el que se escribirán los
resultados arrojados por la herramienta. Finalmente, la herramienta
recibe por argumento un listado de subnets que serán analizadas, aunque
también es posible omitir dicho argumento y en tal caso, el escaneo se
realizará contra el rango completo de direcciones IPv4, algo que como he
comentado anteriormente, no es el mejor de los escenarios, no solamente
por cuestiones de rendimiento y uso de los recursos del ordenador, sino
porque es posible que algún objetivo “se queje” y denuncie de un
posible ataque contra sus infraestructuras por realizar un escaneo de
puertos sin autorización.
Si se utiliza el interruptor “-o”, por defecto solamente incluye las
direcciones IP únicas que han contestado correctamente a un paquete del
tipo SYN/ACK, sin embargo se pueden utilizar reglas sobre los campos que
se deben incluir en el reporte final utilizando “-f”. Para conocer
todos los filtros que se pueden aplicar con este interruptor, se puede
ejecutar zmap con “–list-output-fields”
>zmap –list-output-fields
saddr string: source IP address of response
saddr-raw int: network order integer form of source IP address
daddr string: destination IP address of response
daddr-raw int: network order integer form of destination IP address
ipid int: IP identification number of response
ttl int: time-to-live of response packet
sport int: TCP source port
dport int: TCP destination port
seqnum int: TCP sequence number
acknum int: TCP acknowledgement number
window int: TCP window
classification string: packet classification
success int: is response considered success
repeat int: Is response a repeat response from host
cooldown int: Was response received during the cooldown period
timestamp-str string: timestamp of when response arrived in ISO8601 format.
timestamp-ts int: timestamp of when response arrived in seconds since Epoch
timestamp-us int: microsecond part of timestamp (e.g. microseconds since ‘timestamp-ts’) |
Para conocer en detalle las combinaciones que se pueden aplicar con
estos campos, se recomienda leer la sección correspondiente en la
documentación oficial: https://zmap.io/documentation.html#outputfilter
Por otro lado, además del uso básico de Zmap con los interruptores
anteriormente explicados, también existen algunos ficheros de
configuración que permiten controlar el comportamiento de la herramienta
y jugar con diferentes escenarios. Uno de los más importantes es el
“blacklist.conf”, el cual permite especificar un listado de direcciones
IP en formato CIDR que serán ignoradas del proceso de escaneo. Se
recomienda incluir en dicho fichero, direcciones que no son objeto de
análisis, tales como direcciones de broadcast/multicast y otras
direcciones reservadas. Para especificar un fichero de “blacklist”
personalizado se utiliza el interruptor “-b”.
Para establecer ciertas configuraciones personalizadas se puede crear
un fichero de configuración que será utilizado por Zmap para establecer
algunos valores por defecto cuando se arranca la herramienta, algunos
de esos valores incluyen cosas como la interfaz de red por defecto que
se utilizará, direcciones IP y MAC de origen de las peticiones, tiempo
de espera antes de pasar a la siguiente dirección IP a analizar, entre
otras cosas interesantes. Existe un fichero de configuración por defecto
que se encuentra ubicado en “/etc/zmap/zmap.conf” o en
“<ZMAP_INSTALL>/conf/zmap.conf” dependiendo de si se ha instalado
desde el código fuente o utilizando apt-get/yum. Para especificar un
fichero de configuración personalizado se utiliza el interruptor “-C”.
Un ejemplo del contenido que puede tener un fichero de configuración de
Zmap puede ser el siguiente
target-port 443
rate 10000
bandwidth 1M # 1mbps
blacklist-file “/etc/zmap/blacklist.conf”
summary |
Como se puede apreciar, son opciones que se encuentran disponibles en
la herramienta en la forma de interruptores, pero en este caso, se
puede indicar un valor por defecto en el fichero de configuración y
omitir el uso del interruptor en cuestión, algo que facilitará mucho las
cosas.
>sudo zmap -C /etc/zmap/zmap.conf 62.81.210.0/16 |
Configuración avanzada en Zmap
En primer lugar, existen una serie de interruptores que permiten
controlar los escaneos que se realizan contra las direcciones IP
analizadas. Dichas opciones permiten establecer cosas tales como:
-B: La tasa de bits por segundo enviados por la herramienta (utilizando los sufijos K, M y G para especificar diferentes medidas).
-e: Establecer una semilla para la permutación de direcciones
IP en el escaneo, algo realmente útil si se desea ejecutar Zmap desde
consolas separadas y definiendo diferentes rangos ordenados.
–shards: Particionar el escaneo para ejecutar en diferentes
instancias de Zmap, actuando de forma similar al uso de las semillas
explicado antes.
–r: Permite establecer la tasa de envío de paquetes por segundo.
-T: Número de hilos concurrentes que utilizará la herramienta
para el envío de paquetes. Por defecto, solamente utiliza un único hilo.
Además de estas opciones, también existen otros interruptores que se
centran más en la estructura de los paquetes y otros parámetros de red
que serán empleados para que Zmap construya los paquetes de datos que se
enviarán al objetivo de una forma determinada. Algunos de dichos
interruptores se listan a continuación:
-s: Puerto de origen de los paquetes enviados al destino.
-S: Dirección IP de origen de los paquetes enviados al destino.
-i: Nombre de la interfaz de red utilizada para el proceso de escaneo.
Con todas estas opciones, se pueden hacer algunas pruebas del funcionamiento de la herramienta y analizar su comportamiento.
1. Se especifica que Zmap debe intentar enviar 1 Gigabyte de datos cada segundo en el proceso de escaneo
>sudo zmap -B 1G 62.168.1.0/16 -p 443 |
2. Se especifica que Zmap debe intentar enviar 1 Gigabyte de datos
cada segundo en el proceso de escaneo con una taza máxima de 20 paquetes
por segundo.
>sudo zmap -B 1G 62.168.1.0/16 -r 20 -p 443 |
3. Se especifica que Zmap paquetes de datos con una taza máxima de 20 paquetes por segundo.
>sudo zmap -r 20 62.168.1.0/16 -p 443 |
4. Define el valor 555 como puerto de origen de los paquetes enviados al destino y “192.168.20.112” como dirección IP de origen.
>sudo zmap -s 555 -S 192.168.20.112 62.168.1.0/16 -p 443 |
5. Ejecuta el escaneo anterior utilizando un nombre de interfaz de red distinto (“eth4”) y 20 hilos concurrentes.
>sudo zmap -s 555 -S 192.168.20.112 62.168.1.0/16 -i eth4 -T 20 -p 443 |
Una de las características más interesantes que tiene Zmap, es la
posibilidad de crear y utilizar módulos preexistentes, los cuales
permiten la generación de paquetes de pruebas para enviar y procesar
respuestas desde los hosts escaneados. Es un concepto bastante similar
al motor NSE que existen en Nmap, sin embargo a la fecha de redactar
este artículo, existen solamente 3 módulos para realizar pruebas y
evidentemente, no son tan robustos como los que se encuentran incluidos
en Nmap para la detección de vulnerabilidades o recolección de
información, pero desde luego va por muy buen camino. Para listar los
módulos disponibles se utiliza el interruptor “–list-probe-modules”
>sudo zmap –list-probe-modules
tcp_synscan
icmp_echoscan
udp |
icmp_echoscan:
Este módulo permite ejecutar peticiones ICMP request contra cada uno
de los objetivos del escaneo e incluir entre los resultados, el paquete
ICMP reply que ha devuelto cada uno de los objetivos.
>sudo zmap 62.168.1.0/16 -T 20 -M icmp_echoscan -p 443 |
udp:
Con este módulo, la herramienta se encargará de enviar un datagrama
UDP a cada uno de los destinos del escaneo. Las respuestas en este caso
por parte de los destinatarios pueden ser, o bien un paquete UDP en el
caso de que el host se encuentre activo en el puerto especificado y que
funcione sobre UDP o un paquete ICMP del tipo “Unreachable host”.
También es posible utilizar el interruptor “–probe-args” para
especificar opciones adicionales a los módulos y en el caso concreto del
módulo “udp” se pueden utilizar 4 tipos diferentes de payloads que
serán enviados junto con los datagramas UDP. Dichos argumentos son:
“text”, “hex”, “file” y “template”. Por ejemplo:
>sudo zmap -M udp -p 1434 –probe-args=text:HELO -N 100 -f saddr,data |
Zmap es una herramienta muy flexible que merece la pena utilizar con
más frecuencia y que desde luego, tiene méritos de sobra para hacer
parte de la “caja de herramientas” de un hacker.
Un saludo y Happy Hack!
Autor
Adastra.