DNS exploit reloaded: y seguimos con «POKES»…
Bueno, pues hemos actualizado algunas cosillas en el exploit :
– Se utiliza un offset universal para 2k3, tanto en local como en remoto, este offset pertenece a unicode.nls y no lo habíamos puesto antes porque no nos dimos cuenta de que se podían usar direcciones con bytes nulos aprovechando las features de extractQuotedChar(), notese que no nos saltamos DEP, solamente /GS, lo cual no es muy util, pero bueno, viene bien como ejercicio de programación 🙂
– Se resuelve dinámicamente el puerto dns rpc, aunque se puede especificar el que se desee.
– Se ha cambiado la shellcode, solo funcionaba en 2k3 si no recuerdo mal.. y parece que la que está puesta ahora, también cortesía de metasploit, funciona bien con los dos sistemas operativos.
– Se han añadido offsets para más sistemas operativos, y la posibilidad de búsqueda de offset universal en local para 2k.
– Algun bug … seguro 🙂
Por otro lado nos hemos estado comiendo un poco el tarro para ver si se podía saltar DEP, aunque fuera en local, pero no lo hemos conseguido, los tiros han ido por:
– Revision de la rutina afectada: Se puede explotar alguna variable afectada por el overflow?, por lo que yo he visto.. no, la idea ver si se podía controlar algún puntero loco por ahí e intentar sobreescribir la variable que contiene el directorio de Windows en KERNEL32.DLL (todo esto es idea de David Litchfield.. ) , de tal manera que pisando la security_cookie, al ser llamado el UnHandledExceptionFilter pudieramos inyectar remotamente nuestra faultrep.dll, ¿si no me equivoco LoadLibrary es capaz de cargar DLL´s en rutas UNC no?, ¿alguien ha visto algún exploit que haga uso de esto?? 🙂
– Inyeccion local mediante WLSI, tecnica documentada por Cesar Cerrudo, por lo que hemos visto no puede ser usada para saltarse DEP ya que los permisos de la seccion inyectada no tienen el flag de ejecución :-(.
– Saltar DEP apilando llamadas a funciones en el stack, esto se puede hacer, pero el problema principal que hay es que esto es facil de hacer cuando no está activado /GS, porque provocando una excepcion al ser llamado el handler, tendríamos que apuntar a una secuencia válida tal que la siguiente:
pop reg; por reg, mov esp, [esp]; ret
Y no sé si existirá…
Bueno el tema está interesante, si alguien quiere discutir sobre estas cosillas,
que me mande un mail 🙂 !
El exploit lo teneís aquí, un saludo!
P.D: Un saludo para Andrés, que se lo ha currado!!