Existen distintas técnicas que permiten conocer cuales puertos se encuentran abiertos en una máquina remota, cada una estas técnicas utilizan distintos tipos de envío de paquetes y protocolos, sin embargo, cuando hay un Firewall o un IDS de por medio, lo más probable es que los escaneos sean infructuosos, dado que la salida más frecuente, será precisamente ver todos los puertos bloqueados. Por ejemplo, si ejecutamos un clásico escaneo de puertos contra una máquina windows sin un firewall activo, podríamos ver lo siguiente:

>nmap -sS -sV 192.168.1.38

Starting Nmap 5.21 ( http://nmap.org ) at 2011-05-29 01:52 CEST

Nmap scan report for 192.168.1.38

Host is up (0.00062s latency).

Not shown: 997 closed ports

PORT STATE SERVICE VERSION

135/tcp open msrpc Microsoft Windows RPC

139/tcp open netbios-ssn

445/tcp open microsoft-ds Microsoft Windows XP microsoft-ds

MAC Address: 08:00:27:61:34:29 (Cadmus Computer Systems)

Service Info: OS: Windows

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 7.71 seconds

Es posible ver los puertos y los servicios en ejecución, sin embargo, contra la misma máquina, con el firewall correctamente configurado, lo mas probable es que la salida del mismo comando sea similar a la siguiente:

>nmap -sS -sV 192.168.1.38

Starting Nmap 5.21 ( http://nmap.org ) at 2011-05-29 01:50 CEST

Nmap scan report for 192.168.1.38

Host is up (0.00038s latency).

All 1000 scanned ports on 192.168.1.38 are filtered

MAC Address: 08:00:27:61:34:29 (Cadmus Computer Systems)

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 21.71 seconds

No solamente el escaneo ha tardado tres veces más, ademas no ha arrojado ningún resultado de interés, solamente que la máquina objetivo se encuentra activa, ahora bien, cómo es posible determinar si un puerto se encuentra abierto o incluso el sistema operativo en ejecución si existe un Firewall que impide conocer estos detalles? En NMAP existen algunas técnicas que permiten detectar cuando un puerto se encuentra abierto y filtrado por el firewall, a continuación se listan algunas de ellas:

TECNICAS DE EVASION DE NMAP

Aunque existen algunos tips que le permiten a un pentester obtener información sobre puertos y servicios que se encuentran filtrados por un firewall, no existe una opción en nmap que permita identificar si un puerto determinado se encuentra abierto y/o esta filtrado por un firewall, solamente conociendo el protocolo TCP/IP y como funciona el intercambio de paquetes entre dos máquinas, le permite a un atacante identificar cuales puertos se encuentran realmente abiertos. Para controlar las características de envió de paquetes a un host objetivo se pueden establecer algunas opciones en Nmap con el fin de controlar y de alguna forma, predecir las respuestas del host objetivo, algunas de estas opciones se listan a continuación (se asume que el lector tiene conocimientos básicos sobre el protocolo IP y sobre las capas del módelo OSI)

NOTA: Frecuentemente cuando un sistema se encuentra protegido con un sistema de protección como un Firewall o un IDS, evadir estos mecanismos puede llevar tiempo, en algunos casos incluso horas, ademas, si a esto le adicionamos el uso de Tor, (en el caso de que se trate de un ataque real y se quiera anonimato) el tiempo se multiplica, en especial si no se selecciona un nodo de salida concreto para la red de Tor, permitiendo que cada petición viaje por varios nodos de salida de la red. También es bastante frecuente utilizar la técnica de escaneo conocida como Idle Scan (-sI) que le permite al usuario proteger su identidad enviando todos los paquetes por medio de una máquina que esta siendo manejada como “zombie”, esta técnica también tiene cuestiones de rendimiento que hacen que su desempeño sea bastante lento. En resumen, es una tarea que necesita paciencia por parte del atacante y sobre todo practica y experiencia.

-f: Esta opción intenta fragmentar los paquetes que se envían al objetivo en pequeños trozos, de esta forma es un poco mas difícil para un IDS o los Filtros de un Firewall identificar que se trata de un escaneo de puertos, con esta opción hace que Nmap divida los paquetes en pequeños trozos de 8 bytes o incluso menos, sin embargo, si lo que se desea es que los fragmentos sean de un tamaño concreto, también se puede especificar la opción –mtu. Por otra parte, si se especifica dos veces en esta opción se duplica el tamaño de los fragmentos en 16

–mtu: Indica el tamaño en bytes de fragmentación de los paquetes que se envíen al objetivo, el valor tiene que ser un múltiplo de 8 y no se debe especificar esta opción junto con -f, cumple los mismos fines que la opción -f, no obstante le da mas control al pentester para especificar un tamaño concreto para los paquetes

-D: Ejecuta un escaneo usando distintos “señuelos”, esto quiere decir que las peticiones que se envían a la máquina objetivo se envían desde las direcciones IP indicadas con esta opción (separadas por coma), estas direcciones IP pueden ser reales o no, la intención es que el origen de las peticiones no sea el mismo para todas, utilizando esta opción junto con tiempos de espera un poco mas largos es posible evadir sistemas de detección de intrusos y en algunos casos restricciones de Firewall. Por otro lado es posible generar estas direcciones de forma aleatoria, simplemente utilizando la palabra clave RND:<numero de direcciones>, también puede usarse la palabra reservada ME para incluir la dirección IP real del atacante en la lista de señuelos.

–source-port: Esta opción permite establecer el puerto de origen por donde se enviaran los paquetes, esta opción es útil contra algunos firewall que “confían” en las peticiones enviadas de cualquier máquina por un puerto determinado, (por ejemplo algunas versiones del firewall Windows aceptan peticiones de maquinas cuyo puerto de origen es el 88, puerto común para la comunicación de Kerberos)

–spoof-mac: Esta opción permite al atacante utilizar una MAC distinta a la suya en el proceso de escaneo, inclusive puede sugerir a Nmap que genere una MAC correspondiente a un nombre de proveedor como por ejemplo Cisco

–data-length: Se trata de la longitud en bytes que contendrá los paquetes aleatorios generados por Nmap para enviar al objetivo, en escaneos que intenten evadir restricciones de Firewall, es frecuente usar valores pequeños por cuestiones de rendimiento en el escaneo.

–randomize-hosts: Escaneo de hosts aleatorio para cambiar la firma de escaneo y evitar detección de IDS, esta opción le indica a Nmap que debe “barajar” o “revolver” un grupo de hosts ficticios para que no sea tan evidente el escaneo para el objetivo.

–sent-eth: Enviar los paquetes vía Ethernet

–ip-options: Consiste en el establecimiento de determinadas opciones incluidas en los headers de los paquetes IP, de esta forma pueden engañarse algunas reglas de ciertas configuraciones de Firewall que se basan en algunos de estos campos en los paquetes IP. Si se desea todas ver las opciones incluidas en los paquetes enviados y recibidos, utilizar la opción –packet-trace.

–ttl: Time To Live de cada uno de los paquetes enviados al objetivo, frecuentemente puede ser empleado para especificar el tiempo que se utilizara en cada escaneo

Estas son solo unas de las opciones mas utilizadas para evadir las restricciones de un Firewall, a continuación se enseñan algunos comandos utilizando estas opciones:

1. Utilizando una “Mac” Cisco, Define el valor “4” (paranoid (0), sneaky (1), polite (2), normal (3), aggressive (4), and insane (5)) de la opción T para personalizar los controles de tiempo que llevará el escaneo, estableciendo el puerto de origen 53, Stealthy Scan, longitud máxima de paquete de 30 bytes, escaneo de host aleatorio, no enviar paquetes Ping, escanear los puertos desde 1-65535, generar paquetes en fragmentos de 16 bytes, Realizar detección de versión y finalmente generar un fichero de salida con los resultados formateado con la fecha del escaneo.

nmap –spoof-mac Cisco -T4 –source-port 53 -sS –send-ip -n –data-length 30 –randomize-hosts -PN -p- -f -f -sV –version-all -O -oA target_scan-%D-%T 192.168.1.34

2. Realiza un Stealthy scan, enseña mensajes de error y la razón por la cual un puerto ha sido declarado abierto|cerrado|filtrado, realiza un traceo de todos los paquetes enviados a nivel de detalle “fino”, declara el nivel de depuración 3 (el mas alto es el 9), declara dos señuelos estáticos, cuatro aleatorios y uno que incluye la IP del atacante (esto ultimo en términos prácticos no es aconsejable), finalmente genera un fichero en formato NMAP que puede ser posteriormente “relanzado” en el caso de que sea interrumpido el escaneo.

>nmap -sS –log-errors –reason –packet-trace -d3 -D 22.22.22.22,33.33.33.33,RND:4,ME -oN nmap-log.nmap 192.168.1.34

>nmap –resume nmap-log.nmap

3. Se establece un mtu especifico de 32 bytes por paquete, los paquetes son enviados vía ethernet, se establece un valor de 50 bytes al máximo de cada paquete de datos, esto indica que este valor se dividirá entre 32 bytes que es la unidad de bytes por paquete, cada paquete es fragmentado en 2 paquetes, uno de 32 bytes y otro de 18, se establece un puerto que es por el que se enviaran los paquetes, como ya se ha indicado anteriormente, algunos firewall con malas configuraciones permiten conexiones entrantes en función del puerto origen por donde han sido enviados, Se indica a Nmap que no realice peticiones “ping” a la máquina ya que se asume que se encuentra activa, se establece la opción “\1\8\3\4” que permite determinar si es una maquina Windows o GNU/Linux dependiendo de la respuesta y finalmente se establecen las opciones de IP (Los valores validos pueden ser: R,T,U,L,S y valores Decimales/hexadecimales, para mayor información: http://seclists.org/nmap-dev/2006/q3/52)

>nmap –mtu 32 –send-eth –data-length 50 –source-port 53 -PN –ip-options «\1\8\3\4» 192.168.1.34

Si la máquina objetivo no esta bajo Windows la respuesta será similar a la siguiente:

SENT (0.1980s) ARP who-has 192.168.1.36 tell 192.168.1.34

RCVD (0.1990s) ARP reply 192.168.1.36 is-at 08:00:27:61:34:29

SENT (0.4500s) ICMP 192.168.1.34 > 192.168.1.36 echo request (type=8/code=0) ttl=46 id=39558 iplen=32 ipopts={ NOP ??{\x08\x03\x04}}

Si la maquina objetivo esta bajo Windows la respuesta sera similar a la siguiente:

SENT (0.0570s) ICMP 192.168.1.34 > 192.168.1.34 echo request (type=8/code=0) ttl=57 id=39881 iplen=32 ipopts={ NOP ??{\x08\x03\x04}}

RCVD (0.0570s) ICMP 192.168.1.34 > 192.168.1.34 echo request (type=8/code=0) ttl=57 id=39881 iplen=32 ipopts={ NOP ??{\x08\x03\x04}}

RCVD (0.0570s) ICMP 192.168.1.34 > 192.168.1.34 echo reply (type=0/code=0) ttl=64 id=38533 iplen=28

Como puede apreciarse, la diferencia radica en la respuesta RCVD entre ambas máquinas, mientras que en la máquina Windows el paquete contiene las opciones IP establecidas a ipopts={ NOP ??{\x08\x03\x04}} la máquina bajo GNU/Linux ha comprendido correctamente la opción IP y no ha registrado ningún mensaje de error o warning, lo que nos permite dictaminar la plataforma de un objetivo, aunque este se encuentre detrás de un Firewall.

Idle Scan al rescate!

Si la combinación de las técnicas anteriormente descritas no permite obtener información sobre puertos abiertos en la máquina objetivo, es probable que la conexión no sea posible establecerse entre la máquina del atacante y la máquina objetivo, al menos de forma directa, probablemente el Firewall tenga reglas para que solamente unas cuantas direcciones IP tengan acceso a los servicios de la máquina. En estos casos es necesario utilizar una técnica avanzada conocida como Idle Scan, que consiste básicamente en el uso de un “Zombie” para realizar el escaneo de puertos contra la máquina objetivo, esto es conseguido por medio de una vulnerabilidad a la que están expuestos algunos sistemas operativos (Por supuesto, Windows es uno) que consiste en predecir cual es el IPID (Numero de Identificación de Fragmento de un paquete IP) para posteriormente consultar si un puerto se encuentra abierto o no en la máquina atacada, el flujo de este mecanismo de escaneo es el siguiente:

1- La máquina del atacante ha identificado una máquina vulnerable a ser tratada como Zombie, por lo tanto le envía un paquete SYN/ACK, dado que la maquina Zombie no ha enviado un paquete SYN no entiende el paquete SYN/ACK que envía la máquina del atacante, por este motivo, retorna un paquete RST con el IPID (por ejemplo el 3345)

2- El atacante con esta información enviá un paquete SYN a la maquina objetivo con el IPID (en este caso el 3345) haciéndose pasar por el Zombie, si la máquina remota acepta conexiones de dicha máquina (del Zombie), puede decirse que puede explotarse la relación de confianza que existe entre ambas maquinas, una oportunidad frecuentemente aprovechada por un atacante.

3- La maquina objetivo, enviará un paquete SYN/ACK si el puerto escaneado en el paso anterior se encuentra abierto, o simplemente enviará un paquete RST si esta cerrado, en el caso de que este Filtrado, la máquina objetivo ignorara el paquete y no emitirá ningún tipo de respuesta.

4. Si la máquina Zombie en este punto, recibe un paquete SYN/ACK por parte de la máquina objetivo, responderá con un paquete RST dado que en principio no ha enviado ninguna petición SYN, (esta la ha enviado el atacante en el paso 2), al hacer esto, el IPID aumenta en uno (es decir ahora es 3346) si por el contrario recibe un paquete RST, (indicando que el puerto en la máquina objetivo esta cerrado) la maquina Zombie omitirá este paquete, lo que quiere decir que el IPID se quedará sin modificaciones.

5. El atacante posteriormente, enviá un paquete SYN/ACK a la máquina Zombie, nuevamente, el Zombie no ha enviado ningún paquete de sincronización anteriormente, así que intenta resetear la conexión enviando un paquete RST, con lo que el IPID aumenta nuevamente en uno.

6. El atacante después de recibir el paquete RST del Zombie, puede determinar si un puerto esta abierto o cerrado/filtrado, simplemente comparando el IPID, si este ha aumentado en 2 (el paquete RST enviado desde Zombie hacia el Objetivo y RST desde Zombie hacia atacante) quiere decir que el puerto se encuentra abierto, si por el contrario ha aumentado solamente en 1 (el paquete RST enviado desde Zombie hacia atacante) indica que el puerto se encuentra cerrado o filtrado por firewall desde la máquina Zombie.

Se trata de un mecanismo muy eficaz (aunque lento), que permite explotar relaciones de confianza y huecos en las reglas del firewall, para utilizar esta técnica pueden seguirse los siguientes pasos:

1. Identificar las máquinas en el segmento de red del objetivo a las cuales, se tiene acceso y ademas son susceptibles de ser tratadas como Zombies, o que es lo mismo, el mecanismo de generación de IPID es secuencial, para esto puede utilizarse MetaSploit Framework:

msf > use auxiliary/scanner/ip/ipidseq

msf auxiliary(ipidseq) > show options

Module options (auxiliary/scanner/ip/ipidseq):

Name Current Setting Required Description

—- ————— ——– ———–

INTERFACE no The name of the interface

RHOSTS 192.168.1.0/24 yes The target address range or CIDR identifier

RPORT 80 yes The target port

SNAPLEN 65535 yes The number of bytes to capture

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) > run

[*] Error: 192.168.1.0: #<Class:0x7f28ea2ff3e0> execution expired

[*] 192.168.1.1’s IPID sequence class: All zeros

[*] Error: 192.168.1.4: #<Class:0x7f28eb0fb0e8> execution expired

[*] Error: 192.168.1.5: #<Class:0x7f28ead0e1b0> execution expired

[*] Error: 192.168.1.6: #<Class:0x7f28eabeea28> execution expired

[*] Error: 192.168.1.7: #<Class:0x7f28ea8ffa88> execution expired

[*] Error: 192.168.1.8: #<Class:0x7f28ea7a1100> execution expired

[*] Error: 192.168.1.9: #<Class:0x7f28ea66ee68> execution expired

[*] Scanned 026 of 256 hosts (010% complete)

[*] 192.168.1.36’s IPID sequence class: Incremental!

[*] 192.168.1.37’s IPID sequence class: All zeros

[*] 192.168.1.38’s IPID sequence class: All zeros

……………………….

Por otro lado también es posible utilizar el Script de NMAP correspondiente a NBE “ippid” que permite realizar un escaneo en busca de máquinas que sean susceptibles de ser tratadas como Zombies, esta herramienta puede ser descargada desde: http://nmap.org/nsedoc/scripts/ipidseq.html una vez descargado el fichero ipidseq.nse se debe ubicar en el directorio “scripts” donde se encuentre instalado nmap, si se ha utilizado apt-get o un paquete deb/rpm para instalarlo, lo mas probable es que se encuentre en las librerías compartidas de usuario, usualmente en /usr/share/nmap. Para utilizarlo se puede ejecutar el comando:

>nmap -vv –script ipidseq 192.168.1.1/24

2. En el ejemplo anterior se ha encontrado una máquina susceptible de ser tratada como Zombie, por lo tanto puede utilizarse para tratar de identificar los puertos abiertos en la máquina objetivo (que en este caso es la 192.168.1.35) simplemente ejecutando:

>nmap -Pn -sI 192.168.1.36 192.168.1.35

Starting Nmap 5.21 ( http://nmap.org ) at 2011-06-01 21:37 CEST

Idle scan using zombie 192.168.1.36 (192.168.1.36:80); Class: Incremental

Nmap scan report for 192.168.1.35

Host is up (0.051s latency).

Not shown: 987 closed|filtered ports

PORT STATE SERVICE

21/tcp open ftp

80/tcp open http

135/tcp open msrpc

139/tcp open netbios-ssn

443/tcp open https

445/tcp open microsoft-ds

3306/tcp open mysql

5357/tcp open unknown

49152/tcp open unknown

49153/tcp open unknown

49154/tcp open unknown

49155/tcp open unknown

49156/tcp open unknown

MAC Address: 08:00:27:E3:E3:3D (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 13.19 seconds

Con esto se ha conseguido filtrar información sobre la máquina que se encuentra protegida por el firewall.