Metasploit: idle scanning y el IPID

Hoy intentaremos saltarnos un sistema de detección de intrusos (IDS), al menos en teoría, porque no tengo ninguna maqueta montada para probarlo realmente. A la hora de usar nmap para comprobar la disponibilidad de algunos puertos de una Red es muy posible que cualquier IDS detecte los escaneos y emprenda algún tipo de acción.

El idle scanning se sirve del IPID para echarle el muerto del escaneo a otro ordenador zombie con lo que para hacerlo efectivo debemos -antes de nada- encontrar ese ordenador adecuado al que culpar.

Explicación del proceso

Para detectar si un puerto está abierto o cerrado, es necesario primero observar el IPID del zombie, enviar paquetes a la víctima haciéndole ver que realmente se los está enviando éste y, posteriormente, observar de nuevo el IPID utilizado por el intermediario. En función de los valores iniciales y finales obtenidos, se puede averiguar el estado del puerto destino.
  • El primer paso es enviar al zombie un paquete SYN+ACK, con objeto de que éste nos devuelva el paquete RST correspondiente, del cual tomaremos el IPID.
  • Acto seguido, se realiza una solicitud de conexión a la víctima, previa manipulación del paquete para que sea el zombie el que figure como origen del mismo. Al recibirlo, dado que estamos asumiendo que el puerto está abierto, la víctima envía de vuelta la confirmación de la conexión al que cree que es el solicitante, el zombie. Si el puerto estuviera cerrado la víctima devuelve al aparente emisor un paquete RST indicándole que no será posible establecer la conexión solicitada. El zombie recibe el paquete RST y lo ignora.
  • En caso de correcta conexión, el zombie recibe la confirmación de la conexión, pero como no es él el que la ha generado, responde a la víctima con una señal de reseteo (RST), incrementando su IPID.
  • De nuevo, pasado unos segundos, desde el atacante se vuelve a obtener el IPID del zombie de la misma forma que al comienzo, comprobando que ha sido incrementado en 2 unidades. De esta forma, se determina que el puerto destino del escaneo estaba abierto.
Teóricamente puede parecer algo lioso, aunque si se entiende el proceso el juego se vuelve mucho más divertido. Por suerte -o desgracia- todos estos pasos los podemos automatizar con Metasploit.

Encontrar un zombie

Pasando a la práctica, si queremos encontrar un zombie y utilizamos Metasploit es tan sencillo como usar el scanner que trae para ello:
msf auxiliary(writable) > use scanner/ip/ipidseq
msf auxiliary(ipidseq) > show options

Module options:

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   RHOSTS                    yes       The target address range or CIDR identifier
   RPORT    80               yes       The target port
   THREADS  1                yes       The number of concurrent threads
   TIMEOUT  500              yes       The reply read timeout in milliseconds

msf auxiliary(ipidseq) > set RHOSTS 192.168.1.0/24
RHOSTS => 192.168.1.0/24
msf auxiliary(ipidseq) > set THREADS 50
THREADS => 50
msf auxiliary(ipidseq) > run

[*] 192.168.1.1\'s IPID sequence class: All zeros
[*] 192.168.1.2\'s IPID sequence class: Incremental!
[*] 192.168.1.10\'s IPID sequence class: Incremental!
[*] 192.168.1.104\'s IPID sequence class: Randomized
[*] 192.168.1.109\'s IPID sequence class: Incremental!
[*] 192.168.1.111\'s IPID sequence class: Incremental!
[*] 192.168.1.114\'s IPID sequence class: Incremental!
[*] 192.168.1.116\'s IPID sequence class: All zeros
[*] 192.168.1.124\'s IPID sequence class: Incremental!
[*] 192.168.1.123\'s IPID sequence class: Incremental!
[*] 192.168.1.137\'s IPID sequence class: All zeros
[*] 192.168.1.150\'s IPID sequence class: All zeros
[*] 192.168.1.151\'s IPID sequence class: Incremental!
[*] Auxiliary module execution completed
Dentro de esa red local que hemos escaneado todas las máquinas etiquetadas como Incremental! son ordenadores zombie que podremos utilizar para hacer el escaneo silencioso.

Escaneo silencioso o invisible

Ya hemos hecho lo más complicado, seleccionar la máquina que cargará con nuestras culpas, el resto es cosa de nmap, tan solo hemos de utilizar cualquier ordenador de los etiquetados como Incremental! anteriormente como argumento -sI de nmap:
# nmap -P0 -p- -sI 192.168.1.2 192.168.1.150
Starting Nmap 5.00 ( http://nmap.org ) at 2009-11-05 01:51 CET
Idle scan using zombie 192.168.1.2 (192.168.1.2:80); Class: Incremental
Interesting ports on 192.168.1.150:
Not shown: 996 closed|filtered ports
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
3389/tcp open ms-term-serv
MAC Address: 00:0C:29:41:F2:E8 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 5.56 seconds
La opción -P0 previene que nmap envíe un ping incial a la máquina destino. Esto disminuye la velocidad del escaneo (hay menos información disponible sobre los tiempos), pero asegura que ningún paquete sea enviado al destino desde nuestra verdadera dirección de IP.

La opción -p- se usa para escanear todos los puertos, no solo los \"conocidos\", pero el escaneo será más lento. El -sI es obvio, para usar el zombie en las peticiones.

Y teóricamente -ya os digo que no he probado con ningún IDS activo- deberíamos estar protegidos contra los detectores de escaneos. Aún sabiendo que la curiosidad mató al gato... hacía tiempo que no me divertía tanto.
}:)

Referencias

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.