martes, 27 de marzo de 2012

Mejorando FakeDNS (y II)

En la anterior entrada nos quedábamos con que habíamos modificado el módulo "fakedns" de Metasploit para invertir su funcionalidad, y nos habíamos encontrado con un mensaje de error en determinadas circunstancias:

msf  auxiliary(fakedns_single) >
[-] fakedns: Resolv::ResolvError DNS result has no information for foo.pentester.es
[...]

El problema que identificamos es que el módulo tiene un error cuando intentas resolver contra él un nombre que no existe (foo.pentester.es). Esto es debido a que hemos alterado con un parche guarrindongo el funcionamiento original del módulo, así que ahora nos vemos en situaciones que el desarrollador no pensó. En este caso, la resolución real únicamente se iba a realizar para aquellos nombres que nosotros definiéramos en el "domain bypass", que evidentemente iban a ser dominios existentes, así que no se implementaron medidas que comprobaran si la resolución existe o no.

Como hemos modificado el módulo y ahora no tenemos control sobre los nombres que va a resolver y cuales no, debemos añadir un control de excepciones en la zona del código en la que se realiza la resolución:

begin
        ip = Resolv::DNS.new().getaddress(name).to_s
        answer = Resolv::DNS::Resource::IN::A.new( ip )
rescue ::Exception => e
        next
end

Con este control añadido, vamos a volver a intentar resolver algunos nombres a ver si hemos conseguido que el módulo siga funcionando a pesar de no poder resolver un nombre:

$ dig @127.0.0.1 www.pentester.es
www.pentester.es. 60 IN A 192.168.1.100
dig @127.0.0.1 foo.pentester.es
;foo.pentester.es. IN A
$ dig @127.0.0.1 www.yahoo.com
www.yahoo.com. 60 IN A 98.139.183.24

Perfecto! Ahora está resolviendo correctamente y además no casca, así que ya podemos utilizarlo para analizar las conexiones que queremos.

Esta solución es un poco chapuza, pero es funcional, y nos puede servir para interceptar solo las conexiones que queramos, con algunas limitaciones.

¿Quereis ver la solución buena? Lo veremos en el próximo post.

1 comentario:

Adrián dijo...

La verdad es que tu forma de pensarlo es la que me parece más intuitiva. No entiendo por qué no está implementada, o bien como default, o bien como opcional.