Hash: Cómo identificarlos y crackearlos

Hash: Cómo identificarlos y crackearlos

¿Qué es un hash?

En el mundo de la informática, hash es un término bastante usado y aunque ni lo te lo imagines hace parte de una gran cantidad de cosas que usas, por ejemplo es común observar que en muchas de las paginas antes de descargar un programa u archivo nos muestren la siguiente información:

File: Nombredelprograma.pdf
md5: 085f4e1cf27dcc1be119d713077bd28

La primera línea es de nuestro entendimiento sencillamente es el nombre del archivo, pero probablemente no comprendas para que se presenta la segunda línea, el objetivo es que las personas puedan descargar el programa y por medio de alguna herramienta (como MD5 context menu en Windows o md5sum en Linux) puedan generar su MD5 (hash) y si el programa descargado no ha sido modificado el MD5 debe ser idéntico al presentado por la página, pero si cambia esto se debe a que posiblemente el software fue manipulado con alguna intención que no siempre es buena o simplemente fue mal descargado. Por tomar otro ejemplo, en los sitios donde estás registrado encriptan datos sensibles como por ejemplo la contraseña, el resultado de esto es un hash, de esta manera si alguien accede a los datos a simple vista no podría saber tu contraseña. En terminos más tecnicos un hash es:

Se refiere a una función o método para generar claves o llaves que representen de manera casi unívoca a un documento, registro, archivo, etc. (Wikipedia).

¿Cómo identificar un hash?

Existe una gran cantidad de tipos de hash, algunos más usados que otros y por esa misma razón a veces uno se encuentra con el problema de querer identificar el tipo de un hash en específico. Para esto debemos tener a la mano es un serie de tools o herramientas que nos brinde una amplia gama de hash existentes y podamos ver la estructura de un hash pasado por esos algoritmos y luego de eso comparar los resultados con nuestro hash para ver cual se le asemeja más, no es una tarea muy sencilla ya que el resultado de algunos algoritmos es muy parecido. Para identificar hash existen dos sitios interesantes: Hash Generator y Generador Hash V3.0.

Como pueden observar cada una de estas paginas nos brinda la posibilidad de observar un hash generado con cada uno de los algorimos. Si queremos diseñar nuestra propia herramienta es muy sencillo, solo es apropiarnos de una buena funcion o libreria que manipule hash o programar los algoritmos que consideramos necesarios, para un ejemplo les esta la librería mas común en PHP para esta labor, hash_algos. Manos al código:

<?php
/* Comprobar Hash
   www.RedInfoCol.org - Monje
*/
//$hash = "cf2db5ec261a0fa27a502d319xxxxxxxxx";

/*
ipb,md5,md5(md5),ntlm.Radminv2,md4,ripemd128, tiger128,3 , tiger128,4 , haval128,3 , haval128,4 , haval128,5
*/
for($k=65;$k<=122;$k++){
for($j=65;$j<=122;$j++){
for($l=65;$l<=122;$l++){
for($m=65;$m<=122;$m++){
$token = chr($k).chr($j).chr($l).chr($m);
$md5 = hash('md5',$token);
$md52 = hash('md5',$md5);
$md4 = hash('md4',$token);
$ripemd128 = hash('ripemd128',$token);
$tiger1283 = hash('tiger128,3',$token);
$tiger1284 = hash('tiger128,4',$token);
$haval1283 = hash('haval128,3',$token);
$haval1284 = hash('haval128,4',$token);
$haval1285 = hash('haval128,5',$token);

if($md5 == $hash ||
$md52 == $hash ||
$md4 == $hash ||
$ripemd128 == $hash ||
$tiger1283 == $hash ||
$tiger1284 == $hash ||
$haval1283 == $hash ||
$haval1284 == $hash ||
$haval1285 == $hash ){
echo $md52." -> ".$token.chr(10);
echo $md4." -> ".$token.chr(10);
echo $ripemd128." -> ".$token.chr(10);
echo $tiger1283." -> ".$token.chr(10);
echo $tiger1284." -> ".$token.chr(10);
echo $haval1283." -> ".$token.chr(10);
echo $haval1284." -> ".$token.chr(10);
echo $haval1285." -> ".$token.chr(10);
exit;
}
}
}
}
}
?>

Si se pueden dar cuenta es tan sencillo como llamar la función hash(‘nombre del hash’, cadena) y listo ya tendríamos nuestra propia herramienta encargada de generar hash con varios algoritmos para identificar características de estos. Ahora los datos más relevantes para identificar un hash son:

  1. Longitud.
  2. Set de caracteres.
  3. Patrones en sus sintaxis.

¿Cómo crackear un hash?

Un hash en si no puede regresar a texto plano ya que los algoritmos para generar estos están diseñados para esa tarea, en ese caso lo que se hace es el proceso que se conoce como crackear un hash por fuerza bruta. El procedimiento consiste en generar varias palabras con una determinada longitud en base a un charset que básicamente es un conjunto de caracteres normalmente compuesto por el abecedario en mayúsculas, minúsculas, números y signos, posteriormente las palabras generadas aleatoriamente son encriptadas resultando así un hash, este hash resultante es comparado con el hash que se quiere crackear. El proceso es demorado, depende del tamaño del charset y de la longitud, las posibilidades pueden ser millones.

Otra forma de hacerlo es con un ataque por diccionario, se trata de conseguir un archivo con varias palabras ya generadas y estas son igualmente son encriptadas y comparadas, es mucho más rápido que la técnica anterior pero su efectividad depende del diccionario; existen sitios como packetstormsecurity.org con una gran variedad de wordlists para ser usados.

Rainbow tables es otra técnica mucho más veloz que las anteriores, consiste en tener hashes ya pre-calculados, lo único que se hace es comparar estos con el hash a crackear, existen sitios como este donde se pueden descargar las tablas.

Existe una gran variedad de programas para realizar ataques por fuerza bruta, pero los más completos en mi concepto son Cain & Abel (Windows) y John the Ripper (multiplataforma). Los anteriores programas crackean una gran cantidad de hashes pero hay casos en los que no tienen soporte para determinado tipo de hash, el siguiente script es un concepto para ser usado con un ataque por fuerza bruta, donde hash se reemplaza por la función especifica del hash:

<?php
/* Crackear Hash con PHP
   www.RedInfoCol.org - Monje
*/
$original = "ff4dc518fb3d5d20a81fd1c6faff577641edf4b9";
for($i=21;$i<=126;$i++){
for($j=21;$j<=126;$j++){
for($k=21;$k<=126;$k++){
$salida = hash('sha1',chr($i).chr($j).chr($k));
if($original==$salida){
echo chr($i).chr($j).chr($k);
}
}
}
}
?>
Clerigo (o Monje) es ingeniero de Sistemas, apasionado por el desarrollo del software y un curioso por saber el funcionamiento interno de cada cosa. Project manager de RIC.

3 Comentarios

  1. Responder

    Esta es para el Monje si podria ayudarme, podria decirme a que se reduce este hash en texto plano?!

    entrada RSA : AA073CD0395969D929C68BEB2E9B4A32

    body:
    wK2JdtHyTEV8nW3EmPzOFSLetBa9bM0nYOg7SlvycnhiOCyxXAVaQ8PzPP5nvZ0g
    lwlWkZqCHAD/iQMkEnfuY3llLLV5ZMx3oRTzDbnCd/fscGBgTrqX9Xin+XCYOwxe
    g1QOogjPzvi4YTXl8cA/sQkw5mKezJ1ZIaWhjQY1IxwtK1t9vgN78Z+cuaLuWV8F
    nNuuImDiYqNOGrHN95aXpoYLzn8NoLmwb7zPRPtekkyOK1IaYPEc6YBHomlRyXTO
    4avmDSdGk9d39jyOEt5NE7bTE63abh9cf/y5Mgtol1bk6ntOJUWmxnQCQK8y0Lxp
    j6a1YsdGKhIfi5zCVHUT6GVlrzaGtNqhxB2Cz1lAV+gIYR/VUj9vrQoyI4XouMa3
    N7ucwuZgnGW+VmAKzdSwQTEC6ZktbEh5pGqfdtNX+Qz5B/HEhbvkCcTgs8xanFgB
    Ii9090nnz1y2+BHxOmij4T+MRPJmyuTAAUFXksyP0fYeogrC3KnMQq85kHxfgj1W
    dSRHNfec2hH/NnhDUuthOgRQuVx6oYdVYfWMmkkaJ00IVuDB0eH2GU0foes5nw0u
    abqQwuHIOWMjegHDs7s4zMA8Lt/ADjB6WObn53b62OEmlbdo6UFevtAGVb9Jw7bx
    vExrcm3CKE28hhaGD2tPGOyok+aCVpFGifOcsr4CPcV1WX/dTFqptPP4Pe5USCsV
    +BpjG2FfgJdeBTnRdB/QeZB/uzCs6HsIL20V+rLbEEZ9O/mfLs1S8NgIZGdbNDPa
    dcmXyxB5qJCo9UPVnT9EbeCiv9+eHPqYaK1WJbEVGEIjRLRrF/o/aam7WWCnL0VU

    Muchas gracias ,monje hermano..

  2. Responder

    Hay una website que me ha servido de mucha utilidad al momento de generar hashes simultáneos como md5, sha1, sha256 incluyendo la función crypt. Pueden revisarla aquí http://www.kaarosu.com

  3. Responder

    Simplemente claro.

Deja un comentario

Your email address will not be published. Required fields are marked *

You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>