milenium 0.4.0__tar.gz → 0.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {milenium-0.4.0 → milenium-0.4.2}/PKG-INFO +1 -1
- {milenium-0.4.0 → milenium-0.4.2}/milenium/cli.py +102 -51
- milenium-0.4.2/milenium/tui.py +190 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium.egg-info/PKG-INFO +1 -1
- {milenium-0.4.0 → milenium-0.4.2}/pyproject.toml +1 -1
- milenium-0.4.0/milenium/tui.py +0 -69
- {milenium-0.4.0 → milenium-0.4.2}/README.md +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/__init__.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/__init__.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/aggregator.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/breach.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/breach_local.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/dehashed.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/dns_history.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/domain.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/dorker.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/email.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/hibp.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/ip.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/ip_reputation.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/leakcheck.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/logger.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/permutator.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/phone.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/pwned_passwords.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/report.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/shodan_lite.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/social.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/telegram_osint.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium/modules/username.py +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium.egg-info/SOURCES.txt +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium.egg-info/dependency_links.txt +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium.egg-info/entry_points.txt +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium.egg-info/requires.txt +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/milenium.egg-info/top_level.txt +0 -0
- {milenium-0.4.0 → milenium-0.4.2}/setup.cfg +0 -0
|
@@ -1,79 +1,106 @@
|
|
|
1
1
|
import sys
|
|
2
|
+
import json
|
|
2
3
|
import click
|
|
3
4
|
from rich.console import Console
|
|
4
5
|
from rich.table import Table
|
|
5
6
|
from milenium.modules.logger import TeeLogger
|
|
6
|
-
from milenium.modules import
|
|
7
|
+
from milenium.modules import (
|
|
8
|
+
username, email, phone, ip, domain, breach, social, report,
|
|
9
|
+
dorker, pwned_passwords, breach_local, hibp, dehashed, leakcheck,
|
|
10
|
+
aggregator, shodan_lite, ip_reputation, dns_history, telegram_osint,
|
|
11
|
+
)
|
|
12
|
+
from milenium.tui import SESSION, log_result, draw
|
|
7
13
|
|
|
8
14
|
console = Console()
|
|
9
15
|
|
|
16
|
+
|
|
10
17
|
def _init_logger():
|
|
11
18
|
logger = TeeLogger("milenium.log", mode="a")
|
|
12
19
|
sys.stdout = logger
|
|
13
20
|
return logger
|
|
14
21
|
|
|
22
|
+
|
|
23
|
+
def _track(results):
|
|
24
|
+
SESSION["queries"] += 1
|
|
25
|
+
if isinstance(results, dict):
|
|
26
|
+
for v in results.values():
|
|
27
|
+
if isinstance(v, dict) and v.get("found"):
|
|
28
|
+
SESSION["results"] += 1
|
|
29
|
+
log_result(v.get("url", "found"))
|
|
30
|
+
|
|
31
|
+
|
|
15
32
|
@click.group()
|
|
16
33
|
def main():
|
|
17
34
|
"""milenium — OSINT / dox / deanon toolkit"""
|
|
18
35
|
pass
|
|
19
36
|
|
|
20
|
-
@main.command()
|
|
21
|
-
def tui():
|
|
22
|
-
"""Интерактивный TUI-интерфейс"""
|
|
23
|
-
from milenium.tui import interactive
|
|
24
|
-
interactive()
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@main.command()
|
|
28
|
-
@click.argument("channel")
|
|
29
|
-
def telegram(channel):
|
|
30
|
-
"""Парсинг публичного Telegram-канала"""
|
|
31
|
-
logger = _init_logger()
|
|
32
|
-
from milenium.modules import telegram_osint
|
|
33
|
-
res = telegram_osint.check_channel(channel)
|
|
34
|
-
for k, v in res.items():
|
|
35
|
-
console.print(f"[bold]{k}:[/bold] {v}")
|
|
36
|
-
logger.close()
|
|
37
37
|
|
|
38
38
|
@main.command()
|
|
39
39
|
@click.argument("nick")
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
@click.option("--permutations", default=30, help="Сколько вариаций генерить")
|
|
41
|
+
@click.option("--dorks/--no-dorks", default=True, help="Искать через Google Dorks")
|
|
42
|
+
def user(nick, permutations, dorks):
|
|
43
|
+
"""Глубокий поиск по нику + вариации + Google Dorks"""
|
|
42
44
|
logger = _init_logger()
|
|
43
|
-
|
|
45
|
+
lines = [f"=== DEEP SEARCH: {nick} ===", f"Permutations: {permutations}", ""]
|
|
46
|
+
|
|
47
|
+
console.print("[bold cyan]Генерирую вариации...[/bold cyan]")
|
|
48
|
+
results = username.check(nick, permutations=permutations)
|
|
49
|
+
_track(results)
|
|
44
50
|
|
|
45
|
-
table = Table(title=f"Username: {nick}")
|
|
46
|
-
table.add_column("
|
|
47
|
-
table.add_column("
|
|
51
|
+
table = Table(title=f"Username: {nick} (+ {len(results)-1} вариаций)")
|
|
52
|
+
table.add_column("Вариация")
|
|
53
|
+
table.add_column("Сайт")
|
|
54
|
+
table.add_column("Статус")
|
|
48
55
|
table.add_column("URL")
|
|
49
|
-
lines = [f"Username: {nick}"]
|
|
50
56
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
found_count = 0
|
|
58
|
+
for variant, sites in results.items():
|
|
59
|
+
for site, info in sites.items():
|
|
60
|
+
if info["found"]:
|
|
61
|
+
table.add_row(variant, site, "[green]FOUND[/green]", info["url"])
|
|
62
|
+
lines.append(f"{variant}\t{site}\tFOUND\t{info['url']}")
|
|
63
|
+
found_count += 1
|
|
55
64
|
|
|
56
65
|
console.print(table)
|
|
57
|
-
|
|
58
|
-
|
|
66
|
+
console.print(f"[bold green]Найдено: {found_count}[/bold green]")
|
|
67
|
+
lines.append(f"\nTotal found: {found_count}")
|
|
68
|
+
|
|
69
|
+
if dorks:
|
|
70
|
+
console.print("\n[bold cyan]Ищу через Google Dorks...[/bold cyan]")
|
|
71
|
+
dork_results = dorker.search_nick(nick, num=10)
|
|
72
|
+
if dork_results:
|
|
73
|
+
for q, links in dork_results.items():
|
|
74
|
+
console.print(f"\n[bold]{q}[/bold]")
|
|
75
|
+
lines.append(f"\nQUERY: {q}")
|
|
76
|
+
for link in links:
|
|
77
|
+
console.print(f" {link}")
|
|
78
|
+
lines.append(f" {link}")
|
|
79
|
+
else:
|
|
80
|
+
console.print("[yellow]Serper API не настроен[/yellow]")
|
|
81
|
+
|
|
82
|
+
path = report.save_text(lines, name=f"deep_{nick}")
|
|
83
|
+
console.print(f"\n[bold cyan]Отчёт:[/bold cyan] {path}")
|
|
59
84
|
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
60
85
|
logger.close()
|
|
61
86
|
|
|
87
|
+
|
|
62
88
|
@main.command()
|
|
63
89
|
@click.argument("mail")
|
|
64
90
|
def mail(mail):
|
|
65
|
-
"""Проверка email: MX,
|
|
91
|
+
"""Проверка email: MX, HIBP, Gravatar"""
|
|
66
92
|
logger = _init_logger()
|
|
67
93
|
results = email.check(mail)
|
|
94
|
+
_track(results)
|
|
68
95
|
lines = [f"Email: {mail}"]
|
|
69
96
|
for k, v in results.items():
|
|
70
97
|
console.print(f"[bold]{k}:[/bold] {v}")
|
|
71
98
|
lines.append(f"{k}: {v}")
|
|
72
99
|
path = report.save_text(lines, name=f"mail_{mail.split('@')[0]}")
|
|
73
|
-
console.print(f"\n[bold cyan]
|
|
74
|
-
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
100
|
+
console.print(f"\n[bold cyan]Отчёт:[/bold cyan] {path}")
|
|
75
101
|
logger.close()
|
|
76
102
|
|
|
103
|
+
|
|
77
104
|
@main.command()
|
|
78
105
|
@click.argument("number")
|
|
79
106
|
def phone_cmd(number):
|
|
@@ -85,42 +112,45 @@ def phone_cmd(number):
|
|
|
85
112
|
console.print(f"[bold]{k}:[/bold] {v}")
|
|
86
113
|
lines.append(f"{k}: {v}")
|
|
87
114
|
path = report.save_text(lines, name=f"phone_{number.replace('+','')}")
|
|
88
|
-
console.print(f"\n[bold cyan]
|
|
89
|
-
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
115
|
+
console.print(f"\n[bold cyan]Отчёт:[/bold cyan] {path}")
|
|
90
116
|
logger.close()
|
|
91
117
|
|
|
118
|
+
|
|
92
119
|
@main.command()
|
|
93
120
|
@click.argument("address")
|
|
94
121
|
def ip_cmd(address):
|
|
95
122
|
"""Гео, ASN, reverse DNS, Shodan, репутация"""
|
|
96
123
|
logger = _init_logger()
|
|
97
|
-
|
|
98
|
-
results = ip_mod.check(address)
|
|
124
|
+
results = ip.check(address)
|
|
99
125
|
results["shodan"] = shodan_lite.check_ip(address)
|
|
100
126
|
results["reputation"] = ip_reputation.check(address)
|
|
101
|
-
|
|
127
|
+
_track(results)
|
|
128
|
+
lines = [f"IP: {address}"]
|
|
102
129
|
for k, v in results.items():
|
|
103
130
|
console.print(f"[bold]{k}:[/bold] {v}")
|
|
104
|
-
|
|
131
|
+
lines.append(f"{k}: {v}")
|
|
132
|
+
path = report.save_text(lines, name=f"ip_{address.replace('.','_')}")
|
|
105
133
|
console.print(f"\n[bold cyan]Отчёт:[/bold cyan] {path}")
|
|
106
|
-
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
107
134
|
logger.close()
|
|
108
135
|
|
|
136
|
+
|
|
109
137
|
@main.command()
|
|
110
138
|
@click.argument("host")
|
|
111
139
|
def dom(host):
|
|
112
|
-
"""WHOIS, DNS, subdomains
|
|
140
|
+
"""WHOIS, DNS, subdomains, crt.sh"""
|
|
113
141
|
logger = _init_logger()
|
|
114
142
|
results = domain.check(host)
|
|
143
|
+
results["crt"] = dns_history.check(host)
|
|
144
|
+
_track(results)
|
|
115
145
|
lines = [f"Domain: {host}"]
|
|
116
146
|
for k, v in results.items():
|
|
117
147
|
console.print(f"[bold]{k}:[/bold] {v}")
|
|
118
148
|
lines.append(f"{k}: {v}")
|
|
119
149
|
path = report.save_text(lines, name=f"dom_{host.replace('.','_')}")
|
|
120
|
-
console.print(f"\n[bold cyan]
|
|
121
|
-
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
150
|
+
console.print(f"\n[bold cyan]Отчёт:[/bold cyan] {path}")
|
|
122
151
|
logger.close()
|
|
123
152
|
|
|
153
|
+
|
|
124
154
|
@main.command()
|
|
125
155
|
@click.argument("query")
|
|
126
156
|
def leaks(query):
|
|
@@ -132,32 +162,32 @@ def leaks(query):
|
|
|
132
162
|
console.print(f"[bold]{k}:[/bold] {v}")
|
|
133
163
|
lines.append(f"{k}: {v}")
|
|
134
164
|
path = report.save_text(lines, name=f"leaks_{query.split('@')[0]}")
|
|
135
|
-
console.print(f"\n[bold cyan]
|
|
136
|
-
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
165
|
+
console.print(f"\n[bold cyan]Отчёт:[/bold cyan] {path}")
|
|
137
166
|
logger.close()
|
|
138
167
|
|
|
168
|
+
|
|
139
169
|
@main.command()
|
|
140
170
|
@click.argument("nick")
|
|
141
171
|
def social_cmd(nick):
|
|
142
172
|
"""Поиск соцсетей по нику"""
|
|
143
173
|
logger = _init_logger()
|
|
144
174
|
results = social.check(nick)
|
|
175
|
+
_track(results)
|
|
145
176
|
lines = [f"Social: {nick}"]
|
|
146
177
|
for site, info in results.items():
|
|
147
178
|
status = "FOUND" if info["found"] else "NO"
|
|
148
179
|
console.print(f"[bold]{site}:[/bold] {status} — {info['url']}")
|
|
149
180
|
lines.append(f"{site}\t{status}\t{info['url']}")
|
|
150
181
|
path = report.save_text(lines, name=f"social_{nick}")
|
|
151
|
-
console.print(f"\n[bold cyan]
|
|
152
|
-
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
182
|
+
console.print(f"\n[bold cyan]Отчёт:[/bold cyan] {path}")
|
|
153
183
|
logger.close()
|
|
154
184
|
|
|
185
|
+
|
|
155
186
|
@main.command()
|
|
156
187
|
@click.argument("password")
|
|
157
188
|
def pwned(password):
|
|
158
189
|
"""Проверить пароль через Pwned Passwords (бесплатно)"""
|
|
159
190
|
logger = _init_logger()
|
|
160
|
-
from milenium.modules import pwned_passwords
|
|
161
191
|
res = pwned_passwords.check_password(password)
|
|
162
192
|
if res.get("pwned"):
|
|
163
193
|
console.print(f"[red]ПАРОЛЬ В УТЕЧКАХ[/red] — встречается {res['count']} раз")
|
|
@@ -168,6 +198,17 @@ def pwned(password):
|
|
|
168
198
|
logger.close()
|
|
169
199
|
|
|
170
200
|
|
|
201
|
+
@main.command()
|
|
202
|
+
@click.argument("channel")
|
|
203
|
+
def telegram(channel):
|
|
204
|
+
"""Парсинг публичного Telegram-канала"""
|
|
205
|
+
logger = _init_logger()
|
|
206
|
+
res = telegram_osint.check_channel(channel)
|
|
207
|
+
for k, v in res.items():
|
|
208
|
+
console.print(f"[bold]{k}:[/bold] {v}")
|
|
209
|
+
logger.close()
|
|
210
|
+
|
|
211
|
+
|
|
171
212
|
@main.command()
|
|
172
213
|
@click.option("--email", default=None)
|
|
173
214
|
@click.option("--username", default=None)
|
|
@@ -177,8 +218,6 @@ def pwned(password):
|
|
|
177
218
|
def full(email, username, phone, password, db_path):
|
|
178
219
|
"""Агрегатор: гоняет запрос по всем модулям"""
|
|
179
220
|
logger = _init_logger()
|
|
180
|
-
from milenium.modules import aggregator
|
|
181
|
-
import json
|
|
182
221
|
res = aggregator.run(email=email, username=username, phone=phone,
|
|
183
222
|
password=password, db_path=db_path)
|
|
184
223
|
console.print(json.dumps(res, indent=2, ensure_ascii=False))
|
|
@@ -187,5 +226,17 @@ def full(email, username, phone, password, db_path):
|
|
|
187
226
|
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
188
227
|
logger.close()
|
|
189
228
|
|
|
229
|
+
|
|
230
|
+
@main.command()
|
|
231
|
+
def tui():
|
|
232
|
+
"""Интерактивный TUI-интерфейс"""
|
|
233
|
+
interactive()
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def interactive():
|
|
237
|
+
from milenium.tui import interactive as tui_interactive
|
|
238
|
+
tui_interactive()
|
|
239
|
+
|
|
240
|
+
|
|
190
241
|
if __name__ == "__main__":
|
|
191
242
|
main()
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from rich.console import Console
|
|
4
|
+
from rich.layout import Layout
|
|
5
|
+
from rich.panel import Panel
|
|
6
|
+
from rich.text import Text
|
|
7
|
+
from rich.table import Table
|
|
8
|
+
from rich.align import Align
|
|
9
|
+
from rich.live import Live
|
|
10
|
+
from rich.prompt import Prompt
|
|
11
|
+
|
|
12
|
+
console = Console()
|
|
13
|
+
|
|
14
|
+
ASCII_LOGO = r"""
|
|
15
|
+
[bold red]
|
|
16
|
+
███╗ ███╗ ██╗ ██╗ ███████╗ ███╗ ██╗ ██╗ ██╗ ██╗ ███╗ ███╗
|
|
17
|
+
████╗ ████║ ██║ ██║ ██╔════╝ ████╗ ██║ ██║ ██║ ██║ ████╗ ████║
|
|
18
|
+
██╔████╔██║ ██║ ██║ █████╗ ██╔██╗ ██║ ██║ ██║ ██║ ██╔████╔██║
|
|
19
|
+
██║╚██╔╝██║ ██║ ██║ ██╔══╝ ██║╚██╗██║ ██║ ██║ ██║ ██║╚██╔╝██║
|
|
20
|
+
██║ ╚═╝ ██║ ██║ ███████╗ ███████╗ ██║ ╚████║ ██║ ╚██████╔╝ ██║ ╚═╝ ██║
|
|
21
|
+
╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚══════╝ ╚═╝ ╚═══╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
|
|
22
|
+
[/bold red]
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
BANNER = """
|
|
26
|
+
[bold red]╔══════════════════════════════════════════════════════════════════════════╗
|
|
27
|
+
║ [bold white]MILENIUM[/bold white] [red]|[/red] [bold white]DESIGNED BY[/bold white] [red]@VexxDev200[/red] ║
|
|
28
|
+
║ [red]|[/red] [bold white]TG:[/bold white] [red]@milenium[/red] [red]|[/red] [bold white]DC:[/bold white] [red]milenium[/red] [red]|[/red] [bold white]STATUS:[/bold white] [green]● ONLINE[/green] ║
|
|
29
|
+
╚══════════════════════════════════════════════════════════════════════════╝[/bold red]
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
MENU_ITEMS = [
|
|
33
|
+
("1", "user <ник>", "Поиск по соцсетям + вариации"),
|
|
34
|
+
("2", "mail <email>", "MX, HIBP, Gravatar"),
|
|
35
|
+
("3", "phone_cmd <номер>", "Оператор, страна"),
|
|
36
|
+
("4", "ip_cmd <IP>", "Гео, ASN, Shodan"),
|
|
37
|
+
("5", "dom <домен>", "WHOIS, DNS, crt.sh"),
|
|
38
|
+
("6", "leaks <email>", "Утечки HIBP"),
|
|
39
|
+
("7", "social_cmd <ник>", "Соцсети"),
|
|
40
|
+
("8", "pwned <пароль>", "Проверка пароля"),
|
|
41
|
+
("9", "telegram <канал>", "Парсинг TG"),
|
|
42
|
+
("A", "full --email ...", "Агрегатор"),
|
|
43
|
+
("T", "tui", "Этот интерфейс"),
|
|
44
|
+
("Q", "exit", "Выход"),
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
SESSION = {
|
|
48
|
+
"start": datetime.now(),
|
|
49
|
+
"queries": 0,
|
|
50
|
+
"results": 0,
|
|
51
|
+
"last": [],
|
|
52
|
+
"db_path": None,
|
|
53
|
+
"db_loaded": False,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def log_result(text):
|
|
58
|
+
ts = datetime.now().strftime("%H:%M:%S")
|
|
59
|
+
SESSION["last"].append(f"[red]{ts}[/red] {text}")
|
|
60
|
+
if len(SESSION["last"]) > 15:
|
|
61
|
+
SESSION["last"].pop(0)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def build_layout():
|
|
65
|
+
layout = Layout()
|
|
66
|
+
layout.split_column(
|
|
67
|
+
Layout(name="header", size=10),
|
|
68
|
+
Layout(name="body"),
|
|
69
|
+
Layout(name="footer", size=3),
|
|
70
|
+
)
|
|
71
|
+
layout["body"].split_row(
|
|
72
|
+
Layout(name="left", ratio=1),
|
|
73
|
+
Layout(name="center", ratio=2),
|
|
74
|
+
Layout(name="right", ratio=1),
|
|
75
|
+
)
|
|
76
|
+
return layout
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def render_header():
|
|
80
|
+
logo = Text.from_markup(ASCII_LOGO)
|
|
81
|
+
banner = Text.from_markup(BANNER)
|
|
82
|
+
return Panel(
|
|
83
|
+
Align.center(logo + banner),
|
|
84
|
+
border_style="red",
|
|
85
|
+
title="[bold red]MILENIUM[/bold red]",
|
|
86
|
+
subtitle="[red]v0.4.2[/red]",
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def render_left():
|
|
91
|
+
table = Table(show_header=False, box=None, padding=(0, 1))
|
|
92
|
+
table.add_column("Key", style="bold red")
|
|
93
|
+
table.add_column("Cmd", style="bold white")
|
|
94
|
+
for key, cmd, _ in MENU_ITEMS:
|
|
95
|
+
table.add_row(f"[{key}]", cmd)
|
|
96
|
+
return Panel(
|
|
97
|
+
table,
|
|
98
|
+
title="[bold red]МЕНЮ[/bold red]",
|
|
99
|
+
border_style="red",
|
|
100
|
+
subtitle="[red]выбери команду[/red]",
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def render_center():
|
|
105
|
+
lines = []
|
|
106
|
+
lines.append("[bold red]=== СТАТИСТИКА СЕССИИ ===[/bold red]")
|
|
107
|
+
uptime = datetime.now() - SESSION["start"]
|
|
108
|
+
mins, secs = divmod(int(uptime.total_seconds()), 60)
|
|
109
|
+
lines.append(f"[white]Uptime:[/white] [red]{mins:02d}:{secs:02d}[/red]")
|
|
110
|
+
lines.append(f"[white]Запросов:[/white] [red]{SESSION['queries']}[/red]")
|
|
111
|
+
lines.append(f"[white]Найдено:[/white] [red]{SESSION['results']}[/red]")
|
|
112
|
+
lines.append(f"[white]База:[/white] [red]{'LOADED' if SESSION['db_loaded'] else 'NOT LOADED'}[/red]")
|
|
113
|
+
lines.append("")
|
|
114
|
+
lines.append("[bold red]=== ПОСЛЕДНИЕ РЕЗУЛЬТАТЫ ===[/bold red]")
|
|
115
|
+
if SESSION["last"]:
|
|
116
|
+
lines.extend(SESSION["last"])
|
|
117
|
+
else:
|
|
118
|
+
lines.append("[white]Пока ничего. Запусти команду.[/white]")
|
|
119
|
+
return Panel(
|
|
120
|
+
"\n".join(lines),
|
|
121
|
+
title="[bold red]СЕССИЯ[/bold red]",
|
|
122
|
+
border_style="red",
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def render_right():
|
|
127
|
+
lines = []
|
|
128
|
+
lines.append("[bold red]СОСТОЯНИЕ МОДУЛЕЙ:[/bold red]")
|
|
129
|
+
lines.append("")
|
|
130
|
+
lines.append("[white]whois:[/white] [green]OK[/green]")
|
|
131
|
+
lines.append("[white]dns:[/white] [green]OK[/green]")
|
|
132
|
+
lines.append("[white]requests:[/white] [green]OK[/green]")
|
|
133
|
+
lines.append("[white]rich:[/white] [green]OK[/green]")
|
|
134
|
+
lines.append("[white]click:[/white] [green]OK[/green]")
|
|
135
|
+
lines.append("[white]phonenumbers:[/white][green]OK[/green]")
|
|
136
|
+
lines.append("[white]bs4:[/white] [green]OK[/green]")
|
|
137
|
+
lines.append("")
|
|
138
|
+
lines.append("[bold red]API-КЛЮЧИ:[/bold red]")
|
|
139
|
+
lines.append("[white]HIBP:[/white] [red]NOT SET[/red]")
|
|
140
|
+
lines.append("[white]DeHashed:[/white] [red]NOT SET[/red]")
|
|
141
|
+
lines.append("[white]LeakCheck:[/white] [red]NOT SET[/red]")
|
|
142
|
+
lines.append("[white]Serper:[/white] [red]NOT SET[/red]")
|
|
143
|
+
return Panel(
|
|
144
|
+
"\n".join(lines),
|
|
145
|
+
title="[bold red]СТАТУС[/bold red]",
|
|
146
|
+
border_style="red",
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def render_footer():
|
|
151
|
+
return Panel(
|
|
152
|
+
Align.center("[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]|[/white] [green]SYSTEM READY[/green]"),
|
|
153
|
+
border_style="red",
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def draw():
|
|
158
|
+
layout = build_layout()
|
|
159
|
+
layout["header"].update(render_header())
|
|
160
|
+
layout["left"].update(render_left())
|
|
161
|
+
layout["center"].update(render_center())
|
|
162
|
+
layout["right"].update(render_right())
|
|
163
|
+
layout["footer"].update(render_footer())
|
|
164
|
+
return layout
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def interactive():
|
|
168
|
+
console.clear()
|
|
169
|
+
with Live(draw(), refresh_per_second=4, screen=True) as live:
|
|
170
|
+
while True:
|
|
171
|
+
try:
|
|
172
|
+
cmd = Prompt.ask("[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]~[/white]")
|
|
173
|
+
if cmd.strip().lower() in ("exit", "quit", "q"):
|
|
174
|
+
break
|
|
175
|
+
if not cmd.strip():
|
|
176
|
+
continue
|
|
177
|
+
SESSION["queries"] += 1
|
|
178
|
+
import shlex
|
|
179
|
+
from milenium.cli import main
|
|
180
|
+
args = shlex.split(cmd)
|
|
181
|
+
try:
|
|
182
|
+
main(args, standalone_mode=False)
|
|
183
|
+
except SystemExit:
|
|
184
|
+
pass
|
|
185
|
+
except Exception as e:
|
|
186
|
+
console.print(f"[bold red]Ошибка:[/bold red] {e}")
|
|
187
|
+
live.update(draw())
|
|
188
|
+
except KeyboardInterrupt:
|
|
189
|
+
break
|
|
190
|
+
console.clear()
|
milenium-0.4.0/milenium/tui.py
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
from rich.console import Console
|
|
2
|
-
from rich.panel import Panel
|
|
3
|
-
from rich.table import Table
|
|
4
|
-
from rich.prompt import Prompt
|
|
5
|
-
from rich.text import Text
|
|
6
|
-
from rich.align import Align
|
|
7
|
-
|
|
8
|
-
console = Console()
|
|
9
|
-
|
|
10
|
-
BANNER = """
|
|
11
|
-
[bold cyan]
|
|
12
|
-
███╗ ███╗██╗██╗ ███████╗███╗ ██╗██╗██╗ ██╗███╗ ███╗
|
|
13
|
-
████╗ ████║██║██║ ██╔════╝████╗ ██║██║██║ ██║████╗ ████║
|
|
14
|
-
██╔████╔██║██║██║ █████╗ ██╔██╗ ██║██║██║ ██║██╔████╔██║
|
|
15
|
-
██║╚██╔╝██║██║██║ ██╔══╝ ██║╚██╗██║██║██║ ██║██║╚██╔╝██║
|
|
16
|
-
██║ ╚═╝ ██║██║███████╗███████╗██║ ╚████║██║╚██████╔╝██║ ╚═╝ ██║
|
|
17
|
-
╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚═╝ ╚═══╝╚═╝ ╚═════╝ ╚═╝ ╚═╝
|
|
18
|
-
[/bold cyan]
|
|
19
|
-
[bold green] OSINT / DOX / DEANON TOOLKIT v0.4.0[/bold green]
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
def show_banner():
|
|
23
|
-
console.print(BANNER)
|
|
24
|
-
|
|
25
|
-
def show_menu():
|
|
26
|
-
table = Table(title="[bold]Команды[/bold]", show_header=True, header_style="bold magenta")
|
|
27
|
-
table.add_column("Команда", style="cyan")
|
|
28
|
-
table.add_column("Описание", style="white")
|
|
29
|
-
rows = [
|
|
30
|
-
("user <ник>", "Поиск по 17+ соцсетям + вариации + Google Dorks"),
|
|
31
|
-
("mail <email>", "MX, HIBP, Gravatar"),
|
|
32
|
-
("phone_cmd <номер>", "Оператор, страна, часовой пояс"),
|
|
33
|
-
("ip_cmd <IP>", "Гео, ASN, reverse DNS, Shodan, репутация"),
|
|
34
|
-
("dom <домен>", "WHOIS, DNS, subdomains, crt.sh"),
|
|
35
|
-
("leaks <email>", "HIBP утечки"),
|
|
36
|
-
("social_cmd <ник>", "Поиск соцсетей"),
|
|
37
|
-
("pwned <пароль>", "Проверка пароля в утечках (бесплатно)"),
|
|
38
|
-
("full --email ... --username ... --password ...", "Агрегатор всех модулей"),
|
|
39
|
-
("telegram <канал>", "Парсинг публичного Telegram-канала"),
|
|
40
|
-
]
|
|
41
|
-
for cmd, desc in rows:
|
|
42
|
-
table.add_row(cmd, desc)
|
|
43
|
-
console.print(table)
|
|
44
|
-
|
|
45
|
-
def interactive():
|
|
46
|
-
show_banner()
|
|
47
|
-
show_menu()
|
|
48
|
-
console.print("\n[bold yellow]Введи команду (или 'exit'):[/bold yellow]")
|
|
49
|
-
while True:
|
|
50
|
-
try:
|
|
51
|
-
cmd = Prompt.ask("[bold cyan]milenium[/bold cyan]")
|
|
52
|
-
if cmd.strip().lower() in ("exit", "quit", "q"):
|
|
53
|
-
console.print("[bold red]Выход.[/bold red]")
|
|
54
|
-
break
|
|
55
|
-
if not cmd.strip():
|
|
56
|
-
continue
|
|
57
|
-
# Парсим как CLI
|
|
58
|
-
import shlex
|
|
59
|
-
from milenium.cli import main
|
|
60
|
-
args = shlex.split(cmd)
|
|
61
|
-
try:
|
|
62
|
-
main(args, standalone_mode=False)
|
|
63
|
-
except SystemExit:
|
|
64
|
-
pass
|
|
65
|
-
except Exception as e:
|
|
66
|
-
console.print(f"[bold red]Ошибка:[/bold red] {e}")
|
|
67
|
-
except KeyboardInterrupt:
|
|
68
|
-
console.print("\n[bold red]Прервано.[/bold red]")
|
|
69
|
-
break
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|