Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Hace casi cuatro años, Antirez (investigador de seguridad) posteó; una nueva
innovadora técnica de escaneo de puertos de TCP. Un "Idlescan", como llegó a
conocerse, permite un escaneo de puertos completamente invisible. �Los atacantes
pueden realmente escanear una máquina sin necesidad de enviar ni un sólo paquete al
host destino desde su propia dirección! En lugar de ello, un ataque paralelo permite
que el escaneo sea una especie de rebote en una máquina inactiva ("zombie") . Los
reportes de sistemas de detección de intrusión (IDS) indicarán a la máquina "zombie"
como la atacante. Además de ser extraordinariamente invisible, este tipo de escaneo
permite mapear la relaciones de confianza basadas en IP entre máquinas.
Asumí que un problema de esta magnitud generaría una respuesta inmediata y
parches de parte de los desarrolladores de sistemas operativos. Desafortunadamente,
muchos escogieron ignorar el problema por años. Aparentemente, creen que éste es
un problema "teórico que no es práctico para ser explotado en el mundo real. Para
refutar esa postura, e incrementar la presión sobre los desarrolladores y obligar a que
solucionen el problema, he publicado una implementación robusta de un idlescan en
versiones recientes de Nmap. Este paper describe la técnica en detalle y ofrece
defensas que los administradores de redes, ISPs, y desarrolladores de sistemas
operativos pueden utilizar para mitigar esta vulnerabilidad.
Tengan en cuenta que un "idle scanning" es sólo uno de los riesgos de seguridad
causados por números de secuencia de IPID predecibles. Este paper describe varios
otros ataques de recolección de información posibles gracias a esta característica.
Técnica
Aunque un `idle scanning' es bastante sofisticado en materia de métodos de escaneo
de puertos, uno no tiene que ser un experto en TCP/IP para comprenderlo. Sólo se
necesita comprender algunas cuestiones básicas:
•La mayoría de los servidores esuchan en puertos de TCP, de la manera en la
que los servidores de web escuchan en el puerto 80 y los servidores de correo
en el puerto 25. Un puerto es considerado "abierto" si alguna aplicación está
escuchando en ese puerto, si no, está cerrado.
•Una manera de determinar si un puerto esta abierto es envia un paqueter con
"SYN" (establecimiento de sesión) al puerto. La máquina destino enviará de
vuelta un paquete con "SYN|ACK" (reconocimiento de pedido de sesión) si el
puerto está abierto, y un paquete con "RST" si el puerto está cerrado.
•Una máquina que recibe un paquete con "SYN|ACK" no solicitado
previamente responderá con una "RST". Pero un "RST" no solicitado
previamente es ignorado.
•Cada paquete de IP en Internet tiene un número de "identificación de
fragmento". Varios sistemas operativos simplemente incrementan este número
por cada paquete que envían. Por lo tanto la observación de este número puede
decirle al atacante cuántos paquente han sido enviados desde la última
observación.
Al combinar estas características, es posible escanear una red falsificando nuestra
identidad para que parezca que una máquina "zombie" inocente realizó el escaneo. Es
más fácil describir esta técnica por medio de un diagrama. En la imagen, debajo, un
atacante, A, está escaneando una máquina destino, y a la vez culpando del escaneo a
algún zombie, Z. Los cuadrados representan máquinas y las líneas representan
paquetes. Breves descripciones en castellano de los paquetes están impresas por
encima de las líneas, mientras que las "flags" reales de TCP e información distintiva
de los paquetes están impresas debajo de ellas:
Como muestra el diagrama, el host destino responde de manera diferente al Zombie
dependiendo del estado del puerto. Si el puerto probado está abierto, el destino envía
un SYN|ACK al Zombie. El Zombie no esperaba este SYN|ACK, por lo tanto, envía
de vuelta un RST. Al enviar este RST, el Zombie hace que se incremente su número
de secuencia de IPID. El verdadero atacante detecta esto en el paso 3. Si el puerto
está cerrado, el destino envía un RST al Zombie. Los Zombies ignoran este paquete
RST no solicitado y no incrementan su número de secuencia de IPID.
Defensas
Afortunadamente, hay varias defensas que pueden ser implementadas para prevenir la
mayoría de los ataques relacionados a IPID:
Administradores de Redes:
•Los firewalls y "border routers" deberían estar configurados para denegar
paquetes entrantes con direcciones de origen extrañas. (por ej. que parezcan
venir desde máquinas internas a nuestra red, direcciones reservadas como
10.X.X.X o 192.168.X.X, direcciones localhost 127.X.X.X, etc. Cualquier
buena guía de firewalls debería proveer de una orientación más detallada
acerca de estas reglas esenciales).
•Las reglas de los firewalls que mantienen registro del estado de las conexiones
("Stateful firewalls") pueden ayudar también a este tipo de ataques -- hay que
asegurarse de que el firewall ofrezca esta característica y de que esté habilitada
--.
•Tratar de utilizar sistemas operativos con secuencias de IPID menos
predecibles, como versiones recientes de OpenBSD, SOlaris o Linux. Mientras
que esos sistemas operativos son inmunes a convertirse en zombies con la
versión actual de Nmap, quizás no frenen todos los ataques relacionados a
IPID. Se necesita más investigación.
•Implementar filtrado de salida para prevenir que paquetes forjados con
direcciones falsas abandonen nuestra red. Esto previene que nuestros
empleados/estudiantes lancen alguno de estos ataques.
Proveedores de Servicio de Internet (ISPs):
La protección más importante que los ISPs pueden ofrece es utilizar filtrado de salida
para prevenir que paquetes forjados con direcciones falsas abandonen nuestra red.
Esto previene que los usuarios ejecuten muchos ataques horribles e inclusive, detiene
un Idlescan. Además de ayudar al desempeño de Internet, el filtrado de salida puede
ahorrartnos costos sustanciales al tener que investigar ataques de "IP spoofing"
(engaño de IP).
Desarrolladores de sistemas operativos:
Un buen enfoque es utilizar secuencias de IPID específicas a cada conexión o a cada
"peer" (peer: el otro host involucrado en el intercambio de paquetes). Solaris hace
esto y limita severamente la información que los atacantes puedan obtener acerca de
otras conexiones. Linux 2.4 también utiliza Valores de IPID específicos por cada peer
(ver net/ipv4/inetpeer.c). Adicionalmente, Linux 2.4 resetea a cero el campo IPID en
paquetes en los que el bit DF ("No fragmentar") está activado. Después de todo, la
defragmentación de IP es el único uso crítico del campo ID. Otro enfoque (utilizado
por OpenBSD) es generar la secuencia IPID aleatoriamente. Esto es difícil de lograr
correctamente -- hay que asegurarse de que la secuencia no se repite y de que cada
número no sea utilizado dos veces en un período corto de tiempo --.
Desafíos de Idlescan
Iba a discutir competiciones de implementación para escribir escáners rápidos y
precisos. Pero muy pocos de ustedes están haciéndolo, y aquellos que lo hacen,
pueden leer la fuente de Nmap y otros escáners. Por lo tanto, sólo remarcaré un
cuantos puntos importantes. Esta sección también incluye algunos desafíos
encontrados por usuarios de las herramientas.
•Desempeño -- Escanear un puerto a la vez (como muestra el diagrama antes
visto) puede ser horrendamente lento en el caso de miles de puertos. Nmap
maneja esto mandando hasta 100 pruebas. Si Nmap encuentra que la IPID sí se
incrementó, limitará la búsqueda de puertos abiertos usando un enfoque de
búsqueda binaria.
•Hosts no inertes -- Un Idlescan funciona contando el número de paquetes
enviados por un zombie y asumiendo que esos paquetes son respuestas a
paquetes originados por el destino. Entonces, paquetes extraños enviados por
un zombie no inerte pueden causar una confusión importante. Nmap trata de
contrarrestar este problema, con retransmisión de las pruebas y otras técnicas
para detectar resultados falsos. Por ejemplo, Nmap sabe que algo está mal si
prueba 6 puertos y la IPID se incrementa en 10 o 20. Nmap ajusta sus tiempos
y paralelismo para compensar hosts que estén ligeramente activos o que
descarten (drop) paquetes cuando detecta esto. Sin embargo, Nmap no será
confiable con los zombies muy cargados de actividad. Una técnica para
manejar zombies muy activos es enviar un gran número (docenas o cientos) de
pruebas a cada puerto. Esta técnica de "fuerza bruta" puede ocultar una
pequeña cantidad de tráfico de "ruido blanco". Desafortunadamente, el costo es
un ancho de banda significativo, escaneos lentos, y la posibilidad de rebalsar
con SYNs ("SYN flood") al destino. Thomas Olofsson demostró una
herramienta para lograr esto en su presentación en la "2001 Black Hat
Briefings". Su presentación (Powerpoint) está disponible aquí.
•Filtrado de salida -- Si no podemos forjar paquetes con direcciones de origen
falsas debido al filtrado de salida por parte de tu ISP, intenta con otro ISP o
(para usuaros avanzados) se puede probar haciendo un "IP tunneling". También
se puede tratar de hacer "rebotar" el ataque desde otra máquina dentro de tu
misma red (ya que es poco probable que sea filtrada).
•Zombies inmunes -- Algunos hosts no funcionarán como zombies debido a
un sistema operativo astuto o tráfico sustancial. En muchos casos, simplemente
se puede utilizar un zombie diferente.