ExplotaciónHacktivismoPentestingPruebas de concepto

[#ZeroDay] Hackeando al jefe, por mi y por todos mis compañeros, ¡pero por mi primero!

 

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.

 

#Disclaimerdestino-pensamientos-desmotivaciones

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.

image

Vamos a encender el wireshark para ver que envía a dicho servidor (el del proveedor de informática)

image002

Lo curioso es que si bajamos un poco en la trama TCP vemos lo siguiente (totalmente sin encriptar por supuesto). Se trata de un protocolo propietario para comunicar la aplicación con los servidores de la central … más de uno ya estará pensando en fuzzearlo para saber si está securizado y poder ejecutar código remoto en su servidor (¿buffer overflow?), pero no vamos a ir por tales derroteros, nuestro objetivo es nuestro Jefe :), ese que está en la misma red y usa el mismo ERP que nosotros.
Pero vamos al lío. Viendo el mensaje, mas abajo podemos ver lo siguiente

image-1

 

¿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?)

 

image-2

 

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.

image-4

Pues de momento no es nada fácil, ya lo probé con un programa que me parece maravilloso (en java jaja), que es hace precisamente esto, tamper de tcp, intercepta las tramas de tcp, y permite editarlas y enviarlas al vuelo, en tiempo real “humano”. Lo que pasa, es que cuando modificas a mano, tardas mas de la cuenta, y el ERP tiene que tener un timeout muy bajo, (no vi donde cambiárselo) y se cierra la conexión.

 

Por lo que a priori, la modificación tiene que ser en tiempo real y sin pausas, no puedo pararme a editar el tráfico, por que la app espera, y se cierra por desconexión con el servidor.
Mi solución al problema del timeout fue la siguiente, como estoy desarrollando mi propio framework Xploit, y ya tengo hecho mi Invisible Proxy, por que no editar el código de forma que acepte filtros, si ya envió y recibo todo, ¿por que no poder modificarlo?, (como no lo había pensado antes cuando hice este módulo… )

image-6

 

Pues dicho y hecho , vamos al lió, ya podemos editar el tráfico en tiempo real en base a unos filtros, vamos a configurar el Xploit (todo el código del proxy está en github).
Cabe decir que mas tarde comprobé que hay que tener cuidado de no editar añadiendo bytes a la trama, sino solo modificarla, jugando con los bytes que tenemos, ya que sino el mensaje entre los servidores falla, y se cierra la conexión
Me creo un filtro que lo que haga sea buscar esa cadena comentada y la remplace por el contenido del archivo que tengo en otra ruta. Tal que así.

image-7

Configuro el Xploit de la siguiente forma
use auxiliary/Local/invisibleSocksProxy
set FilterFile d:\temp\filtro.cs            <- Archivo de filtro
set remoteEndPoint server.empresa.es,81XX   <- Puerto y servidor de destino
set localport 81XX                          <- Puerto y servidor local
set proxyendPoint null                      <- No uso ningún socks proxy
show options
run
Descomento la parte de salir, para ver si efectivamente se está ejecutando dicho código. Con el código replace.txt siguiente:
image-8
Ejecuto Xploit y configuro la aplicación para conectarse a localhost. Al ser una prueba de concepto y no una situación real (que se haría con un MITM) no hay necesidad de montar todo ese dispositivo para verificar si todo funciona, ya que te dan la facilidad de probarlo 🙂 de forma más rápida)
Podemos ver este pantallazo, ¡nada mas hacer LOGIN ejecuta la acción SALIR!

 

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 … )

 

image-11

 

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.

unnamed

 

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).

 

image-12

 

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.

image-13

Y realizados esos cambios, al logearme ¡la aplicación empieza a escupirme usuarios no bloqueados!

Ya puedo realizar cualquier select a sus tablas y ver el contenido en pantalla :), además de ejecutar el código python que quiera, en una máquina que pase por mi equipo como servidor (via MITM, por manipulación del servidor desde el panel del usuario, por cambios de sus servidores dns … ) , y si … ¡¡podría ejecutar una calculadora!!
Como veis todo empezó por analizar un poco el tráfico, ver cosas que no deberían estar ahí, y empezar a estirar el chicle. Así que recordad.
image-16

6 comentarios en “[#ZeroDay] Hackeando al jefe, por mi y por todos mis compañeros, ¡pero por mi primero!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Los datos introducidos se guardarán en nuestra base de datos como parte del comentario publicado, como se indica en la política de privacidad.