PHPCracker: Crackear diferentes tipos de hash con PHP
Últimamente resolviendo algunos retos me ha tocado crackear diferentes hash y aunque existen muchos programas para esa labor (como Cain) estos no ofrecen soporte para realizar fuerza bruta a algunos tipos de hash. Por esta razón hice PHPCracker, un sencillo script que permite realizar ataques por fuerza bruta y ataques por diccionario usando PHP.
<?php if (defined('STDIN')) { if (count($argv) < 2) { echo "#########################################################################\n" . "# PHPCracker UrbaN77 www.RedInfoCol.org - www.BrianUR.info #\n" . "#########################################################################\n" . "# Uso: php phpcracker.php [Modo] [Nombre del hash] [Hash] [Opciones] #\n" . "# --------------------------------------------------------------------- #\n" . "# Modo: usa -b hacer un brute force o -d para un ataque por diccionario.#\n" . "# Nombre del hash: Por ejemplo md5, sha1 o cual sea el nombre. #\n" . "# Hash: Hash a crackear. #\n" . "# Opciones: Estas dependen del modo elegido. #\n" . "# - Charset: min para minusculas, may para mayusculas o all para las #\n" . "# anteriores con numeros y simbolos (Solo para el modo -b). #\n" . "# - Diccionario: nombre del fichero de tu wordlist (Solo para modo -d).#\n" . "#########################################################################"; exit; } $modo = $argv[1]; $tipoHash = $argv[2]; $hash = $argv[3]; function crackear($hash, $tipoHash, $charset) { if ($charset == "min") { $desde = 97; $hasta = 122; } elseif ($charset == "may") { $desde = 65; $hasta = 90; } elseif ($charset == "all") { $desde = 33; $hasta = 126; } else { echo "Necesitas especificar el Charset: min, may o all."; exit; } echo "Crackeando...\n"; for ($i = $desde; $i <= $hasta; $i++) { for ($j = $desde; $j <= $hasta; $j++) { for ($k = $desde; $k <= $hasta; $k++) { for ($l = $desde; $l <= $hasta; $l++) { $salida = hash($tipoHash, chr($i) . chr($j) . chr($k) . chr($l)); if ($hash == $salida) { echo "Password encontrado: " . chr($i) . chr($j) . chr($k) . chr($l)."\n"; exit; } } } } } } if ($modo == "-d") { $wordlist = $argv[4]; if (file_exists($wordlist)) { $diccionario = file($wordlist); echo "Crackeando...\n"; foreach ($diccionario as $rel) { $salida = hash($tipoHash, $rel); if ($salida == $hash) { echo "El password es: " . $rel; exit; } } } else { echo "El archivo " . $wordlist . " no existe."; exit; } } elseif ($modo == "-b") { $charset = $argv[4]; crackear($hash, $tipoHash, $charset); } echo "Password no encontrado :/ intenta probando con otro tipo de hash, otro charset o diccionario."; } else { echo("Necesitas correr este script desde la consola."); } ?>
El script hace uso de la función hash de PHP, soportando más de 30 tipos de hash como md5, sha1, whirlpool y otros. De momento solo funciona el ataque con 4 caracteres, se pueden agregar más for manualmente para aumentar el número de caracteres pero no es la mejor opción… para la próxima versión prometo arreglar ese detalle utilizando recursividad.
Gracias a PHP, PHPCracker puede correr en diferentes plataformas como iOS o Android.
Mi experiencia luego de utilizar este script: Para optimizar el script se recomienda no estar imprimiendo cadenas de texto porque es ineficiente e innecesario, disminuye mucho la velocidad para terminar el proceso. Se recomienda utilizar recursividad.