31 ene 2012

De fiesta con UniGUI Framework

Esta que vengo a contar, es una de esas historias que me llenan de ganas de publicar, junto al pequeño hilo que se escapa de felicidad, después de lograr algo que nos parece interesante, no cuanto menos de mostrar. Para deleite de programadores en Delphi tirando a ser muy curiosos, va más bien encaminada la entrada. Esta vez tocaremos un poco de todo, seguridad web, desde Cross Site Scripting hasta Full Path Disclosure, pasando por edición de binarios en hexadecimal, acortadores URL y un par de softwares de regalo en mi querido Visual Basic 6 y ensamblador.Hasta hace bien poco, un nuevo concepto de desarrollo web se cruzó por mi camino, gracias a un compañero de trabajo, era el llamado UniGUI Framework. Destinado en exclusiva, para dar opción a desarrolladores que trabajan con Delphi, de poder diseñar proyectos destinados a aplicaciones web. El Framework entre otras funciones de publicación, trae la de exportar el proyecto a librerías DLL para su integración en ISS o Apache mediante Mod ISAPI.¿Y como no? ¡Tenía que reventarlo!Así que cargando mis jeringuillas de sustancias psicotrópicas, me topé con un Cross Site Scripting, en el control de errores que trae de forma interna la aplicación y aunque no vean el típico mensaje de alert, observen bien la imagen, pues podemos llamarle Blind-XSS.
Cualquier URL agregada de forma externa por un atacante, o interna por el propio programador en el código de la librería, se adjunta a la ruta actual y prescinde del protocolo, en el cual se realizan las peticiones. ¿Por qué ocurre esto? ¡Muy simple! La librería se encarga de filtrar los slashes modificándolos por barras invertidas. Esto quiere decir que el Cross Site Scripting existe y es explotable, pero su margen de acción, se ve reducido para ataques externos, a no ser que logremos bypassearlo.Detrás de “Access denied”, encontramos ese Full Path Disclosure tan llamativo, que muestra la letra de la unidad y el tipo de servidor que utilizo ¡Genial más datos para realizar un ataque!
Después de hacer pruebas con diferentes navegadores y ver su eficiencia ;) , lo que más asombro me causó, es lo que os muestro en la siguiente captura.
 
¡Google Chrome se lleva la palma! Así que él solito, fuerza la petición y muestra el enlace corregido. Por si alguno no se había dado cuenta, el servidor de Bit.ly trabaja con un certificado firmado por una autoridad certificadora, con lo que podremos explotar la vulnerabilidad mediante protocolo seguro, pudiendo así, visitar cualquier página sin restricciones. Podremos incluir un IFRAME sin ningún tipo de problema, gracias al Bypass de Google Chrome y el certificado de Bit.ly, para no sé... ¿visitar enelpc?
 
O echarle imaginación, y tirar de onMouseOver para jugar en Firefox a ser hackers malos.
 
Pero nosotros somos buenos ¿verdad? Y queremos corregir vulnerabilidades a toda costa, así que como ya reporté con anterioridad el fallo al foro de UniGUI y no me hicieron ni p*** caso, decidí armarme de valor y buscar entre las strings en hexadecimal del binario, para ver de que forma podría contrarrestar el dichoso ataque.
El HTML que muestra la ruta y la unidad de disco, se muestra mediante una llamada a una variable de tipo string, la cual en caso de contener un valor añadido no alfabético, por ejemplo un número o símbolo en la URL, busca la nueva ruta y si no la encuentra, terminamos con el aviso de acceso denegado en pantalla.
 
 
 
 
 
 
La enfermedad debía de venir acompañada de la cura, y ya que encontré la variable, no me quedó otra que suprimirla de forma definitiva del control de errores, así que un par de Offsets en 00, corregían ambas vulnerabilidades y me daban pie a sacar un nuevo proyecto en VB6. El parche muestra en hexadecimal, la opción de seleccionar los caracteres y la localización en el binario a modificar, más de un avispado le habrá sacado similitud a un AVFucker, ya que si lo desean también puede hacerse con tal función.
 
 
 
Ya que dependiendo de la versión de UniGUI y del proyecto, la ubicación del valor vulnerable puede cambiar, me armé una opción más simple programada en ensamblador y compilada con MASM. Gracias a un código similar de diablo2oo2, que modifica ambos Offsets y corrige la vulnerabilidad para todas sus versiones, buscando una cadena exclusiva de este tipo de binarios, logré modificarlo.
 
 
 
El resultado a la inyección, sería el siguiente:
 
 
 
 
Ahora sí, reportaré al equipo de desarrollo, algo que posiblemente les haga ver lo que planteé anteriomente de forma más clara... ¿Qué loco iba a corregir un XSS con un editor hexadecimal?
 
Saludos 4n4les! ;)
 

2 comentarios: