A lo que llega uno cuando está algo aburrido, y no sabes en qué gastar algo de tiempo. :D

Pues bien, recordando mis viejos tiempos en el deface, se me vino a la mente el nombre de los típicos cifrados (hash) que encuentras al explotar una vulnerabilidad web, como por ejemplo mediante la Inyección SQL (SQLi). Sí, hablo del más común y más usado de los «hashes», el MD5 (Message-Digest Algorithm 5).

«Descifrar» una cadena cifrada mediante algún hash es algo prácticamente imposible, pues el algoritmo es de una sola vía por lo cual no existe una contraparte que nos dé la cadena original de «una manera fácil».

¡Claro!, hay una manera de obtenerlos pero es muy poca ortodoxa. Éste método es mejor conocido con el vulgar nombre de «ataque de fuerza bruta». Por éste método se generan cada segundo muchas palabras o se emplean los famosos diccionarios, que luego serán convertidos en un hash. Si éste hash resultante coincide con el hash «a descifrar» se puede deducir que se ha obtenido la palabra correcta, pero bien, éstos ataques pueden durar horas, días, meses y hasta bastantes años; todo radicando en la pura fuerza criptográfica del algoritmo.

Retomando el tema principal. Por la Inet existen bastantes sitios webs que permiten «descifrar» un hash MD5. Obviamente no lo hacen con todo el énfasis en el verdadero significado de la palabra, simplemente realizan una búsqueda en una base de datos (BD) y como anteriormente expliqué, si el hash coincide se muestra la cadena antes de pasar por el proceso de cifrado.

Uno de los sitios webs que más me gusta utilizar para ésta labor es HashKiller, el cual es bastente completo y efectivo.

¡Bien!, creo que con la pequeña introducción es suficiente, ahora a divertirnos programando!.

Programando buscador en Python

Para programar el buscador simplemente necesitamos una biblioteca (librería) bastante interesante, la cual es UrlLib (urllib). y el sitio que nos servirá como mediador para obtener el hash descifrado.

Bueno, en éste caso usaremos el anteriormente nombrado (HashKiller), ustedes pueden usar cualquier otro, igual les servirá de práctica. :D

Navegando un poco por él, me acabo de enterar que tienen una API para un acceso mucho más fácil. ¡Más que perfecto!. :)

Ahora abrimos nuestro editor de texto o en su defecto un IDE (Uso Netbeans, por si se están preguntando… ;) ), importamos la librería y declaramos la función que buscará el Hash…

import urllib
 
def SearchMD5(MD5):
    URL = urllib.urlopen('http://hashkiller.com/api/api.php?md5=%s' % MD5).read()
    if 'false' in URL:
        return ''
    else:
        URL = URL.split()
        URL = URL[5].replace('<plain>','')
        URL = URL.replace('</plain>','')
    return URL

Paso a explicar un poco el código.

Primero, abrimos la dirección con el hash introducido, si está la palabra «false» en él retornamos un valor en blanco (nulo), en caso contrario cogemos cada valor de la dirección y lo convertimos en una lista, dando como resultado algo como ésto:

['<?xml', 'version="1.0"', 'encoding="utf-8"?>', '<result>', '<found>true</found>', '
<plain>pass</plain>', '<md5>1a1dc91c907325c69271ddf0c944bc72</md5>', '</result>']

Posteriormente accedemos al quinto (5) valor de la lista y reemplazamos las etiquetas por caracteres vacíos.

¡Eso es todo!, ahora pueden crear sus propios buscadores de Hash usando los servicios disponibles por la Inet.

Por cierto, acá dejo mi DanMD5!.

# -*- coding: utf-8 -*-
#####################################################
# Autor: .:WindHack:.                               #
# Sitio web: http://daw-labs.com                    #
# Puede usar, modificar y redistribuir éste código  #
# siempre y cuando respete los derechos de autor.   #
#####################################################
 
import urllib
from hashlib import md5
 
def IsValidMD5(MD5):
    if len(MD5) != 32:
        return False
    else:
        return True
 
def SearchMD5(MD5):
    URL = urllib.urlopen('http://hashkiller.com/api/api.php?md5=%s' % MD5).read()
    if 'false' in URL:
        return ''
    else:
        URL = URL.split()
        URL = URL[5].replace('<plain>','')
        URL = URL.replace('</plain>','')
    return URL
 
def GenerateBBC(MD5,Result):
    BBC = '''
BBCode:
[url=http://hashkiller.com/]HashKiller[/url] & [url=http://daw-labs.com]DaW-Labs[/url] Result:
MD5 - [color=red][b]%s[/b][/color]
Hashkiller.com & DanMD5 - [COLOR=green][b]%s[/b][/COLOR]
          ''' % (MD5,Result)
    return BBC
 
print '''
    #####    #   #   # #   # #####  ###  #  
     #  #   # #  #   # ## ##  #  #  #    #  
     #  #  ##### ##### # # #  #  #  ###  #  
     ####  #   # #   # #   #  ####    #     
    #    # #   # #   # #   # #    # ###  #  
        © 2010. DaW - Labs.
        DanMD5 es un buscador de Hash MD5
        Gracias a HashKiller (API)
      '''
 
while True:
    print '''
      ======== Menú ========
      1. Buscar Hash MD5
      2. Crear Hash MD5
      3. Salir
      ======================
          '''
    Opc = input('>>> ')
    if (Opc == 1):
        MD5 = raw_input('Hash MD5 >> ')
        if IsValidMD5(MD5):
            Result = SearchMD5(MD5)
            if Result != '':
                print '¡Hash encontrado! - %s' % Result
                print GenerateBBC(MD5,Result)
            else:
                print 'No hay resultados...'
        else:
            print '¡Hash MD5 inválido!'
    elif (Opc == 2):
        Cadena = raw_input('Cadena >> ')
        print 'La cadena en MD5 es: %s' % (md5(Cadena).hexdigest())
    else:
        exit()