15 junio 2011

Hashing de Ficheros con md5deep y hashdeep

Desde hace ya algún tiempo, la cantidad y tipo de malware existente, hace que los sysadmins tengan que inventarse métodos nuevos para la prevención, detección y eliminación efectiva de amenazas, el malware quiere integrarse de la mejor forma posible en todas las plataformas, sin que moleste, cumpliendo silenciosamente con la función que fue creado como un perfecto parásito.

Es en el punto de la detección de cambios en los ficheros donde tienen cabida las herramientas del título.

Md5deep es una herramienta multiplataforma gratuita y portable creada por Jesse Kornblum y sus colaboradores disponible en http://md5deep.sourceforge.net/ que nos permite crear y comprobar los resúmenes hash de los ficheros que le indiquemos mediante la línea de comandos o scripts, además de con MD5, trabaja también con SHA-1 (sha1deep), SHA-256 (sha256deep), Tiger (tigerdeep) y Whirlpool (whirlpooldeep) en sus versiones para 32 y 64 bits (en Windows) por lo que tenemos funciones con distinta robustez donde elegir y para distintos tipos de arquitectura.

Ejemplo de Fichero con md5deep
Hashdeep permite crear y comprobar con uno o varios métodos mencionados en el párrafo anterior la integridad de los ficheros deseados.

Ejemplo hashdeep con MD5 y SHA1
Las herramienta md5deep (con sus variantes) y hashdeep permite crear un fichero maestro y a partir de ahí verificar si hubo cambios en los existentes o ficheros nuevos, el uso de filtros por tipo de fichero, tamaño, analizar de forma recursiva un directorio, fichero o conjunto de ficheros definidos...

La documentación (en inglés, de md5deep y hashdeep) disponible en la web del autor, y en la carpeta descomprimida de los programas describe las diferentes opciones de forma clara, también se puede consultar la ayuda desde la consola en el directorio de la herramienta mediante posponiendo -h a la herramienta elegida:

c:\md5deep-3.9>md5deep.exe -h
md5deep.exe version 3.9 by Jesse Kornblum.
C:\> md5deep.exe [OPTION]... [FILE]...
See the man page or README.txt file for the full list of options
-p <size> - piecewise mode. Files are broken into blocks for hashing
-r  - recursive mode. All subdirectories are traversed
-e  - compute estimated time remaining for each file
-s  - silent mode. Suppress all error messages
-S  - displays warnings on bad hashes only
-z  - display file size before hash
-m <file> - enables matching mode. See README/man page
-x <file> - enables negative matching mode. See README/man page
-M and -X are the same as -m and -x but also print hashes of each file
-w  - displays which known file generated a match
-n  - displays known hashes that did not match any input files
-a and -A add a single hash to the positive or negative matching set
-b  - prints only the bare name of files; all path information is omitted
-l  - print relative paths for filenames
-k  - print asterisk before filename
-t  - print GMT timestamp
-i/I- only process files smaller than the given threshold
-o  - only process certain types of files. See README/manpage
-v  - display version number and exit


Caso práctico:

Vamos a monitorizar los ficheros que se encuentran en el directorio Windows en C:\Windows, aunque podría ser archivos de programa, una carpeta de datos...

Paso 1. Estudiamos el algoritmo que más nos conviene, según la potencia de nuestro ordenador, requisitos de seguridad... En mi caso para comprobar cuanto tardaba en completarse cree el siguiente script:

@echo off
echo "%date%,%time%" md5 > c:\users\jose\desktop\logwindows.txt rem medición del tiempo.

rem generación de archivos con los resumenes en md5, Sha1, Sha256, Tiger y Whirlpool
rem recursivamente (-r) del directorio Windows,
rem de forma silenciosa (-s) mostrando el tamaño del archivo (-z)
rem y fecha y hora del timestamp (-t)
rem formato de salida: tamaño hash timestamp ruta\nombrefichero.extensión

C:\md5deep-3.9\md5deep.exe -r -s -z -t C:\Windows > c:\users\jose\desktop\md5deep.txt
echo "%date%,%time% md5 64" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\md5deep64.exe -r -s -z -t C:\Windows > c:\users\jose\desktop\md5deep64.txt
echo "%date%,%time% sha1" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\sha1deep.exe -r -s -z -t C:\Windows > c:\users\jose\desktop\sha1deep.txt
echo "%date%,%time% sha1 64" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\sha1deep64.exe -r -s -z -t C:\Windows > c:\users\jose\desktop\sha1deep64.txt
echo "%date%,%time% sha256" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\sha256deep.exe -r -s -z -t C:\Windows > c:\users\jose\desktop\sha256deep.txt
echo "%date%,%time% sha256 64">> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\sha256deep64.exe -r -s -z -t C:\Windows > c:\users\jose\desktop\sha256deep64.txt
echo "%date%,%time% tiger" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\tigerdeep.exe -r -s -z -t C:\Windows > c:\users\jose\desktop\tigerdeep.txt
echo "%date%,%time% tiger 64" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\tigerdeep64.exe -r -s -z -t C:\Windows > c:\users\jose\desktop\tigerdeep64.txt
echo "%date%,%time% whirlpool" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\whirlpooldeep.exe -r -s -z -t C:\Windows > c:\users\jose\desktop\whirlpooldeep.txt
echo "%date%,%time% whirlpool 64" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\whirlpooldeep64.exe -r -s -z -t C:\Windows > c:\users\jose\desktop\whirlpooldeep64.txt

rem benchmark con diferentes métodos de hashdeep
rem -c genera el fichero de hashes -r recursivamente

echo "%date%,%time% hashdeep md5 y sha1" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\hashdeep.exe -c md5,sha1 -r C:\Windows > c:\users\jose\desktop\hashdeep_md5ysha1.txt
echo "%date%,%time% hashdeep md5 y sha1 64" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\hashdeep64.exe -c md5,sha1 -r C:\Windows > c:\users\jose\desktop\hashdeep_md5ysha1_64.txt
echo "%date%,%time% hashdeep md5, sha1 y Whirlpool" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\hashdeep.exe -c md5,sha1,Whirlpool -r C:\Windows > c:\users\jose\desktop\hashdeep_md5,sha1ywhirlpool.txt
echo "%date%,%time% hashdeep md5, sha1 y Whirlpool 64" >> c:\users\jose\desktop\logwindows.txt
C:\md5deep-3.9\hashdeep64.exe -c md5,sha1,Whirlpool -r C:\Windows > c:\users\jose\desktop\hashdeep_md5,sha1ywhirlpool_64.txt
echo "%date%,%time% fin del benchmark" >> c:\users\jose\desktop\logwindows.txt
exit

Con la diferencia de tiempos decidimos el que más nos conviene. En mi caso ha arrojado los siguientes resultados.


Analizando el gráfico, vemos que suelen rebajar los tiempos las ediciones para 64 bits, que los distintos métodos para su diversa complejidad tengan tiempos bastante igualados y que la herramienta hashdeep con varios métodos en el análisis tarda bastante menos que cada una de ellas por separado, mayor diferencia cuantos más métodos se usen.

Paso 2. Creamos el archivo maestro, a partir del cual se buscarán cambios en los ficheros. Consiste en utilizar el comando del benchmark pero solamente con el algoritmo deseado.

Paso 3. Mediante la opción -m busca las coincidencias (los ficheros que no han cambiado) y con las -x las no coincidencias.

Paso 4. Podemos crear scripts que automaticen esta labor mediante una tarea programada para repetirla según nuestras necesidades.

Problema conocido: Si se está usando Windows Vista / 7 es posible que el sistema bloquee el acceso a ciertos ficheros por no tener privilegios de administrador. Podemos volcar en el archivo también los errores y analizarlos aparte. Para volcar estos errores junto con todo el análisis mediante:

C:\md5deep-3.9\md5deep.exe -r -s -z -t C:\Windows > c:\users\jose\desktop\md5deep.txt 2>&1

Los filtramos:
findstr ": Permission denied" > c:\users\jose\desktop\soloerrores.txt

Creamos un archivo con solamente las rutas anteriores, y ejecutando un terminal con privilegios de administrador:
md5deep.exe -f c:\users\jose\desktop\rutaerrores.txt

Nos debería de mostrar la mayoría de los hashes de los ficheros.

Con estas pequeñas herramientas la detección de cambios en la creación y la modificación de archivos, no debería suponernos ningún problema.

[+] Página de md5deep y hashdeep

--------------------------------------- 

Contribución gracias a Jhnmarie

3 comments :

caic dijo...

Muy interesante. Es una manera bien sencilla y gratuita de monitorizar ficheros :)

Odiseo dijo...

Por lo que entiendo esto solo mantendría control, de los files que ya presenta en su archivo de datos. Por lo cual si uno adiciona un file o carpeta nueva. La misma no sería considerada como elemento nuevo por no encontrarse registrada en la primera captura.

John Marie dijo...

Si es posible, con la opcion -X que busca las no coincidencias (archivos nuevos o modificados) y genera sus hashes, de este modo se podría mantener actualizado el fichero de hashes. Ej:

md5deep.exe -r c:\ > d:\contenido_c.txt
md5deep.exe -X d:\contenido_c.txt -r c:\ >> d:\contenido_c.txt