• 🚨 Ещё можно успеть на курс «OSINT: технология боевой разведки» от Академии Кодебай

    🔍 Изучите методы разведки с использованием открытых источников (OSINT) для проведения успешных атак.
    🛠️ Освойте ключевые инструменты, такие как Maltego, TheHarvester и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальную разведку.
    🧠 Развивайте навыки, которые помогут вам стать экспертом в области информационной безопасности.

    Запись открыта до 23 мая Подробнее о курсе ...

Статья Пишем простой брутфорс на PHP

Добрый день уважаемое сообщество codeby.

Данный пост будет стартом серии написания своего брутфорса для авторизации на веб-приложениях на PHP, сколько будет постов пока незнаю, т.к. только начал писать код.
И так, начнем...

Недавно занялся изучением различных процессов авторизации в вэб-приложениях. Начал с теории, такой как HTTP, Cookie, Session, затем принялся за практику. Для простоты взял авторизацию в административную панель Joomla 1.5, версию выбрал специально старую, чтобы было проще углубиться в суть. Установив эту чудо CMS изучил процесс работы, классы, вообщем всё, что отвечает за авторизацию на сайте.

Далее, имея понимание какой запрос нужно отправить на страницу, чтоб получить ответ от сервера, принялся искать готовые решения, дабы не велосипедировать.

Поигравшись BurpSuite'ом, составил правильный запрос, затем взял легендарную в своем роде THC HYDRA, зная правильный пароль, положил его в пасслист и начал подбор. В общем за пару дней работы с гидрой, понял что для ее грамотного и полноценного использования, нужно или быть ее разработчиком или иметь огромный опыт системного администрирования.

После этого я и решил написать свой простой брутфорс, который постепенно усложнять и адаптировать под разные CMS.

Для начала давайте разберемся с тем, какой запрос хочет увидеть Joomla 1.5, чтобы принять решение, авторизовать пользователя или отказать ему.
Стандартная авторизации Joomla 1.5 происходит по адресу example.com/administrator/index.php.

Данная страница принимает параметры методом POST следующего содержания:
Код:
username=admin&passwd=password&lang=&option=com_login&task=login&489c4315d70712e9eac963ba48423ac5=1
Последний параметр, это токен, который формируется нехитрым алгоритмом, который по сути можно просто вытащить из исходников и прилепить внедрить в свою программу для перебора.

Приступим к написанию. Сначала я создал файл options.ini, в корне проекта, который будет хранить всевозможные настройки, содержимое файла такое:
Код:
; url
url = 'http://joomla/administrator/index.php';

; logins
logins = 'logins.txt'

; wordlist
wordlist = 'passwords.txt'

; threads
threads = 1;

; path for temp cookie file
cookie = 'cookie.txt'

; token
token = 'token.txt'

; timeout
timeout = 15

; found
found = 'found.txt'

; error
errorfile = 'errorsAttempt.txt'

; useragents
useragents = 'useragents.txt'

Думаю комментарии тут не нужны, единственное что хочу пояснить, то, что файл cookie.txt и token.txt будет хранить одноименные данные, куки для библиотеки Curl а токен для подстановки в пост каждого запроса авторизации.
Теперь настало время создать сам файл программы, я его назвал checker.php и положил рядом с options.ini.
Также, чуть не забыл, запускать данный скрипт я буду из командной строки, чтобы не ограничивать себя по времени исполнении да и вообще - удобней как-то.
Первым делом нужно проверить включена ли библиотека curl, и если нет, показать пользователю соответствующее сообщение и путь к его папки с extensions.
PHP:
function checkLibrary() {
    if(!in_array('curl', get_loaded_extensions())) {
        exit('Curl is not loaded! Enable curl than restart program. Your extension dir ' . ini_get('extension_dir') . '.'  . PHP_EOL);
    } else {
        echo 'Curl is loaded.' . PHP_EOL;
    }
}
if(!checkLibrary()) { echo 'Programm shutdown' . PHP_EOL; } else { echo 'Starting programm...'; };

Далее, нужно спарсить настройки из файла options.ini, я это сделал это так

PHP:
// INITIALIZE
$data = file_exists('options.ini') ? parse_ini_file("options.ini") : null;
if($data === null) exit('Configuration file is not founded :(. Create options.ini in ' . __DIR__);
define('URL', $data['url']);
define('COOKIE', __DIR__ . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $data['cookie']);
define('TOKEN', __DIR__ . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $data['token']);
define('TIMEOUT', $data['timeout']);
$logins = file_exists($data['logins']) ? file($data['logins'], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) : 'File login not exists';
$passwords = file_exists($data['wordlist']) ? file($data['wordlist'], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) : 'File wordlist not exists';
if($logins == 'File login not exists') exit(PHP_EOL . $logins);
if($passwords == 'File wordlist not exists') exit(PHP_EOL . $passwords);
define('NUMBER_OF_LOGINS', count($logins));
define('NUMBER_OF_PASSWORDS', count($passwords));
define('POSSIBLES', NUMBER_OF_LOGINS * NUMBER_OF_PASSWORDS);
$userAgents = file($data['useragents'], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // TODO
define('NUMBER_OF_USERAGENTS', count($userAgents));
define('FOUNDFILE', $data['found']);
define('ERRORFILE', $data['errorfile']);

В следующем посте, я объясню дополнительно вышеизложенный код, но сначала хочу понять что это вообще кому-то интересно, по-этому на данном статья № 1 завершена, а будет ли продолжение - зависит от голосов читателей.
Спасибо за внимание.
 

Вложения

  • Screenshot_10.png
    Screenshot_10.png
    89 КБ · Просмотры: 726
Что значит Спарсить настройки из файла?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD