jueves, 21 de agosto de 2008

Firewalking 1998-2008

El Firewalking es una interesante técnica creada en 1998 por Goldsmith y Schiffman, con el objetivo de mapear la política de filtrado de un firewall. Diez años después, ¿ todavía funciona esta técnica ?


¿ cómo trabaja el firewalking ?

Básicamente, vamos a realizar un escaneo de puertos con una TTL fija que debe expirar en el último gateway antes de llegar a nuestro objetivo.

Si el paquete expira, recibiremos un mensaje de error ICMP time exceed in-transit, lo que nos estará indicando que el paquete supero la barrera de filtrado pero no llego al objetivo ya que la TTL llego a 0. Si no recibimos ninguna respuesta significa que el paquete fue descartado por el firewall ya que no cumplía con la política de filtrado.

¿ cuál es la diferencia con un escaneo de puertos ?

En un escaneo de puertos solo podemos estar seguros de las respuestas que recibimos, por ejemplo si recibimos un SYN/ACK el puerto esta abierto, o si recibimos un RST el puerto esta cerrado, pero si no recibimos nada, ¿ significa que efectivamente el puerto esta filtrado ? no, también pueden estar pasando muchas otras cosas.

Pero el firewalking se vuelve sumamente efectivo cuando escaneamos puertos UDP o hacemos un escaneo de protocolos, en donde generalmente no vamos a recibir respuestas.

¿ todavía funciona esta técnica ?

Para la época en la que fue concebida esta técnica, los firewalls eran muy básicos por lo que el firewalking era bastante efectivo. La mayoría de los firewalls modernos ya no decrementan la TTL de los paquetes, por lo que el firewalking solo es efectivo si entre nuestro objetivo y el firewall hay un router.

Igualmente, todavía podemos encontrar muchas redes con packet filters o que tienen varias DMZ's con router's en el medio, por lo que la diversión todavía no termino ;-)

A modo de Nota Mental, para hacer un Firewalking con Scapy, primero hay que utilizar traceroute() para obtener la TTL del último gateway, y luego las siguientes funciones para hacer el firewalking y graficar los resultados:



res,unans = sr(IP(dst=TARGET, ttl=GWTTL)/TCP(dport=[PUERTOS]), timeout=2, retry=-2)

res.make_table(lambda (s,r):(s.dst, s.dport, r.sprintf("{TCP:%TCP.flags%}{ICMP:%IP.src%#%r,ICMP.type%}")))

No hay comentarios.:

LinkWithin