logo search
Методические указания для АЗ-ИБ

Атаки на пароли

Обычно пароли не хранятся в открытом виде. Файл, содержащий в открытом виде все пароли, был бы слишком заманчивой целью, поэтому здесь применяется однонаправленная хэш-функция. Самая известная из этих функций основана на DES и называется crypt(). Другими популярными алгоритмами хэширования паролей являются MD5 и Blowfish. Однонаправленная хэш-функция принимает на входе открытый пароль и значение salt (привязки), а выводит значение хэша. которому предшествует введённое значение salt. Хэш-значение математически необратимо, т.е. одного его недостаточно, чтобы определить исходный пароль. В Perl есть устроенная функция crypt(), благодаря чему его удобно применять в илюстративных целях.

#!/usr/bin/perl

$plaintext = "test";

$salt = "je";

$hash = crypt($plaintext, $salt);

print "crypt($plaintext, $salt) = $hash\n";

В следующем листинге с помощью того сценария Perl вычисляются хэш-значения на основе функции crypt() с различными значениями salt.

$ ./hash.pl

crypt(test, je) = jeHEAX1m66RV.

$ perl -e '$hash = crypt("test", "je"); print "$hash\n";'

jeHEAX1m66RV.

$ perl -e '$hash = crypt("test", "xy"); print "$hash\n";'

xyVSuHLjceD92

$

Значение salt предназначено для дополнительного "возмущения" алгоритма, благодаря чему при различных значениях salt получаются разные хэш-значения. Хэш-значения (включая предшествующий salt) записывабются в файл паролей в расчёте, что если атакующий украдёт файл паролей, значения хэшей ничего ему не дадут. При необходимости аутентифицировать парользователя в файле паролей осуществляется поиск хэша. Пользователю предлагается ввести пароль, из файла паролей извлекается значение salt, и введённые пользователем данные вместе со значением salt посылаются на вход той же хэш-функции. Если пользователь ввёл правильный пароль, однонаправленная хэш-функция даст на выходе то же значение, которое записано в файле паролей. Благодаря этому происходит правильная аутентификация, и в то же время не надо хранить пароли в открытом виде.

Однако, зашифрованные пароли не столь уж бесполезны. Несомненно, что математически невозможно получить из хэша исходное значение, но можно весьма быстро сгенерировать хэш-значение ждя каэжлшл имеющегося в словаре слова, взяв значение salt для конкретного хэша, и сравнить с эти хэшем полученные результаты. Если совпадают хэш-значения, то соответствующее словарное слово и будет открытым паролем. Простую программу атаки по словарю можно относительно просто написать на Perl.

Исходный код находится в

http://share.auditory.ru/2006/Andrey.Grunau/ZI/laba2.tar.gz в файле crack.pl Программа читает слова со стандартного ввода и пытется создать для них хэш-значение с наджежащим salt. При обнаружении совпадения слово выводится на экран и сценарий завершает работу.

#!/usr/bin/perl -w

 

use strict;

# Get the hash to crack from the first command-line argument

my $hash = shift;

my $salt = substr($hash,0,2); # The salt is the first 2 chars

 

print "Cracking the hash '$hash' using words from standard input..\n";

while(defined(my $in = <STDIN>)) # Read from standard input

{

chomp $in; # Remove the hard return

if(crypt($in, $salt) eq $hash) # If the hashes match...

{

print "Password is: $in\n"; # Print the password

exit; # and exit.

}

}

print "The password wasn't found in the words from standard input.\n";

$ mkdir tmp

$ cd tmp

$ wget http://share.auditory.ru/2006/Andrey.Grunau/ZI/laba2.tar.gz

$ tar -xzf laba2.tar.gz

$ cat words | ./crack.pl `perl -e '$hash = crypt("hacker", "ja"); print "$hash\n";'`

Cracking the hash 'jaajgvwht60t2' using words from standard input..

Password is: hacker

$