Idlescan: Escaneo invisible de puertos Ataque Ramiro Encinas Grado de dificultad Idlescan es una técnica con la que podemos escanear los puertos de un host sin que éste pueda saber quien es el host que recibe los resultados de dicho escaneo. La clave de este tipo de escaneo reside en la observación e interpretación de los números de identificación de datagramas IP (IPID) de un tercer host zombie que hace el trabajo sucio. E l objetivo de este artículo es educacional. La técnica desarrollada(Idlescan o Escaneo de puertos mediante IPID) fué creada por Antirez (Salvatore Sanfilippo) en 1998 y todavía hoy es posible utilizarla debido a que, actualmente muchas máquinas reúnen las condiciones adecuadas para implementar esta técnica. Para entenderla correctamente se deben poseer conocimientos sobre los protocolos TCP/IP, y el programa de generación de paquetes hping (también creado por Antirez). La función del IPID Cuando un datagrama IP se fragmenta en varios datagramas más pequeños para respetar el MTU (tamaño máximo de datagrama) en algunas redes (bit No fragmentar desactivado de la cabecera IP), éstos datagramas independientes que integran el datagrama original completo tienen la siguiente información común en su cabecera: la dirección IP de origen, la dirección IP de destino, información del protocolo, el campo de identificación de datagrama o IPID (Figura 1) y el bit No fragmentar desactivado. Todos los datagramas con esta información común que lleguen al protocolo IP del host receptor se unirán, dando como resultado el datagrama 2 original. El número del campo IPID de estos datagramas es el mismo, esto es: un IPID para cada datagrama IP original completo. El IPID es fundamental para el desensamblado y ensamblado de datagramas IP. Es importante saber que, si el datagrama no se fragmenta, también tiene su correspondiente IPID. ¿De qué forma el protocolo IP de un host emisor genera un IPID y cómo lo asigna a la cabecera de un datagrama IP para enviarlo?. El IPID (según el RFC-791) es un número de 16 bits, pero no especifica qué pautas se deben tener en cuenta para asignar los distintos IPID’s para sus correspondientes datagramas IP, por lo que esto dependerá del criterio del fabricante que implemente el protocolo IP. En este articulo aprenderás • • La función del IPID El funcionamento de Idlescan Lo que deberias saber • • www.hakin9.org Nociones sobre TCP/IP Nociones sobre shell/linea de comandos Escaneo invisible de puertos • Figura 1. Campo IPID de la cabecera de un datagrama IP( fuente: RFC791-ES ) Observando al IPID Lo anterior nos da paso a analizar la secuencia IPID de distintos hosts. Para esto es necesario utilizar el programa de generación de paquetes TCP/IP hping contra un host y ver las respuestas. Las figuras 2, 3 y 4 muestran los IPID’s obtenidos de paquetes TCP/IP de distintos sistemas operativos mediante el comando hping nombre _ host: Debemos tener en cuenta que estos resultados se han obtenido de hosts ociosos (sólo comunicaban con nosotros en ese momento) y estaban en la misma red, por tanto el MTU no obliga a que los datagramas IP se fragmenten. Como podemos observar en la Figura 2 (Windows XP SP2), este host ha respondido con 9 paquetes donde el IPID de cada uno se incrementa de una forma particular: cada dos paquetes con IPID consecutivo e incrementado positivamente da un salto hacia adelante de 21 en el IPID, donde vuelve a emitir dos paquetes con IPID’s consecutivos e incrementados positivamente. La Lexmark Optra (Figura 3) responde con 7 paquetes donde el IPID es una secuencia de uno más uno. Por último, el Linux con kernel 2.4 (figura 4) siempre devuelve 0 en sus IPID’s (cuando el bit No fragmentar está activado en sus datagramas IP). Como podemos observar, cada fabricante de sistema operativo trata al protocolo IP y, en concreto, la generación de IPID’s de una forma arbitraria ¿porqué será? el host que quiere comunicar con el segundo le envía a éste un primer paquete TCP/IP con la particularidad de contener en la cabecera TCP el campo SYN activado (petición de conexión), el puerto destino al cual queremos conectar y el puerto de origen (Figura 5). Este datagrama TCP está incluido en su correspondiente datagrama IP. La cabecera del correspondiente datagrama IP contiene el campo de la dirección IP del host destino (con quien queremos conectar), y también contiene el campo de la dirección IP de origen (normalmente la IP del host origen). La cabecera IP también contiene el campo IPID con su número correspondiente. Si el host destino recibe este paquete TCP/IP con el campo SYN activado, pueden ocurrir una de estas dos cosas: • Que el puerto especificado esté abierto en el host destino y éste opte por aceptar la conexión. En este caso, el host destino prepara un primer paquete de respuesta TCP/IP cuya cabecera TCP tiene activados los campos de reconocimiento (SYN|ACK) como respuesta afirmativa al SYN recibido del paquete anterior. Este paquete TCP/IP elaborado será enviado al host cuya IP figuraba en el campo IP de origen en la cabecera del datagrama IP recibido anteriormente (junto con el SYN del TCP). Este paquete TCP/IP tendrá como puerto destino el puerto de origen especificado en la cabecera TCP del paquete anterior. Que el puerto especificado esté cerrado en el host destino y por tanto no opte por aceptar la petición de conexión. En este caso, el host destino prepara un paquete de respuesta cuya cabecera TCP tiene activados los campos de rechazo de petición de conexión (RST|ACK) como respuesta negativa al SYN recibido del paquete anterior. Igual que antes, este datagrama se dirige al host cuya IP figuraba como origen en la cabecera IP recibida en la petición de conexión y al puer- Figura 2. IPID’s de Windows XP SP2 Un poco de TCP/IP Según el RFC-793, para establecer una conexión TCP/IP entre dos hosts, Figura 3. IPID’s de una impresora Lexmark Optra www.hakin9.org 3 Ataque ������� ����� �������� ��� ������ ������� ��������������� �������� ���� ������� ���� ����� ������ ���������� ���� Figura 4. IPID’s de Linux con kernel 2.4 to correspondiente de origen. La cabecera IP de este paquete tendra su correspondiente IPID. Por último, es conveniente saber que, si un host recibe un paquete TCP/IP con un RST|ACK , éste host no continúa con esa comunicación. Mezclando ingredientes Con todo lo anterior, podemos iniciar el escaneo de puertos al host destino deseado sin que nos vea. Primero, con hping seguiremos observando los IPID’s de nuestro host zombie. La mejor elección del host zombie entre los casos que hemos visto antes es la de la impresora Lexmark Optra, ¿Por qué?, porque sus IPID’s (Figura 3) van de uno en uno (en la observación de resultados veremos lo importante que es eso). Después abriremos otra sesión shell y utilizaremos de nuevo hping para enviar un paquete TCP/IP (especial) con petición de conexión (SYN) al puerto que queremos saber si está abierto o cerrado del host destino que queremos escanear. Evidentemente, y en condiciones normales, cuando un programa de un host de origen quiere ponerse en comunicación con un puerto de un host remoto, el programa indica la IP Figura 7. Flujo de un Idlescan detectando un puerto abierto de su propio host en la cabecera del datagrama IP para que el host remoto envíe la respuesta a esa IP: respuesta afirmativa (SYN|ACK) o respuesta negativa (SYN|RST). Esto no nos conviene porque el host remoto descubriría nuestra IP (y nuestro propósito no es ese). Con hping podemos enviar ese paquete TCP/IP (SYN) a un puerto de un host remoto especificando en la cabecera del datagrama IP una IP de origen que NO es la nuestra, será la IP del host zombie, esto es, la IP de la Lexmark Optra. Esto se consigue utilizando hping con los siguientes parámetros: hping ip_host_destino –a ip_host_ zombie –S –p núm_puerto_a_escanear Figura 5. ACK, SYN y RST en cabecera de datagrama TCP ( fuente: RFC793-ES ) Este comando enviará paquetes TCP/IP (SYN) (parámetro –S) al puerto a escanear especificado (-p núm _ puerto _ a _ escanear) del host con la IP destino (ip _ host _ destino), y especifica la IP del host zombie (-a ip _ host _ zombie) como IP de origen en la cabecera IP de los paquetes TCP/IP que enviará este comando. Ejecutado este comando con sus parámetros, no vamos a obtener respuesta, es un envío ciego sin vuelta, sólo estamos enviando paquetes TCP/IP (SYN) al host destino que estamos escaneando. Con esto podemos pensar que al no obtener respuesta no podremos saber nada, porque la respuesta, sea afirmativa o negativa, llegará a la impresora y no a nosotros. Observando resultados Figura 6. Incremento del IPID de un host zombie que dialoga con nosotros y con otro host 4 www.hakin9.org Al observar los resultados obtenemos lo siguiente: tenemos una ventana con un hping a la impresora Escaneo invisible de puertos ����� �������� ������� ��� ������ �������� ���� ������� ���� ����� ������ ���������� ���� Figura 8. Flujo de un Idlescan detectando un puerto cerrado zombie que nos está devolviendo paquetes con un IPID consecutivo (uno más uno). También tenemos otra ventana con otro hping al puerto del host destino que estamos escaneando. Éste host devuelve la respuesta a la impresora. En este punto, pueden ocurrir dos cosas: • • Que el puerto del host que estamos escaneando esté cerrado, por tanto envía un SYN|RST a la impresora y ésta no hace nada. Que el puerto del host que estamos escaneando esté abierto, por tanto envía un SYN|ACK a la impresora. La impresora recibe una respuesta afirmativa a una solicitud SYN que no ha enviado. La impresora asumirá que esa petición de sesión es falsa o que el paquete es erróneo, por tanto, contestará al host destino con un SYN|RST, y por tanto, y lo más importante, debido a este envío, incrementa su IPID en uno. Referencias • • • • • • • http://www.kyuzz.org/antirez/ papers/ipid.html ht tp: / /w w w.kyuzz.org /antirez/ papers/dumbscan.html http://insecure.org/nmap/idlescanes.html http://www.radarhack.com /dir/ papers/hping2_v1.5.pdf http://www.icir.org/vern/papers/ norm - usenix- sec - 01- html / node8.html http://www.rfc-es.org/rfc/rfc0791es.txt http://www.rfc-es.org/rfc/rfc0793es.txt Este incremento podemos verlo reflejado en la ventana donde hping está consultando contínuamente a la impresora. La impresora devuelve un IPID al host escaneado y el siguiente IPID a nosotros. La figura 6 ilustra el resultado. Como vemos en la figura 6, la impresora nos envía en el primer paquete de respuesta el IPID 21898 y después, el IPID 21899 (que no vemos) lo ha enviado al host que estamos escaneando. A continuación recibimos el siguiente paquete con el IPID 21900, y así sucesivamente. El puerto escaneado está abierto porque la impresora está enviando paquetes TCP/IP (SYN|RST) a ese puerto con los IPID’s que no vemos. También podemos deducir que en las condiciones expuestas, si el incremento es de uno en uno, es porque la impresora recibe paquetes TCP/IP del host escaneado con el rechazo de conexión ( SYN|RST). Estos paquetes los ignora, y sigue dialogando sólo con nosotros. El puerto escaneado está cerrado. En ambos casos, el host escaneado sólo sabe la IP del host “zombie”, no sabe la IP del host que recibe la información de si sus puertos están abiertos o cerrados. • alguna IP de algún host de la red interna. En el sistema operativo Linux con kernel 2.4 y Solaris cada conexión tiene su propia secuencia IPID y es distinta de la secuencia IPID de otra conexión. Por lo tanto es imposible realizar un Idlescan utilizando como zombie a este tipo de host. También, y como hemos visto con Linux con kernel 2.4, en el caso de que el bit No fragmentar esté activado, el IPID generado siempre es 0. Conclusión Con un escaneo Idlescan suplantamos a un host, en su nombre enviamos una petición de conexión a un puerto del host deseando saber si está abierto o cerrado, el host suplantado recibe la respuesta y nuestro host la interpreta a partir de él. Todo esto gracias a la predicción del IPID. Flujos La Figura 7 muestra el flujo del Idlescan cuando el puerto del host destino o escaneado está abierto, y la Figura 8 representa el flujo cuando el puerto escaneado está cerrado. Protegiéndonos del Idlescan Es complicado defenderse del Idlescan porque siempre habrá hosts zombies óptimos para utilizarlos (IPID’s predecibles con hosts ociosos), pero sí hay que tener en cuenta algunas consideraciones para protegernos de él: • • Generación de secuencias IPID aleatorias, pero es complicado no seguir un patrón detectable y predecible. Los firewalls perimetrales no deberían aceptar conexiones IP de entrada de hosts que contengan IP’s de origen que coincidan con www.hakin9.org 5