La POC de hoy, consiste en un RCE (Remote code execution) y un SQLi atípico que a día de hoy, sigue activo, es un #ZeroDay. Para llevarla a cabo se requiere de estar en la misma red (MITM como veiamos en evil Go.ogle) y se realiza sobre un ERP bastante famoso (según su web mas de 35.000 usuarios utilizan sus sistemas en países como España, Ecuador, México y Chile). En este caso yo tengo acceso a él debido a que uno de mis proveedores de informática (de los mas grandes a nivel Español) le utiliza.
#Disclaimer
Lo primero es aclarar que la entrada, representa únicamente los ideales y la visión personal del autor, no necesariamente los del blog. ¿Por qué digo esto?, aquí viene la parte que muchos no estarán de acuerdo con ella, ¿se le ha comunicado a la empresa? A lo que tengo que responder: NO.
No se le he comunicado a la empresa en cuestión, por una sencilla razón, que quizás sea políticamente incorrecta. Se trata de un programa comercial, no OpenSource (no confundir OpenSource con gratis), por lo que lo gestiona una empresa privada, que lógicamente invierte recursos en obtener beneficios económicos de ellos (como todas las empresas no son monjas de la caridad) Entonces lo que nos tenemos que plantear son las siguientes preguntas, ¿por que ayudar a una empresa que no invierte en seguridad? que no invierte en BugBounty y que no invierte en auditorias. ¿Que futuro laboral pretendemos obtener si les damos el trabajo hecho?, ¡y gratis! Para mi, reportar un fallo de seguridad a una empresa privada, solo puede traer repercusiones negativas y no tienen ningún beneficio (ya no digo económico). La ley se ha encargado de empeorar esta situación, hasta tendría que ocultar mi identidad para comunicárselo de forma segura, ya que dicha empresa podría denunciarme por el simple hecho de querer mejorar de forma altruista su sistema de seguridad. De hecho si lo hago por medios legales, la empresa podría requerir a la policía la identidad del que ha proporcionado dicha información, y denunciarle. Además, en cierta medida, estoy quitando trabajo a un auditor de seguridad, provocando que la empresa no creea necesitarlos y por lo tanto no invierta parte de sus beneficios en mantener sus sistemas mas seguros. ¿Por que iba yo a ayudarles si todos los caminos conducen a problemas? Como todo en esta vida, solo es una opinión, guiada un poco desde la experiencia. Pero si alguien opina de forma diferente, reconoce el ERP por las capturas y quiere comunicárselo, que se pregunte: ¿Si tengo a gente gratis trabajando para mí?, ¿para que voy a pagar a alguien para que haga su trabajo?
Vamos al grano si es que aún os han quedado ganas de leer esta entrada 🙂
¿Por qué digo en el título hackeando al jefe?, debido a que el fallo que voy a enseñar a continuación (tampoco he hecho un exploit público) permite ejecutar código remoto en el ordenador de cualquier empleado o directivo que se conecte a su programa de gestión, ( y previamente tengamos un MITM, o modificadas las dns de su router para que ataquen a nuestra IP)
Aún así tengo la conciencia tranquila, ya que en ningún momento mi jefe ha sido hackeado, me cae bien, no se por que iba a hacerle tal cosa, pero siempre queda mejor meterle un poco de suspense al asunto 🙂
#Empecemos
A simple vista el panel de conexión al ERP es el siguiente, podemos ver, que el servidor a donde se conecta (pixelado) es accesible para modificarlo desde el propio usuario, pero eso de momento lo vamos a obviar, en su propia web, nos comunican que el programa está hecho en python, lo que ya nos da una pista de lo que veremos mas adelante. Hay que decir, que todo esto lo hacemos desde una cuenta autenticada con ellos, suministrada por el proveedor, para poder realizarle pedidos online. De otra manera no sería reproducible dicha explotación.
Vamos a encender el wireshark para ver que envía a dicho servidor (el del proveedor de informática)
¿Pero un momento?, ¿Que pinta ahí código python?, ¿No era una trama de Wireshark?
Se trata de un código que el servidor manda al cliente para que este lo ejecute cuando se conecta, a modo de macro o vete tu a saber que… Ahora bien, si modificamos dicho código al vuelo, ¿que pasará? ¿Realizará algún CRC, o verificación de que lo que envía, es lo mismo que ejecuta?… pues si ya lo envía así … mi experiencia en el sector es que ¡NO!
Y si os fijáis el código viene con comentarios y todo, osea.. que no tendría la necesidad de alterar la aplicación para añadir código, simplemente descomento algo, injecto aquí y allá y ¡todo funcionará como se esperaba!, ¡nada raro aparecerá!
Aparte … un momento, esos comentarios esconden ¡¡un select a la tabla de usuarios!! (un poco raro pero es un select xD) (¿SQLi?)
De hecho analizando a simple vista, mediante sus comentarios y mediante la vista del programa, es el código que rellena la ventana de favoritos del programa
#VamosAlLío
La idea del ataque es la siguiente. Poner a la escucha un puerto local, redirigido al servidor original (el del proveedor) y interceptar todas las tramas entre el cliente y el servidor, de forma que pueda primero modificar y mostrar un mensaje al entrar diciendo algo, si consigo hacer eso, podré cambiar el select y mostrar todos los usuarios de la tabla vendedores 🙂 ¿fácil no? lo que viene siendo un MITM de toda la vida.
use auxiliary/Local/invisibleSocksProxy set FilterFile d:\temp\filtro.cs <- Archivo de filtroset remoteEndPoint server.empresa.es,81XX <- Puerto y servidor de destinoset localport 81XX <- Puerto y servidor localset proxyendPoint null <- No uso ningún socks proxyshow optionsrun
Acabamos de hacer una ejecución de código remoto 🙂
Ya de momento sabemos que funciona, y el select está hecho, solo queda modificarlo para que me muestre en pantalla el mensaje de dicha tabla (cabe decir que el python es muy puñetero y requiere de estar perfectamente indentado con tabuladores y saltos de linea, por que si no falla … )
Son tan amables que me muestran la linea del error
Hay que tener en cuenta que su función select a simple vista dice: selecciona (SELECT) todos los vendedores, dame solo los campos ‘cero’, VD_USU (id usuario .. ) y el campo VD_BLQ (el campo de si está bloqueado el usuario o no) … Cuando (WHERE) el usuario sea el que yo te digo.
Modifico el replace.txt de la siguiente forma (todos los vendedores que no esten bloqueados 🙂 ) y que me muestre un mensaje con ln[1] (el id de usuario).
Siempre que modifico no puede pasar de 362 bytes para que no me falle, sino cambiaría en parte distinta del mensaje y me saldría un odioso mensaje.
Y realizados esos cambios, al logearme ¡la aplicación empieza a escupirme usuarios no bloqueados!
6 comentarios en «[#ZeroDay] Hackeando al jefe, por mi y por todos mis compañeros, ¡pero por mi primero!»
Y a su primo el CRM que tal le ira con la misma medicina ,seguro que hay sistemas con el mismo sintoma clínico.
Excelente articulo, gracias por compartir.
Saludos.
Me alegro de que te gustara!
Gran articulo, enhorabuena.
Me alegro que te guste :). Gracias
Los comentarios están cerrados.