Técnicas Forenses: Fuzzy Hashing
En este artículo se va a comentar una técnica empleada para identificar ficheros casi idénticos denominada “Fuzzy Hashing”.
Todos conocemos el porqué del uso de técnicas de hashing criptográfico en análisis forense a la hora de identificar ficheros conocidos, ya sean “known good files” para descartarlos o “known bad files” para continuar con su análisis.
Pero ¿qué ocurre si alguien decide modificar un solo bit del fichero en cuestión? el hash criptográfico ya no coincidirá en ningún caso. Vamos a ver un ejemplo práctico.
A la hora de identificar visualmente las evidencias no tenemos problema. Está claro que estás dos imágenes son distintas ¿cierto?

Pero ¿qué ocurre si tomamos la primera de ellas y la manipulamos? Podemos editarla con un editor hexadecimal y modificar el siguiente valor: borramos el último byte (43308).

Una vez eliminado el carácter nos quedaría de la siguiente manera:

La imagen original (la de la izquierda) y la nueva modificada (la de la derecha) son prácticamente iguales.

Sin embargo sus hashes criptográficos son distintos. En este caso, por ejemplo, podemos calcular sus MD5:
--------------------------------
sh-3.2# md5 jack_black.png
MD5 (jack_black.png) = cd46afe3d3b4d15831f0f7ec0a6322fb
sh-3.2# md5 jack_black copia.png
MD5 (copia.png) = e556ef5b58f66066e9e2001cc1d73b92
--------------------------------
Aquí la cosa se nos complica como analistas, tenemos dos ficheros prácticamente iguales. Sin embargo, imaginaos que estamos buscando de forma automática comparando su hash con los valores conocidos de una base de datos de hashes (como, por ejemplo, la del NIST). En este caso se nos escaparía.
En este punto es donde entra en juego esta técnica de cálculo de hashes con la que podremos determinar un porcentaje de similitudes entre los ficheros que comparemos. Es decir, puede que el fichero no sea 100% idéntico pero eso no significa que no se trate de la misma imagen o que en el caso de un fichero de malware, no sea igual de código malicioso (se ha podido modificar un literal inocente y el efecto de ejecutar ese malware es el mismo).
El concepto origen de esta técnica data de 2003, del trabajo del Dr. Andrew Tridgell llamado Spamsum en el que se presenta una forma de identificar mensajes de SPAM a través de firmas en ficheros. Las firmas están diseñadas de forma en que producen un resultado que puede ser utilizado para comparar dos emails y ver si son “similares”.
Basado en este trabajo previo, Jesse Kornblum publica en 2006 “Identifyin almost identical files using context tiggered piecewise hashing”. En ese paper se explica en detalle esta técnica (CTPH) y, como prueba de concepto, se presenta la herramienta que vamos a utilizar para calcular estos hashes: ssdeep.
Usando esta herramienta generaremos hashes que podremos comparar con los de otros ficheros, produciendo como resultado un porcentaje que indicará el grado de coincidencia entre los ficheros.
Veámoslo en la práctica:
Generamos el hash de la primera imagen:
--------------------------------
sh-3.2# /usr/local/bin/ssdeep -b jack_black.png
ssdeep,1.0--blocksize:hash:hash,filename
768:i2rMCDOF3j/iCmTrYwZMlJABLRoS0BPVc1o61rB9FU93UdyUd76TxNl6tGLP:oZ3W1TUwGkac1o6j9FukwxNQtG,"jack_black.png"
--------------------------------
Mejor guardamos la salida en un fichero para compararlo posteriormente con la de la segunda imagen:
--------------------------------
sh-3.2# /usr/local/bin/ssdeep -b jack_black.png > output.hash
--------------------------------
A continuación usamos esa salida para hacer la comparación a la vez que generamos el segundo hash.
--------------------------------
sh-3.2# /usr/local/bin/ssdeep -bm output.hash jack_black_copia.png
jack_black copia.png matches output.hash:jack_black.png (99)
--------------------------------
Como se puede observar en la salida, los ficheros son un 99% similares.
Aparte de la aplicación práctica que hemos visto de identificación de p0rn, esta técnica de “Fuzzy Hashing” se usa para identificación de malware. (VirusTotal por ejemplo utiliza ssdeep).


Comentarios
Mister, comentarios como el tuyo no ayudan en nada, además, lo que pides está en otro artículo de la web que si bien es algo antiguo ya, todavía es aplicable: http://www.hacktimes.com/identificaci_n_remota_del_sistema_operativo_de_un_/ Siempre puedes usar el buscador de la web...
@Mister . Lamento que no te haya gustado que el Fuzzy Hashing no tenga nada que ver con lo que tú creías que tenía que ver. De todas formas te animo a que sigas con tu "101-Intro to Pentesting" :D
Buenas Mister, muy bueno tu comentario, sobretodo muy constructivo.
Lo que yo queria es Conocer qué sistemas operativos están en ejecución en un servidor concreto se logra mediante la técnica fingerprinting. Con esta técnica, mediante una conexión TCP se recuperan un conjunto de datos que permiten reconocer casi inequívocamente un sistema operativo, incluyendo su número de versión. Por todo ello, este ejercicio consistirá en averiguar el sistema operativo y su versión, con una cuestión muy importante, de que si no se es posible con los parámetros normales de nmap obtener el resultado pedido, forzar a Nmap a que muestre en pantalla el resultado que se persigue con unas opciones más específicas. Explicar los parámetros utilizados y mostrar los resultados mediante volcado de pantallas sucesivos, explicando cada caso.?
Menudo cagarro ;(
Muy buena explicación, la tendré en cuenta.
Añadir comentario