Hace un par de semanas en el grupo de informática forense, alguien compartió este link:
https://blog.segu-info.com.ar/2018/05/cambiar-el-hash-md5-de-un-archivo.html?utm_source=dlvr.it&utm_medium=twitter
y otro miembro contestó que no le veía el sentido a modificar un fichero añadiendo un NULL, a lo que un tercero replicó que para evitar una detección por hash. En una peli se verá igual de bien y un programa se ejecutará igual de bien. Este chico no lo pudo decir más claro.
Bueno pues nada, el programita y lo que hace ahí queda, no lo comento. Sin embargo,vamos a realizar una prueba de concepto de ello, espero os guste:
- Mostraremos como añadir el carácter NULL y ver como evoluciona en el hash, pero con SHA256.
- Nos crearemos una blacklist con los hashes de muestras de bichos.
- Nos crearemos un rudimentario detector de bichos vía hash.
Herramientas
- Un editor hexadecimal como HxD: https://mh-nexus.de/en/programs.php
- El entorno de ejecución de python 3: https://www.python.org/downloads/
- Script de cosecha propia para hashear aquí.
Modificando los ficheros
No voy a entrar en mundos tenebrosos de en donde sería mejor colocar el carácter NULL u otra cadena que no interfiera en la ejecución de un código malicioso o programa, para no ser detectado por hash. Me limito solamente a añadir una serie de caracteres como veréis al final del fichero, pero que sin embargo son suficientes para cambiar el hash y fastidiar un simple script que tengamos hecho o porque no de pago que simplemente se dedique a rebuscar los hashes y lanzarlos contra una blacklist. Si la herramienta solo hace eso mal asunto.Resulta evidente que hay mecanismos mucho más complejos de detección de cadenas, heurísticas, algoritmos dotados de IA, sandbox, antivirus, antimalwares, antipulgas, antipiojos… vamos lo que seáis capaces de conocer con el fin de detectar las amenazas.
Nuestra prueba de concepto es de pueblo, vamos como el pan, tan de campo como lo es San Isidro Labrador, leches tan casera como los flanes de la abuela.
Tenemos varias formas de añadir caracteres NULL a parte del programa nombrado arriba.
Vemos dos muy sencillas y sus resultados los veremos con el HxD. A los ficheros modificados les añadiremos el sufijo _mod, con los que denotaremos que han sido modificados.
Con HxD
Copiamos el carácter 00 de cualquier celda y la pegamos insertando al final del fichero.Fichero adb.exe original copiando el carácter NULL 00
Como podéis imaginar suponemos que el fichero adb.exe es un bicho, no es cierto, pero suponemos que tiene código malicioso. Pero para la prueba de concepto lo que queremos es confirmar que la modificación no influye en el funcionamiento.
Con la consola de comandos
En Windows seria:
Y ahora mostramos las 3 ejecuciones y son idénticas:
Y como no!!!, vamos a ver que ha ocurrido con los hashes, para ello supongo que tendréis vuestros calculadores de hashes o sumas de verificación chachipirulis. Por mi parte os comparto el script python del modulo 5 de un proyecto personal llamado EXERE, el cual nos permite generar recursivamente los hashes sha256 de todos los ficheros de una carpeta que le pasamos como parámetro. Ese proyecto lo podréis seguir en breve en www.eltallerdelosandroides.com, básicamente serán una suite de herramientas de botón gordo para análisis forense para smartphones. Vaya kk de proyecto de análisis forense si no tuviese un hasheador rápido y potente. Su ejecución:
A continuación el fichero de salida con los hashes en el que podemos comprobar como nuestros ficheros tienen hashes distintos. Aunque los tres ficheros se llamasen igual la modificación esta claro que afectaría al hash. Es decir, dos ficheros con contenido idéntico pero con distinto nombre tendrían hash idéntico y dos ficheros con contenido distinto e igual nombre tienen hashes distintos.
Con lo cual un simple carácter aunque sea NULL, 0x00h, cambia completamente el hash del fichero y en principio, sin modificar su semántica si lo añadimos al final del fichero, o como mencionamos mas arriba en algún lugar estratégico si fuera necesario.
Creando nuestra blacklist
Imaginemos ahora que vamos a crearnos un detector de bichos basado en hashes. Esos bichos pueden ser troyanos, virus, programas maliciosos, malware,…. . Además imaginemos e invito a la reflexión, que estamos en una comunidad en la que la peña se involucra y nos mandan o cuelgan en un site los hashes de un programa o código malicioso, o directamente el fichero o fragmento y que nuestro site analiza y nos hashea. Ese hash lo agregamos a un fichero o base de datos, es decir, una blacklist con los hashes para que podamos lanzar un fichero o lote de ficheros en el que podría haber bichos mediante un script. Dicho script hashea los ficheros y los comprueba con la blacklist. A que os suena esto???? yo lo dejo caer.Hagamos un inciso y pensemos, para este ejercicio solamente vamos a tener una blacklist con apenas 3 muestras, es decir, una blacklist diminuta, con comprobar el hash de cada fichero del lote y tirarlo contra la blacklist de forma lineal y verificamos rápidamente si es o no un bicho.
La realidad no es tan sencilla, hay más de 6 millones de malware según leí hace poco, con sus mutaciones, permutaciones, variantes, mods A-B-C y porque no con diversos finales con caracteres NULL para modificar su propio hash original y eludir la identificación por hash.
Con lo cual esa cantidad de hashes es intratable con una estrategia lineal como la que vamos a poner a funcionar. No voy a plantear soluciones para ello aquí, pero si podríamos introducir una estrategia de árbol con su búsqueda, en el que en cada nivel haya un carácter hexadecimal con sus 16 caracteres posibles y así 64 niveles (64 bytes del hash), que no tienen porque ser completos. En la construcción del árbol puede haber niveles incompletos y así sucesivamente hasta cubrir todo el dominio de esos 6 millones de hashes. Linealmente ocuparían 367Mb. Pero en un árbol ocupan bastante menos y ademas la búsqueda es infinitamente más eficiente, no voy a comentar ordenes logarítmicos, conceptos que se ven en algoritmia en ingeniera informática, donde algo que parece intratable se puede computar con estructuras avanzadas y algo de ingenio.
Aprovecho un saludo a todos los PREDATORS de la UNED, para que podáis seguirme en esta jerga, los PREDATORS son los alumnos de la asignatura PREDA código 71902019, PRogramación y Estructuras de Datos Avanzadas.
Bien, perdón pon venirme arriba. Continuemos. Ahhhh si !!!!!! nuestro blacklist, sencillo, lanzamos el hasheador.py contra nuestra carpeta de muestras. Da igual si las tenemos clasificadas en subcarpetas o como queramos ya que nuestro hasheador.py era recursivo, es decir, recorre en profundidad todas y cada una de las subcarpetas en busca de ficheros. El caso es tener el hash de todos los ficheros en la blacklist.
Para ello cortamos y copiamos a otra ubicación los ficheros modificados y dejamos solamente las muestras originales.
Recordemos que los ficheros modificados podrían estar entre los ficheros de una extracción de algún dispositivo y son los que después vamos a lanzar contra la blacklist.
A continuación lanzamos el hasheador.py y el fichero de hashes le cambiamos el nombre por el de blacklist.txt y ya la tenemos. Solo nos interesan los hashes de los bichos.