milenium 0.1.0__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.
@@ -0,0 +1,11 @@
1
+ Metadata-Version: 2.4
2
+ Name: milenium
3
+ Version: 0.1.0
4
+ Summary: OSINT / dox / deanon toolkit
5
+ Author: Hacker
6
+ Requires-Dist: requests
7
+ Requires-Dist: dnspython
8
+ Requires-Dist: phonenumbers
9
+ Requires-Dist: beautifulsoup4
10
+ Requires-Dist: rich
11
+ Requires-Dist: click
@@ -0,0 +1 @@
1
+ # milenium
@@ -0,0 +1 @@
1
+ __version__ = "0.1.0"
@@ -0,0 +1,78 @@
1
+ import click
2
+ from rich.console import Console
3
+ from rich.table import Table
4
+ from .modules import username, email, phone, ip, domain, breach, social
5
+ import sys
6
+ from milenium.modules.logger import TeeLogger
7
+
8
+ def main():
9
+ sys.stdout = TeeLogger("milenium.log", mode="a")
10
+ console = Console()
11
+
12
+ @click.group()
13
+ def main():
14
+ """milenium — OSINT / dox / deanon toolkit"""
15
+ pass
16
+
17
+ @main.command()
18
+ @click.argument("nick")
19
+ def user(nick):
20
+ """Прогон никнейма по соцсетям"""
21
+ results = username.check(nick)
22
+ table = Table(title=f"Username: {nick}")
23
+ table.add_column("Site")
24
+ table.add_column("Status")
25
+ for site, status in results.items():
26
+ table.add_row(site, "[green]found[/green]" if status else "[red]no[/red]")
27
+ console.print(table)
28
+
29
+ @main.command()
30
+ @click.argument("mail")
31
+ def mail(mail):
32
+ """Проверка email: MX, соцсети, утечки"""
33
+ results = email.check(mail)
34
+ for k, v in results.items():
35
+ console.print(f"[bold]{k}:[/bold] {v}")
36
+
37
+ @main.command()
38
+ @click.argument("number")
39
+ def phone_cmd(number):
40
+ """Инфа по номеру телефона"""
41
+ results = phone.check(number)
42
+ for k, v in results.items():
43
+ console.print(f"[bold]{k}:[/bold] {v}")
44
+
45
+ @main.command()
46
+ @click.argument("address")
47
+ def ip_cmd(address):
48
+ """Гео, ASN, reverse DNS по IP"""
49
+ results = ip.check(address)
50
+ for k, v in results.items():
51
+ console.print(f"[bold]{k}:[/bold] {v}")
52
+
53
+ @main.command()
54
+ @click.argument("host")
55
+ def dom(host):
56
+ """WHOIS, DNS, subdomains по домену"""
57
+ results = domain.check(host)
58
+ for k, v in results.items():
59
+ console.print(f"[bold]{k}:[/bold] {v}")
60
+
61
+ @main.command()
62
+ @click.argument("query")
63
+ def leaks(query):
64
+ """Проверка утечек (HIBP, etc.)"""
65
+ results = breach.check(query)
66
+ for k, v in results.items():
67
+ console.print(f"[bold]{k}:[/bold] {v}")
68
+
69
+ @main.command()
70
+ @click.argument("nick")
71
+ def social_cmd(nick):
72
+ """Поиск соцсетей по нику"""
73
+ results = social.check(nick)
74
+ for k, v in results.items():
75
+ console.print(f"[bold]{k}:[/bold] {v}")
76
+
77
+ if __name__ == "__main__":
78
+ main()
File without changes
@@ -0,0 +1,11 @@
1
+ import requests
2
+
3
+ def check(query):
4
+ out = {}
5
+ try:
6
+ r = requests.get(f"https://haveibeenpwned.com/api/v3/breachedaccount/{query}",
7
+ headers={"hibp-api-key": "YOUR_KEY"}, timeout=8)
8
+ out["hibp"] = [b["Name"] for b in r.json()] if r.status_code == 200 else []
9
+ except Exception:
10
+ out["hibp"] = "n/a"
11
+ return out
@@ -0,0 +1,27 @@
1
+ import whois
2
+ import dns.resolver
3
+ import requests
4
+
5
+ def check(host):
6
+ out = {}
7
+ try:
8
+ w = whois.whois(host)
9
+ out["registrar"] = w.registrar
10
+ out["creation"] = str(w.creation_date)
11
+ out["expiration"] = str(w.expiration_date)
12
+ out["name_servers"] = w.name_servers
13
+ except Exception as e:
14
+ out["whois_error"] = str(e)
15
+
16
+ for rtype in ["A", "MX", "NS", "TXT"]:
17
+ try:
18
+ out[rtype] = [str(r) for r in dns.resolver.resolve(host, rtype)]
19
+ except Exception:
20
+ out[rtype] = []
21
+
22
+ try:
23
+ r = requests.get(f"https://crt.sh/?q=%25.{host}&output=json", timeout=10)
24
+ out["crt_subdomains"] = list({e["name_value"] for e in r.json()})
25
+ except Exception:
26
+ out["crt_subdomains"] = []
27
+ return out
@@ -0,0 +1,28 @@
1
+ import re
2
+ import dns.resolver
3
+ import requests
4
+
5
+ def check(mail):
6
+ out = {}
7
+ if not re.match(r"[^@]+@[^@]+\.[^@]+", mail):
8
+ return {"error": "invalid email"}
9
+
10
+ domain = mail.split("@")[1]
11
+ try:
12
+ mx = [str(r.exchange).rstrip(".") for r in dns.resolver.resolve(domain, "MX")]
13
+ out["mx"] = mx
14
+ except Exception:
15
+ out["mx"] = []
16
+
17
+ try:
18
+ r = requests.get(f"https://haveibeenpwned.com/api/v3/breachedaccount/{mail}",
19
+ headers={"hibp-api-key": "YOUR_KEY"}, timeout=8)
20
+ if r.status_code == 200:
21
+ out["breaches"] = [b["Name"] for b in r.json()]
22
+ else:
23
+ out["breaches"] = []
24
+ except Exception:
25
+ out["breaches"] = "n/a"
26
+
27
+ out["gravatar"] = f"https://www.gravatar.com/avatar/{__import__('hashlib').md5(mail.lower().encode()).hexdigest()}"
28
+ return out
@@ -0,0 +1,26 @@
1
+ import requests
2
+ import socket
3
+
4
+ def check(address):
5
+ out = {}
6
+ try:
7
+ r = requests.get(f"http://ip-api.com/json/{address}", timeout=8).json()
8
+ out.update({
9
+ "ip": r.get("query"),
10
+ "country": r.get("country"),
11
+ "region": r.get("regionName"),
12
+ "city": r.get("city"),
13
+ "isp": r.get("isp"),
14
+ "org": r.get("org"),
15
+ "as": r.get("as"),
16
+ "lat": r.get("lat"),
17
+ "lon": r.get("lon"),
18
+ })
19
+ except Exception as e:
20
+ out["error"] = str(e)
21
+
22
+ try:
23
+ out["reverse_dns"] = socket.gethostbyaddr(address)[0]
24
+ except Exception:
25
+ out["reverse_dns"] = "n/a"
26
+ return out
@@ -0,0 +1,35 @@
1
+ # milenium/modules/logger.py
2
+ import sys
3
+ import os
4
+ from datetime import datetime
5
+
6
+ class TeeLogger:
7
+ """
8
+ Пишет в консоль и в файл одновременно.
9
+ Использование:
10
+ import sys
11
+ from milenium.modules.logger import TeeLogger
12
+ sys.stdout = TeeLogger("milenium.log")
13
+ """
14
+ def __init__(self, filepath, mode="a"):
15
+ self.terminal = sys.__stdout__
16
+ self.file = open(filepath, mode, encoding="utf-8", buffering=1) # line buffered
17
+ self._write_header()
18
+
19
+ def _write_header(self):
20
+ ts = datetime.now().isoformat()
21
+ self.file.write(f"\n{'='*60}\n[SESSION START] {ts}\n{'='*60}\n")
22
+ self.file.flush()
23
+
24
+ def write(self, message):
25
+ self.terminal.write(message)
26
+ self.file.write(message)
27
+ self.file.flush() # сразу на диск, без буферизации
28
+
29
+ def flush(self):
30
+ self.terminal.flush()
31
+ self.file.flush()
32
+
33
+ def close(self):
34
+ self.file.close()
35
+ sys.stdout = self.terminal
@@ -0,0 +1,15 @@
1
+ import phonenumbers
2
+ from phonenumbers import geocoder, carrier, timezone
3
+
4
+ def check(number):
5
+ out = {}
6
+ try:
7
+ p = phonenumbers.parse(number, None)
8
+ out["valid"] = phonenumbers.is_valid_number(p)
9
+ out["country"] = geocoder.description_for_number(p, "en")
10
+ out["carrier"] = carrier.name_for_number(p, "en")
11
+ out["timezone"] = list(timezone.time_zones_for_number(p))
12
+ out["format_intl"] = phonenumbers.format_number(p, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
13
+ except Exception as e:
14
+ out["error"] = str(e)
15
+ return out
@@ -0,0 +1,7 @@
1
+ import json
2
+ from datetime import datetime
3
+
4
+ def save(data, path="report.json"):
5
+ with open(path, "w") as f:
6
+ json.dump({"ts": datetime.now().isoformat(), "data": data}, f, indent=2)
7
+ return path
@@ -0,0 +1,4 @@
1
+ from .username import check as ucheck
2
+
3
+ def check(nick):
4
+ return ucheck(nick)
@@ -0,0 +1,30 @@
1
+ import requests
2
+
3
+ SITES = {
4
+ "github": "https://github.com/{}",
5
+ "twitter": "https://twitter.com/{}",
6
+ "instagram": "https://instagram.com/{}",
7
+ "reddit": "https://reddit.com/user/{}",
8
+ "telegram": "https://t.me/{}",
9
+ "tiktok": "https://tiktok.com/@{}",
10
+ "youtube": "https://youtube.com/@{}",
11
+ "vk": "https://vk.com/{}",
12
+ "facebook": "https://facebook.com/{}",
13
+ "twitch": "https://twitch.tv/{}",
14
+ "steam": "https://steamcommunity.com/id/{}",
15
+ "pinterest": "https://pinterest.com/{}",
16
+ "medium": "https://medium.com/@{}",
17
+ "habr": "https://habr.com/ru/users/{}/",
18
+ }
19
+
20
+ HEADERS = {"User-Agent": "Mozilla/5.0"}
21
+
22
+ def check(nick):
23
+ out = {}
24
+ for site, url in SITES.items():
25
+ try:
26
+ r = requests.get(url.format(nick), headers=HEADERS, timeout=8, allow_redirects=True)
27
+ out[site] = r.status_code == 200
28
+ except Exception:
29
+ out[site] = False
30
+ return out
@@ -0,0 +1,11 @@
1
+ Metadata-Version: 2.4
2
+ Name: milenium
3
+ Version: 0.1.0
4
+ Summary: OSINT / dox / deanon toolkit
5
+ Author: Hacker
6
+ Requires-Dist: requests
7
+ Requires-Dist: dnspython
8
+ Requires-Dist: phonenumbers
9
+ Requires-Dist: beautifulsoup4
10
+ Requires-Dist: rich
11
+ Requires-Dist: click
@@ -0,0 +1,20 @@
1
+ README.md
2
+ pyproject.toml
3
+ milenium/__init__.py
4
+ milenium/cli.py
5
+ milenium.egg-info/PKG-INFO
6
+ milenium.egg-info/SOURCES.txt
7
+ milenium.egg-info/dependency_links.txt
8
+ milenium.egg-info/entry_points.txt
9
+ milenium.egg-info/requires.txt
10
+ milenium.egg-info/top_level.txt
11
+ milenium/modules/__init__.py
12
+ milenium/modules/breach.py
13
+ milenium/modules/domain.py
14
+ milenium/modules/email.py
15
+ milenium/modules/ip.py
16
+ milenium/modules/logger.py
17
+ milenium/modules/phone.py
18
+ milenium/modules/report.py
19
+ milenium/modules/social.py
20
+ milenium/modules/username.py
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ milenium = milenium.cli:main
@@ -0,0 +1,6 @@
1
+ requests
2
+ dnspython
3
+ phonenumbers
4
+ beautifulsoup4
5
+ rich
6
+ click
@@ -0,0 +1 @@
1
+ milenium
@@ -0,0 +1,20 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "milenium"
7
+ version = "0.1.0"
8
+ description = "OSINT / dox / deanon toolkit"
9
+ authors = [{name = "Hacker"}]
10
+ dependencies = [
11
+ "requests",
12
+ "dnspython",
13
+ "phonenumbers",
14
+ "beautifulsoup4",
15
+ "rich",
16
+ "click",
17
+ ]
18
+
19
+ [project.scripts]
20
+ milenium = "milenium.cli:main"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+