milenium 0.5.0__tar.gz → 0.5.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.5.0 → milenium-0.5.2}/PKG-INFO +1 -1
- {milenium-0.5.0 → milenium-0.5.2}/milenium/tui.py +101 -72
- {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/PKG-INFO +1 -1
- {milenium-0.5.0 → milenium-0.5.2}/pyproject.toml +1 -1
- {milenium-0.5.0 → milenium-0.5.2}/README.md +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/__init__.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/cli.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/__init__.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/aggregator.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/breach.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/breach_local.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/dehashed.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/dns_history.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/domain.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/dorker.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/email.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/email_validator.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/exif_extractor.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/github_search.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/gravatar.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/hibp.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/instagram_osint.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/ip.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/ip_geo_advanced.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/ip_reputation.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/leakcheck.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/logger.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/password_pattern.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/permutator.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/pgp_lookup.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/phone.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/pwned_passwords.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/report.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/reverse_whois.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/shodan_lite.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/social.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/telegram_osint.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/tg_parser.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/twitter_osint.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/username.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/vk_osint.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/wayback.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/wifi_geolocation.py +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/SOURCES.txt +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/dependency_links.txt +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/entry_points.txt +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/requires.txt +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/top_level.txt +0 -0
- {milenium-0.5.0 → milenium-0.5.2}/setup.cfg +0 -0
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import sys
|
|
2
|
+
import shlex
|
|
3
|
+
import io
|
|
4
|
+
import contextlib
|
|
2
5
|
from datetime import datetime
|
|
3
6
|
from rich.console import Console
|
|
4
7
|
from rich.layout import Layout
|
|
@@ -29,20 +32,41 @@ BANNER = """
|
|
|
29
32
|
╚══════════════════════════════════════════════════════════════════════════╝[/bold red]
|
|
30
33
|
"""
|
|
31
34
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
]
|
|
35
|
+
# Все команды с категориями
|
|
36
|
+
COMMANDS = {
|
|
37
|
+
"ПОИСК ЛЮДЕЙ": [
|
|
38
|
+
("user <ник> [--permutations N] [--dorks]", "Глубокий поиск по нику + вариации + Google Dorks"),
|
|
39
|
+
("social_cmd <ник>", "Поиск соцсетей по нику"),
|
|
40
|
+
("email_check <email>", "SMTP + Gravatar + PGP + GitHub по email"),
|
|
41
|
+
("mail <email>", "MX, HIBP, Gravatar"),
|
|
42
|
+
("phone_cmd <номер>", "Оператор, страна, часовой пояс"),
|
|
43
|
+
("telegram <канал>", "Парсинг публичного Telegram-канала"),
|
|
44
|
+
],
|
|
45
|
+
"УТЕЧКИ И ПАРОЛИ": [
|
|
46
|
+
("pwned <пароль>", "Проверка пароля в утечках (бесплатно)"),
|
|
47
|
+
("leaks <email>", "HIBP утечки"),
|
|
48
|
+
("pwgen [--name N] [--surname S] [--year Y] [--nick N]", "Генератор вероятных паролей"),
|
|
49
|
+
("full [--email E] [--username U] [--phone P] [--password PW]", "Агрегатор всех модулей"),
|
|
50
|
+
],
|
|
51
|
+
"СЕТЬ И ДОМЕНЫ": [
|
|
52
|
+
("ip_cmd <IP>", "Гео, ASN, reverse DNS, Shodan, репутация"),
|
|
53
|
+
("dom <домен>", "WHOIS, DNS, subdomains, crt.sh"),
|
|
54
|
+
("whois_rev <домен>", "Reverse WHOIS"),
|
|
55
|
+
("ssl_info <host>", "SSL-сертификат: издатель, даты, SAN"),
|
|
56
|
+
("robots <домен>", "robots.txt + sitemap"),
|
|
57
|
+
("subdomains <домен>", "Перебор поддоменов"),
|
|
58
|
+
],
|
|
59
|
+
"ФАЙЛЫ И МЕТАДАННЫЕ": [
|
|
60
|
+
("exif <path>", "EXIF/GPS из фото"),
|
|
61
|
+
("pdf_meta <path>", "Метаданные PDF"),
|
|
62
|
+
("eml <path>", "Анализ заголовков письма"),
|
|
63
|
+
("wayback <url>", "Wayback Machine"),
|
|
64
|
+
],
|
|
65
|
+
"ИНТЕРФЕЙС": [
|
|
66
|
+
("tui", "Этот интерфейс"),
|
|
67
|
+
("exit / q", "Выход"),
|
|
68
|
+
],
|
|
69
|
+
}
|
|
46
70
|
|
|
47
71
|
SESSION = {
|
|
48
72
|
"start": datetime.now(),
|
|
@@ -53,6 +77,15 @@ SESSION = {
|
|
|
53
77
|
"db_loaded": False,
|
|
54
78
|
}
|
|
55
79
|
|
|
80
|
+
OUTPUT_LOG = []
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def push_output(text):
|
|
84
|
+
ts = datetime.now().strftime("%H:%M:%S")
|
|
85
|
+
OUTPUT_LOG.append(f"[red]{ts}[/red] [white]{text}[/white]")
|
|
86
|
+
if len(OUTPUT_LOG) > 50:
|
|
87
|
+
OUTPUT_LOG.pop(0)
|
|
88
|
+
|
|
56
89
|
|
|
57
90
|
def log_result(text):
|
|
58
91
|
ts = datetime.now().strftime("%H:%M:%S")
|
|
@@ -64,55 +97,39 @@ def log_result(text):
|
|
|
64
97
|
def build_layout():
|
|
65
98
|
layout = Layout()
|
|
66
99
|
layout.split_column(
|
|
67
|
-
Layout(name="header", size=
|
|
68
|
-
Layout(name="body"),
|
|
100
|
+
Layout(name="header", size=9),
|
|
101
|
+
Layout(name="body", ratio=3),
|
|
102
|
+
Layout(name="output", size=12),
|
|
69
103
|
Layout(name="input", size=3),
|
|
70
104
|
Layout(name="footer", size=3),
|
|
71
105
|
)
|
|
72
106
|
layout["body"].split_row(
|
|
73
|
-
Layout(name="left", ratio=
|
|
107
|
+
Layout(name="left", ratio=2),
|
|
74
108
|
Layout(name="center", ratio=2),
|
|
75
109
|
Layout(name="right", ratio=1),
|
|
76
110
|
)
|
|
77
111
|
return layout
|
|
78
112
|
|
|
79
113
|
|
|
80
|
-
def render_input():
|
|
81
|
-
return Panel(
|
|
82
|
-
"[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]~[/white] [bold white]введи команду ниже[/bold white]",
|
|
83
|
-
title="[bold red]ВВОД[/bold red]",
|
|
84
|
-
border_style="red",
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
|
|
88
114
|
def render_header():
|
|
89
115
|
logo = Text.from_markup(ASCII_LOGO)
|
|
90
116
|
banner = Text.from_markup(BANNER)
|
|
91
|
-
return Panel(
|
|
92
|
-
Align.center(logo + banner),
|
|
93
|
-
border_style="red",
|
|
94
|
-
title="[bold red]MILENIUM[/bold red]",
|
|
95
|
-
subtitle="[red]v0.4.2[/red]",
|
|
96
|
-
)
|
|
117
|
+
return Panel(Align.center(logo + banner), border_style="red", title="[bold red]MILENIUM[/bold red]", subtitle="[red]v0.5.2[/red]")
|
|
97
118
|
|
|
98
119
|
|
|
99
|
-
def
|
|
100
|
-
table = Table(show_header=
|
|
101
|
-
table.add_column("
|
|
102
|
-
table.add_column("
|
|
103
|
-
for
|
|
104
|
-
table.add_row(f"[{
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
border_style="red",
|
|
109
|
-
subtitle="[red]выбери команду[/red]",
|
|
110
|
-
)
|
|
120
|
+
def render_commands():
|
|
121
|
+
table = Table(show_header=True, box=None, padding=(0, 1), header_style="bold red")
|
|
122
|
+
table.add_column("Команда", style="bold white")
|
|
123
|
+
table.add_column("Описание", style="red")
|
|
124
|
+
for category, cmds in COMMANDS.items():
|
|
125
|
+
table.add_row(f"[bold red]━━ {category} ━━[/bold red]", "")
|
|
126
|
+
for cmd, desc in cmds:
|
|
127
|
+
table.add_row(f"[white]{cmd}[/white]", f"[red]{desc}[/red]")
|
|
128
|
+
return Panel(table, title="[bold red]ВСЕ КОМАНДЫ[/bold red]", border_style="red")
|
|
111
129
|
|
|
112
130
|
|
|
113
|
-
def
|
|
131
|
+
def render_session():
|
|
114
132
|
lines = []
|
|
115
|
-
lines.append("[bold red]=== СТАТИСТИКА СЕССИИ ===[/bold red]")
|
|
116
133
|
uptime = datetime.now() - SESSION["start"]
|
|
117
134
|
mins, secs = divmod(int(uptime.total_seconds()), 60)
|
|
118
135
|
lines.append(f"[white]Uptime:[/white] [red]{mins:02d}:{secs:02d}[/red]")
|
|
@@ -124,41 +141,45 @@ def render_center():
|
|
|
124
141
|
if SESSION["last"]:
|
|
125
142
|
lines.extend(SESSION["last"])
|
|
126
143
|
else:
|
|
127
|
-
lines.append("[white]Пока ничего.
|
|
128
|
-
return Panel(
|
|
129
|
-
"\n".join(lines),
|
|
130
|
-
title="[bold red]СЕССИЯ[/bold red]",
|
|
131
|
-
border_style="red",
|
|
132
|
-
)
|
|
144
|
+
lines.append("[white]Пока ничего.[/white]")
|
|
145
|
+
return Panel("\n".join(lines), title="[bold red]СЕССИЯ[/bold red]", border_style="red")
|
|
133
146
|
|
|
134
147
|
|
|
135
|
-
def
|
|
148
|
+
def render_status():
|
|
136
149
|
lines = []
|
|
137
|
-
lines.append("[bold red]
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
lines.append("[white]dns:[/white] [green]OK[/green]")
|
|
141
|
-
lines.append("[white]requests:[/white] [green]OK[/green]")
|
|
142
|
-
lines.append("[white]rich:[/white] [green]OK[/green]")
|
|
143
|
-
lines.append("[white]click:[/white] [green]OK[/green]")
|
|
144
|
-
lines.append("[white]phonenumbers:[/white][green]OK[/green]")
|
|
145
|
-
lines.append("[white]bs4:[/white] [green]OK[/green]")
|
|
150
|
+
lines.append("[bold red]МОДУЛИ:[/bold red]")
|
|
151
|
+
for m in ["whois", "dns", "requests", "rich", "click", "phonenumbers", "bs4"]:
|
|
152
|
+
lines.append(f"[white]{m}:[/white] [green]OK[/green]")
|
|
146
153
|
lines.append("")
|
|
147
154
|
lines.append("[bold red]API-КЛЮЧИ:[/bold red]")
|
|
148
155
|
lines.append("[white]HIBP:[/white] [red]NOT SET[/red]")
|
|
149
156
|
lines.append("[white]DeHashed:[/white] [red]NOT SET[/red]")
|
|
150
157
|
lines.append("[white]LeakCheck:[/white] [red]NOT SET[/red]")
|
|
151
158
|
lines.append("[white]Serper:[/white] [red]NOT SET[/red]")
|
|
159
|
+
lines.append("[white]Shodan:[/white] [red]NOT SET[/red]")
|
|
160
|
+
return Panel("\n".join(lines), title="[bold red]СТАТУС[/bold red]", border_style="red")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def render_output():
|
|
164
|
+
lines = ["[bold red]=== ПРОЦЕСС ===[/bold red]"]
|
|
165
|
+
if OUTPUT_LOG:
|
|
166
|
+
lines.extend(OUTPUT_LOG[-10:])
|
|
167
|
+
else:
|
|
168
|
+
lines.append("[white]Введи команду ниже.[/white]")
|
|
169
|
+
return Panel("\n".join(lines), title="[bold red]ВЫВОД[/bold red]", border_style="red")
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def render_input():
|
|
152
173
|
return Panel(
|
|
153
|
-
"
|
|
154
|
-
title="[bold red]
|
|
174
|
+
"[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]~[/white] [bold white]введи команду[/bold white]",
|
|
175
|
+
title="[bold red]ВВОД[/bold red]",
|
|
155
176
|
border_style="red",
|
|
156
177
|
)
|
|
157
178
|
|
|
158
179
|
|
|
159
180
|
def render_footer():
|
|
160
181
|
return Panel(
|
|
161
|
-
Align.center("[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]|[/white] [green]SYSTEM READY[/green]"),
|
|
182
|
+
Align.center("[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]|[/white] [green]SYSTEM READY[/green] [white]|[/white] [red]ESC/Ctrl+C для выхода[/red]"),
|
|
162
183
|
border_style="red",
|
|
163
184
|
)
|
|
164
185
|
|
|
@@ -166,20 +187,22 @@ def render_footer():
|
|
|
166
187
|
def draw():
|
|
167
188
|
layout = build_layout()
|
|
168
189
|
layout["header"].update(render_header())
|
|
169
|
-
layout["left"].update(
|
|
170
|
-
layout["center"].update(
|
|
171
|
-
layout["right"].update(
|
|
190
|
+
layout["left"].update(render_commands())
|
|
191
|
+
layout["center"].update(render_session())
|
|
192
|
+
layout["right"].update(render_status())
|
|
193
|
+
layout["output"].update(render_output())
|
|
194
|
+
layout["input"].update(render_input())
|
|
172
195
|
layout["footer"].update(render_footer())
|
|
173
196
|
return layout
|
|
174
197
|
|
|
175
198
|
|
|
176
199
|
def interactive():
|
|
177
200
|
console.clear()
|
|
178
|
-
|
|
201
|
+
push_output("сессия запущена")
|
|
202
|
+
push_output("введи 'help' для списка команд")
|
|
179
203
|
with Live(draw(), refresh_per_second=4) as live:
|
|
180
204
|
while True:
|
|
181
205
|
try:
|
|
182
|
-
# Сначала останавливаем Live, чтобы prompt был виден
|
|
183
206
|
live.stop()
|
|
184
207
|
cmd = Prompt.ask("[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]~[/white]")
|
|
185
208
|
live.start()
|
|
@@ -191,15 +214,21 @@ def interactive():
|
|
|
191
214
|
continue
|
|
192
215
|
|
|
193
216
|
SESSION["queries"] += 1
|
|
194
|
-
|
|
217
|
+
push_output(f"выполняю: {cmd}")
|
|
218
|
+
|
|
195
219
|
from milenium.cli import main
|
|
196
220
|
args = shlex.split(cmd)
|
|
221
|
+
buf = io.StringIO()
|
|
197
222
|
try:
|
|
198
|
-
|
|
223
|
+
with contextlib.redirect_stdout(buf):
|
|
224
|
+
main(args, standalone_mode=False)
|
|
225
|
+
for line in buf.getvalue().splitlines():
|
|
226
|
+
if line.strip():
|
|
227
|
+
push_output(line)
|
|
199
228
|
except SystemExit:
|
|
200
229
|
pass
|
|
201
230
|
except Exception as e:
|
|
202
|
-
|
|
231
|
+
push_output(f"[red]ошибка: {e}[/red]")
|
|
203
232
|
live.update(draw())
|
|
204
233
|
except KeyboardInterrupt:
|
|
205
234
|
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
|
|
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
|