Una de las técnicas de uso común en el sector de la seguridad informática es la ingeniería inversa, o como se suele llamar en el argot propio de seguridad, el Reversing. Pero… ¿El Reversing para qué se utiliza?
El reversing es la técnica por excelencia para analizar el comportamiento de las aplicaciones maliciosas cuando no se dispone del código fuente. Un analista hace uso de esta técnica en el momen to que detecta que un usuario ha descargado un recurso potencialmente malicioso y él mismo lo analiza para determinar si el comportamiento de ese recurso es el que espera la víctima.
Pues bien, en el SOC de Sothis tenemos un panel LED que está conectado a sensores y se pretende que todas las alertas que se muestren en la consola del SIEM se muestre en él. Para tal propósito se desarrolla una aplicación en Python3. El panel LED se recibe los datos a mostrar por el puerto de comunicación COM, de modo que utilizamos PySerial para comunicarnos con el panel. Una vez implementada la aplicación se ejecuta y vemos como el panel se congela cuando le llegan los datos.
El paquete del panel contiene su driver, que sólo posee un software muy básico donde únicamente se puede escribir en texto plano. Dado que no posee ninguna librería para referenciar en una implementación propia, se aplica la técnica que hemos introducido al principio, el reversing y para poder proseguir nos haremos las siguientes preguntas ¿Qué tengo?
¿Cómo puedo utilizar el reversing para generar un programa custom?
Como hemos comentado, disponemos del driver del panel LED, del cual se puede obtener el protocolo encargado de comunicarse con el panel LED; qué comandos se envían para realizar qué acciones, etc. También disponemos de un cable USB que utilizamos para conectar el panel LED con el ordenador.
Si existe una comunicación entre PC-Panel/Panel-PC, perfectamente se puede capturar el tráfico entre ellos, es decir, hacer un Man in the Middle a la comunicación entre el panel y el PC, y de esta forma poder aplicar esos comandos como string al programa de refresco del panel LED.
Como la comunicación se hace por puerto USB se debe adaptar la captura dicha comunicación, para ello hacemos uso de USBPcap. Desde USBPcap indicamos cual es el puerto del que desea capturar el tráfico (sniffing) y sin más, se ejecuta USBPcap para que empiece a capturar el tráfico. En este caso la ejecución del software del fabricante debe de ser simultánea a la de USBPcap, para que capture las tramas reales y no otras.
Una vez se ha capturado el tráfico de la comunicación entre el software del fabricante y el panel LED es cuando entra el reversing en juego.
Abrimos el archivo generado durante la captura de la comunicación por USBPcap con Wireshark. Nada más abrir el archivo vemos las tramas enviadas y recibidas sin entender a priori el protocolo utilizado.
Como se ve en la imagen, las tramas correspondientes a la comunicación que nos interesan son las que Source: host y Destination:5.6.1, pues se corresponden con las que envía el PC. Analizando la trama observamos que hay que distinguir carácter a carácter los comandos que está enviando el software del fabricante.
Cada uno de los elementos que están entre “< >” se corresponden con comandos del panel LED. Estos comandos indican como se va a visualizar el mensaje, definen los colores, la velocidad del texto, la fuente… Con esto ya se podría implementar un script para mostrar mensajes de forma continua en el panel LED, es más, lo hicimos, pero con las primeras pruebas se observó que seguíamos fallando en algo, pues el panel se queda bloqueado.
Es el momento de recapitular y volver a analizar las tramas de la comunicación. Realizando un análisis más profundo de la comunicación observamos que nuestro mensaje no era correcto, se llegó a la conclusión que al final del mensaje y antes de “<E>” existe un checksum del mensaje enviado, éste es un valor hexadecimal. Este checksum indica al panel LED la longitud del mensaje, así el panel es capaz de identificar cuantas páginas necesita para mostrar el mensaje. Por lo que la trama queda finalmente con el siguiente formato:
Para finalizar os mostramos un extracto del código Python utilizado para comunicarnos con el panel LED. Tal como se ha comentado al inicio del post, este código se utiliza para mantener actualizado el panel LED mostrando la información proveniente de las sondas.
Como hemos podido ver el reversing no tiene porqué ser complicado y ahora que ya sabes cómo se puede hacer, ¿por qué no lo pruebas?