Generator hashy z bazą “w chmurze”

Temacik nieco nadmuchany a pomysł prosty – oba moje rozwiązania do łamania hasy (RainbowDB/Hybrid Rainbow DB) korzystają z Google’a jako opcji “last restort” gdy nie mogą nic znaleźć. Ta funkcja jest tym bardziej skuteczna im więcej hashy można znaleźć w Google’u. Ale Googiel idealny nie jest – nie ma ich wszystkich… jeszcze 😉

Postanowiłem pomóc Googlowi być lepszą wyszukiwarką hash’y i stworzyłem prosty generator dla kolejno generowanych haseł. Skrypcik wrzuciłem do kilku darmowych hostingów i pozostało czekać aż dane zaczną się indeksować 🙂

Wynik działania skryptu można zobaczyć choćby tutaj: www.hashe.yoyo.pl

Plik ze źródłem dostępny jest tutaj: hashes.php

Kod można obejrzeć tu:

<html>
<head>
<title>Hash List</title>
</head>
<body>
<div id="content">
<h1>Welcome to Hash List!</h1>

<p>This site will feed search engines with hashes of all common passwords :)</p>

<?
$signs = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890`~!@#$%^&*()-=_+[]\\{}|;':\",./<>?";
$howmany = 500;
#$algos = hash_algos();
$algos = array("md5", "sha1");

$index = !isset($_GET['i']) ? 0 : (int)$_GET['i'];
$array_num = !isset($_GET['n']) ? 1 : (int)$_GET['n'];
$array_num = $array_num > 26 ? 25 : $array_num;

function carthezian_set($index, $count=1) {
    global $signs;
    $lists_len = strlen($signs);
    $string = "";
    
    for($i=0; $i<$count; $i++) {
        $r = $index % $lists_len;
        $index = (int)($index / $lists_len);
        $string = $string . $signs[$r];
    }
    
    return $string; 
}

function hash($alg, $pw) {
	if($alg == 'md5') {
		return md5($pw);
	} elseif($alg == 'sha1') {
		return sha1($pw);
	}
}
?>
<h3>Used signs: <?=$signs?></h3>
<h4>Word length: <?=$array_num?></h4>
<h4>Possible passwords: <?=pow(strlen($signs), $array_num)?></h4>

<?if(($index + $howmany) >= pow(strlen($signs), $array_num)):?>
        <a href="?i=0&n=<?=$array_num+1?>">Next &rsaquo;</a>
<?else:?>
        <a href="?i=<?=$index + $howmany?>&n=<?=$array_num?>">Next &rsaquo;</a>
<?endif?>

<table>
<tr>
<th>Password</th>
<?foreach($algos as $alg):?>
<th><?=strtoupper($alg)?> hash of password</th>
<?endforeach?>
</tr>
<?for($i=$index; $i<$index + $howmany; $i++):?>
	<?if($i < pow(strlen($signs), $array_num)):
		$pw = carthezian_set($i, $array_num);?>
		<tr>
		<td><strong><?=$pw?></strong></td>
		<?foreach($algos as $alg):?>
		<td class="hash"><code><?=hash($alg, $pw)?></code></td>
		<?endforeach?>
		</tr>
	<?endif?>
<?endfor?>
</table>

<br />
<?if(($index + $howmany) >= pow(strlen($signs), $array_num)):?>
	<a href="?i=0&n=<?=$array_num+1?>">Next &rsaquo;</a>
<?else:?>
	<a href="?i=<?=$index + $howmany?>&n=<?=$array_num?>">Next &rsaquo;</a>
<?endif?>
</div>
</body>
</html>

RainbowDB

Pewnego popołudnia przeczytałem artykuł o tęczowych tabelach i pod jego wpływem zacząłem kombinować jak zrobić coś takiego ale swojego.

Do bazy wrzuciłem cały słownik z aspell’a dla języka polskiego (słowa z ogonkami i bez), angielskiego, kilka słowników z popularnymi hasłami, długą listę haseł z yourock i kilka innych. Sporo się nakombinowałem aby wygenerować dużo kombinacji szczególnie pod kątem polskich haseł (wszystkie: misiaczki, dupeczki, itp…) razem z różnymi popularnymi modyfikacjami (typu: misiaczki1, DUPECZKI, etc…). Na tym etapie miałem już wystarczająco dużo haseł aby bawić się dalej.

Zacząłem kombinować z różnymi długościami łańcuchów – niestety funkcja redukująca zmniejszała nieco entropię kolejnych hashy w łańcuchu, co dla długich łańcuchów mocno zmniejszało wydajność przeszukiwania bazy. Ostatecznie postawiłem na bardzo krótkie łańcuchy (a nuż się coś tafi a przynajmniej nie będzie mocno opuźniać wyszukiwań).

Obecnie baza ma ponad 200 milionów haseł i dla nich wygenerowane łańcuchy o długości 10 ogniw. Co daje teoretycznie możliwość sprawdzenia ok 2 miliardów hashy. Wydaje się to sporo ale w stosunku do innych baz dostępnych w sieci jest to kropla w morzu. A co do innych baz… pomyślałem, że skoro ktoś już zrobił taką bazę dobrze to można by to wykorzystać. I tak dorzuciłem funkcję “obsysania” innych bazy hashy w przypadku gdy moja danego hasha nie potrafi rozpoznać. Taki zabieg (którego implementacja zajęła mi 1 popołudnie) wdrożony dla kilku różnych wyszukiwarek znacznie poprawił efektywność rozpoznawania haseł.

Bazę postanowiłem udostępnić w postaci strony www – jak na razie ze stosunkowo liberalnymi zasadami korzystania (czyli bez ograniczeń na liczbę wyszukiwań, konieczności rejestracji itp).

Z bazy można korzystać pod poniższym linkiem:

RainbowDB

Wyłączyłem tą stronkę po dobrych dwóch/trzech latach działania – ruch jest przekierowany na nowy projekt Hybrid Rainbow DB, w którym oprócz tęczowych tablic zaimplementowałem hybrydową tęczową tablicę – nowa aplikacja sprawdza o wiele więcej haseł.