forensic-cli 1.2.5__py3-none-any.whl
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.
- cli/__init__.py +0 -0
- cli/commands/__init__.py +0 -0
- cli/commands/browser.py +220 -0
- cli/commands/describe.py +54 -0
- cli/commands/email.py +3 -0
- cli/commands/network.py +126 -0
- cli/commands/utils.py +3 -0
- cli/main.py +18 -0
- core/__init__.py +0 -0
- core/browser/browser_history.py +156 -0
- core/browser/common_words.py +60 -0
- core/browser/downloads_history.py +129 -0
- core/browser/fav_screen.py +70 -0
- core/browser/logins.py +108 -0
- core/browser/unusual_patterns.py +111 -0
- core/data/__init__.py +0 -0
- core/data/data_recovery.py +157 -0
- core/db/db.py +12 -0
- core/email/email_parser.py +87 -0
- core/email/header_analysis.py +87 -0
- core/models/orm.py +48 -0
- core/models/schemas.py +76 -0
- core/network/__init__.py +0 -0
- core/network/arp_scan.py +16 -0
- core/network/dns_recon.py +90 -0
- core/network/fingerprinting.py +117 -0
- core/network/ip_info.py +29 -0
- core/network/network_map.py +120 -0
- core/network/ping_sweep.py +53 -0
- core/network/port_scanner.py +93 -0
- core/network/smb_scan.py +32 -0
- core/network/snmp_scan.py +43 -0
- core/network/traceroute.py +40 -0
- core/network/utils.py +27 -0
- core/registry.py +25 -0
- core/utils/__init__.py +0 -0
- core/utils/gerar_amostras.py +33 -0
- forensic_cli-1.2.5.dist-info/METADATA +293 -0
- forensic_cli-1.2.5.dist-info/RECORD +44 -0
- forensic_cli-1.2.5.dist-info/WHEEL +5 -0
- forensic_cli-1.2.5.dist-info/entry_points.txt +2 -0
- forensic_cli-1.2.5.dist-info/licenses/LICENSE +21 -0
- forensic_cli-1.2.5.dist-info/licenses/LICENSE-GPL +675 -0
- forensic_cli-1.2.5.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import socket
|
|
2
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
3
|
+
import threading
|
|
4
|
+
import typer
|
|
5
|
+
|
|
6
|
+
COMMON_TCP_PORTS = [
|
|
7
|
+
21, 22, 23, 25, 53, 80, 110, 139, 143, 443, 445,
|
|
8
|
+
3389, 3306, 8080, 8443, 5900, 135, 995, 993, 1723
|
|
9
|
+
]
|
|
10
|
+
COMMON_UDP_PORTS = [53, 67, 68, 69, 123, 161, 162, 500, 514]
|
|
11
|
+
|
|
12
|
+
PORT_ALERTS = {
|
|
13
|
+
21: "FTP",
|
|
14
|
+
22: "SSH",
|
|
15
|
+
23: "Telnet",
|
|
16
|
+
25: "SMTP",
|
|
17
|
+
53: "DNS",
|
|
18
|
+
80: "HTTP",
|
|
19
|
+
443: "HTTPS",
|
|
20
|
+
445: "SMB",
|
|
21
|
+
3306: "MySQL",
|
|
22
|
+
3389: "RDP"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
lock = threading.Lock()
|
|
26
|
+
|
|
27
|
+
def scan_tcp(ip, port):
|
|
28
|
+
result = None
|
|
29
|
+
try:
|
|
30
|
+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
31
|
+
s.settimeout(1)
|
|
32
|
+
if s.connect_ex((ip, port)) == 0:
|
|
33
|
+
banner = ""
|
|
34
|
+
try:
|
|
35
|
+
if port in [21, 22, 25, 80, 443, 3306]:
|
|
36
|
+
s.send(b"HEAD / HTTP/1.0\r\n\r\n")
|
|
37
|
+
banner = s.recv(1024).decode(errors="ignore").strip()
|
|
38
|
+
except (socket.timeout, ConnectionResetError):
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
result = {
|
|
42
|
+
"port": port,
|
|
43
|
+
"protocol": "TCP",
|
|
44
|
+
"status": "open",
|
|
45
|
+
"banner": banner if banner else "sem banner",
|
|
46
|
+
"alert": PORT_ALERTS.get(port)
|
|
47
|
+
}
|
|
48
|
+
except (socket.timeout, OSError):
|
|
49
|
+
pass
|
|
50
|
+
return result
|
|
51
|
+
|
|
52
|
+
def scan_udp(ip, port):
|
|
53
|
+
result = None
|
|
54
|
+
try:
|
|
55
|
+
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
|
|
56
|
+
s.settimeout(1)
|
|
57
|
+
s.sendto(b"", (ip, port))
|
|
58
|
+
try:
|
|
59
|
+
data, _ = s.recvfrom(1024)
|
|
60
|
+
banner = data.decode(errors="ignore").strip()
|
|
61
|
+
status = "open"
|
|
62
|
+
except socket.timeout:
|
|
63
|
+
banner = "sem resposta"
|
|
64
|
+
status = "open|filtered"
|
|
65
|
+
result = {
|
|
66
|
+
"port": port,
|
|
67
|
+
"protocol": "UDP",
|
|
68
|
+
"status": status,
|
|
69
|
+
"banner": banner,
|
|
70
|
+
"alert": PORT_ALERTS.get(port)
|
|
71
|
+
}
|
|
72
|
+
except (OSError, socket.timeout):
|
|
73
|
+
pass
|
|
74
|
+
return result
|
|
75
|
+
|
|
76
|
+
def scan_host(ip, tcp_ports=None, udp_ports=None):
|
|
77
|
+
tcp_ports = tcp_ports or COMMON_TCP_PORTS
|
|
78
|
+
udp_ports = udp_ports or COMMON_UDP_PORTS
|
|
79
|
+
all_ports = tcp_ports + udp_ports
|
|
80
|
+
results = []
|
|
81
|
+
|
|
82
|
+
with typer.progressbar(all_ports, label=f"Scanning {ip}") as progress:
|
|
83
|
+
with ThreadPoolExecutor(max_workers=100) as executor:
|
|
84
|
+
futures = {executor.submit(scan_tcp if port in tcp_ports else scan_udp, ip, port): port for port in all_ports}
|
|
85
|
+
|
|
86
|
+
for future in as_completed(futures):
|
|
87
|
+
res = future.result()
|
|
88
|
+
if res:
|
|
89
|
+
with lock:
|
|
90
|
+
results.append(res)
|
|
91
|
+
progress.update(1)
|
|
92
|
+
|
|
93
|
+
return results
|
core/network/smb_scan.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from smbprotocol.connection import Connection
|
|
2
|
+
from smbprotocol.session import Session
|
|
3
|
+
from smbprotocol.tree import TreeConnect
|
|
4
|
+
import typer
|
|
5
|
+
|
|
6
|
+
def smb_scan_host(ip, username="", password=""):
|
|
7
|
+
try:
|
|
8
|
+
conn = Connection(guid=None, server_name=ip, port=445, require_signing=True)
|
|
9
|
+
conn.connect()
|
|
10
|
+
session = Session(conn, username=username, password=password)
|
|
11
|
+
session.connect()
|
|
12
|
+
|
|
13
|
+
tree = TreeConnect(session, fr"\\{ip}\IPC$")
|
|
14
|
+
tree.connect()
|
|
15
|
+
|
|
16
|
+
shares = ["IPC$"]
|
|
17
|
+
return {"ip": ip, "shares": shares}
|
|
18
|
+
|
|
19
|
+
except Exception as e:
|
|
20
|
+
return {"ip": ip, "shares": [], "error": str(e)}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def smb_scan(hosts, username="", password=""):
|
|
24
|
+
results = []
|
|
25
|
+
|
|
26
|
+
typer.echo(f"[+] Iniciando SMB Scan ({len(hosts)} hosts)...")
|
|
27
|
+
with typer.progressbar(hosts, label="SMB Scan") as progress:
|
|
28
|
+
for ip in hosts:
|
|
29
|
+
results.append(smb_scan_host(ip, username, password))
|
|
30
|
+
progress.update(1)
|
|
31
|
+
|
|
32
|
+
return results
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from pysnmp.hlapi.v3arch.asyncio import (
|
|
2
|
+
SnmpEngine,
|
|
3
|
+
CommunityData,
|
|
4
|
+
UdpTransportTarget,
|
|
5
|
+
ContextData,
|
|
6
|
+
ObjectType,
|
|
7
|
+
ObjectIdentity,
|
|
8
|
+
)
|
|
9
|
+
from pysnmp.hlapi.v3arch.asyncio.cmdgen import getCmd
|
|
10
|
+
|
|
11
|
+
def snmp_scan(ip: str, community: str = "public"):
|
|
12
|
+
oid_list = {
|
|
13
|
+
"sysDescr": "1.3.6.1.2.1.1.1.0",
|
|
14
|
+
"sysName": "1.3.6.1.2.1.1.5.0",
|
|
15
|
+
"sysUpTime": "1.3.6.1.2.1.1.3.0",
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
result = {}
|
|
19
|
+
|
|
20
|
+
for key, oid in oid_list.items():
|
|
21
|
+
try:
|
|
22
|
+
iterator = getCmd(
|
|
23
|
+
SnmpEngine(),
|
|
24
|
+
CommunityData(community, mpModel=1),
|
|
25
|
+
UdpTransportTarget((ip, 161)),
|
|
26
|
+
ContextData(),
|
|
27
|
+
ObjectType(ObjectIdentity(oid))
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
errorIndication, errorStatus, errorIndex, varBinds = next(iterator)
|
|
31
|
+
|
|
32
|
+
if errorIndication:
|
|
33
|
+
result[key] = f"Erro: {errorIndication}"
|
|
34
|
+
elif errorStatus:
|
|
35
|
+
result[key] = f"{errorStatus.prettyPrint()}"
|
|
36
|
+
else:
|
|
37
|
+
for varBind in varBinds:
|
|
38
|
+
result[key] = f"{varBind[1]}"
|
|
39
|
+
|
|
40
|
+
except Exception as e:
|
|
41
|
+
result[key] = f"Erro: {e}"
|
|
42
|
+
|
|
43
|
+
return result
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import platform
|
|
2
|
+
import subprocess
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
def traceroute_host(ip: str):
|
|
6
|
+
system = platform.system()
|
|
7
|
+
if system == "Windows":
|
|
8
|
+
cmd = ["tracert", "-d", ip]
|
|
9
|
+
else:
|
|
10
|
+
cmd = ["traceroute", "-n", ip]
|
|
11
|
+
|
|
12
|
+
result = subprocess.run(cmd, capture_output=True, text=True)
|
|
13
|
+
lines = result.stdout.splitlines()
|
|
14
|
+
hops = []
|
|
15
|
+
|
|
16
|
+
for line in lines[1:]:
|
|
17
|
+
if system == "Windows":
|
|
18
|
+
match = re.search(r"^\s*(\d+)\s+([\d<]+ ms)\s+([\d<]+ ms)\s+([\d<]+ ms)\s+([\d.]+)", line)
|
|
19
|
+
if match:
|
|
20
|
+
hop = int(match.group(1))
|
|
21
|
+
rtt_values = []
|
|
22
|
+
for g in match.groups()[1:4]:
|
|
23
|
+
g_clean = g.replace("ms", "").replace("<", "").strip()
|
|
24
|
+
try:
|
|
25
|
+
rtt_values.append(float(g_clean))
|
|
26
|
+
except:
|
|
27
|
+
pass
|
|
28
|
+
rtt = sum(rtt_values) / len(rtt_values) if rtt_values else None
|
|
29
|
+
ip_hop = match.group(5)
|
|
30
|
+
hops.append({"hop": hop, "ip": ip_hop, "rtt": rtt})
|
|
31
|
+
else:
|
|
32
|
+
parts = line.split()
|
|
33
|
+
if len(parts) >= 2 and parts[0].isdigit():
|
|
34
|
+
hop = int(parts[0])
|
|
35
|
+
ip_hop = parts[1]
|
|
36
|
+
rtt_values = [float(x) for x in parts[2:] if re.match(r"\d+\.?\d*", x)]
|
|
37
|
+
rtt = sum(rtt_values)/len(rtt_values) if rtt_values else None
|
|
38
|
+
hops.append({"hop": hop, "ip": ip_hop, "rtt": rtt})
|
|
39
|
+
|
|
40
|
+
return hops
|
core/network/utils.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from scapy.all import ARP, Ether, srp
|
|
2
|
+
import socket
|
|
3
|
+
import requests
|
|
4
|
+
|
|
5
|
+
def get_mac(ip):
|
|
6
|
+
pkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip)
|
|
7
|
+
ans, _ = srp(pkt, timeout=2, verbose=0)
|
|
8
|
+
for _, rcv in ans:
|
|
9
|
+
return rcv[Ether].src
|
|
10
|
+
return None
|
|
11
|
+
|
|
12
|
+
def get_vendor(mac):
|
|
13
|
+
if not mac:
|
|
14
|
+
return "Desconhecido"
|
|
15
|
+
try:
|
|
16
|
+
resp = requests.get(f"https://api.macvendors.com/{mac}", timeout=3)
|
|
17
|
+
if resp.status_code == 200:
|
|
18
|
+
return resp.text
|
|
19
|
+
except:
|
|
20
|
+
return "Desconhecido"
|
|
21
|
+
return "Desconhecido"
|
|
22
|
+
|
|
23
|
+
def get_hostname(ip):
|
|
24
|
+
try:
|
|
25
|
+
return socket.gethostbyaddr(ip)[0]
|
|
26
|
+
except:
|
|
27
|
+
return "N/A"
|
core/registry.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from core.network.network_map import run as run_network_map
|
|
2
|
+
|
|
3
|
+
def run_port_scanner_placeholder(*args, **kwargs):
|
|
4
|
+
print("Função Port Scanner ainda não implementada")
|
|
5
|
+
return {}
|
|
6
|
+
|
|
7
|
+
def run_chrome_history_placeholder(usuario=None, output_dir=None):
|
|
8
|
+
print(f"Função Chrome History chamada para {usuario}")
|
|
9
|
+
return {}
|
|
10
|
+
|
|
11
|
+
def run_firefox_history_placeholder(usuario=None, output_dir=None):
|
|
12
|
+
print(f"Função Firefox History chamada para {usuario}")
|
|
13
|
+
return {}
|
|
14
|
+
|
|
15
|
+
def run_edge_history_placeholder(usuario=None, output_dir=None):
|
|
16
|
+
print(f"Função Edge History chamada para {usuario}")
|
|
17
|
+
return {}
|
|
18
|
+
|
|
19
|
+
FUNCTIONALITIES = {
|
|
20
|
+
"network_map": run_network_map,
|
|
21
|
+
"port_scanner": run_port_scanner_placeholder,
|
|
22
|
+
"chrome_history": run_chrome_history_placeholder,
|
|
23
|
+
"firefox_history": run_firefox_history_placeholder,
|
|
24
|
+
"edge_history": run_edge_history_placeholder,
|
|
25
|
+
}
|
core/utils/__init__.py
ADDED
|
File without changes
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import zipfile
|
|
3
|
+
|
|
4
|
+
base_dir = "amostras_forenses"
|
|
5
|
+
zip_path = "amostras_forenses.zip"
|
|
6
|
+
|
|
7
|
+
arquivos = {
|
|
8
|
+
"documento_legitimo.pdf": "Este é um arquivo PDF legítimo.",
|
|
9
|
+
"foto.jpg": b"\xff\xd8\xff\xe0" + "JPEG conteúdo simulado".encode("utf-8"),
|
|
10
|
+
"foto.jpg.exe": "Executável disfarçado de imagem.",
|
|
11
|
+
"relatorio.docx": "Relatório original",
|
|
12
|
+
"relatorio_copia.docx": "Relatório original",
|
|
13
|
+
"planilha.xls.scr": "Arquivo renomeado para enganar",
|
|
14
|
+
"vazio.txt": b"",
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
os.makedirs(base_dir, exist_ok=True)
|
|
18
|
+
|
|
19
|
+
for nome, conteudo in arquivos.items():
|
|
20
|
+
caminho = os.path.join(base_dir, nome)
|
|
21
|
+
with open(caminho, "wb") as f:
|
|
22
|
+
if isinstance(conteudo, str):
|
|
23
|
+
conteudo = conteudo.encode("utf-8")
|
|
24
|
+
f.write(conteudo)
|
|
25
|
+
|
|
26
|
+
with zipfile.ZipFile(zip_path, "w") as zipf:
|
|
27
|
+
for root, _, files in os.walk(base_dir):
|
|
28
|
+
for file in files:
|
|
29
|
+
full_path = os.path.join(root, file)
|
|
30
|
+
arcname = os.path.relpath(full_path, base_dir)
|
|
31
|
+
zipf.write(full_path, arcname=os.path.join(base_dir, arcname))
|
|
32
|
+
|
|
33
|
+
print(f"Arquivos gerados e compactados com sucesso em: {zip_path}")
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: forensic-cli
|
|
3
|
+
Version: 1.2.5
|
|
4
|
+
Summary: DevKit Forense - CLI para análise de navegadores e rede
|
|
5
|
+
Home-page: https://github.com/ErickG123/devkit_forense
|
|
6
|
+
Author: Erick Gabriel dos Santos Alves
|
|
7
|
+
Author-email: Erick Gabriel dos Santos Alves <erickgabrielalves0@gmail.com>
|
|
8
|
+
License: MIT
|
|
9
|
+
Project-URL: Documentation, https://erickg123.github.io/devkit_forense/docs
|
|
10
|
+
Project-URL: Changelog, https://erickg123.github.io/devkit_forense/changelog
|
|
11
|
+
Project-URL: Source, https://github.com/ErickG123/devkit_forense
|
|
12
|
+
Keywords: forensics,cli,network,browser
|
|
13
|
+
Requires-Python: >=3.11
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
License-File: LICENSE-GPL
|
|
17
|
+
Requires-Dist: altgraph==0.17.4
|
|
18
|
+
Requires-Dist: annotated-types==0.7.0
|
|
19
|
+
Requires-Dist: anyio==4.10.0
|
|
20
|
+
Requires-Dist: attrs==25.3.0
|
|
21
|
+
Requires-Dist: certifi==2025.8.3
|
|
22
|
+
Requires-Dist: cffi==1.17.1
|
|
23
|
+
Requires-Dist: charset-normalizer==3.4.3
|
|
24
|
+
Requires-Dist: click==8.2.1
|
|
25
|
+
Requires-Dist: colorama==0.4.6
|
|
26
|
+
Requires-Dist: contourpy==1.3.3
|
|
27
|
+
Requires-Dist: cryptography==45.0.6
|
|
28
|
+
Requires-Dist: cycler==0.12.1
|
|
29
|
+
Requires-Dist: defusedxml==0.7.1
|
|
30
|
+
Requires-Dist: dnspython==2.7.0
|
|
31
|
+
Requires-Dist: docopt==0.6.2
|
|
32
|
+
Requires-Dist: docutils==0.22
|
|
33
|
+
Requires-Dist: fastapi==0.116.1
|
|
34
|
+
Requires-Dist: fonttools==4.59.1
|
|
35
|
+
Requires-Dist: greenlet==3.2.4
|
|
36
|
+
Requires-Dist: h11==0.16.0
|
|
37
|
+
Requires-Dist: id==1.5.0
|
|
38
|
+
Requires-Dist: idna==3.10
|
|
39
|
+
Requires-Dist: ipwhois==1.3.0
|
|
40
|
+
Requires-Dist: jaraco.classes==3.4.0
|
|
41
|
+
Requires-Dist: jaraco.context==6.0.1
|
|
42
|
+
Requires-Dist: jaraco.functools==4.3.0
|
|
43
|
+
Requires-Dist: keyring==25.6.0
|
|
44
|
+
Requires-Dist: kiwisolver==1.4.9
|
|
45
|
+
Requires-Dist: markdown-it-py==4.0.0
|
|
46
|
+
Requires-Dist: matplotlib==3.10.5
|
|
47
|
+
Requires-Dist: mdurl==0.1.2
|
|
48
|
+
Requires-Dist: more-itertools==10.7.0
|
|
49
|
+
Requires-Dist: nh3==0.3.0
|
|
50
|
+
Requires-Dist: numpy==2.3.2
|
|
51
|
+
Requires-Dist: outcome==1.3.0.post0
|
|
52
|
+
Requires-Dist: packaging==25.0
|
|
53
|
+
Requires-Dist: pandas==2.3.2
|
|
54
|
+
Requires-Dist: pefile==2023.2.7
|
|
55
|
+
Requires-Dist: pillow==11.3.0
|
|
56
|
+
Requires-Dist: pyasn1==0.6.1
|
|
57
|
+
Requires-Dist: pycparser==2.22
|
|
58
|
+
Requires-Dist: pycryptodome==3.23.0
|
|
59
|
+
Requires-Dist: pydantic==2.11.7
|
|
60
|
+
Requires-Dist: pydantic_core==2.33.2
|
|
61
|
+
Requires-Dist: pyinstaller==6.15.0
|
|
62
|
+
Requires-Dist: pyinstaller-hooks-contrib==2025.8
|
|
63
|
+
Requires-Dist: pyparsing==3.2.3
|
|
64
|
+
Requires-Dist: pysnmp==7.1.21
|
|
65
|
+
Requires-Dist: PySocks==1.7.1
|
|
66
|
+
Requires-Dist: pyspnego==0.11.2
|
|
67
|
+
Requires-Dist: python-dateutil==2.9.0.post0
|
|
68
|
+
Requires-Dist: pytz==2025.2
|
|
69
|
+
Requires-Dist: pywin32==311
|
|
70
|
+
Requires-Dist: pywin32-ctypes==0.2.3
|
|
71
|
+
Requires-Dist: requests==2.32.5
|
|
72
|
+
Requires-Dist: requests-toolbelt==1.0.0
|
|
73
|
+
Requires-Dist: rfc3986==2.0.0
|
|
74
|
+
Requires-Dist: rich==14.1.0
|
|
75
|
+
Requires-Dist: scapy==2.6.1
|
|
76
|
+
Requires-Dist: selenium==4.35.0
|
|
77
|
+
Requires-Dist: six==1.17.0
|
|
78
|
+
Requires-Dist: smbprotocol==1.15.0
|
|
79
|
+
Requires-Dist: sniffio==1.3.1
|
|
80
|
+
Requires-Dist: sortedcontainers==2.4.0
|
|
81
|
+
Requires-Dist: SQLAlchemy==2.0.43
|
|
82
|
+
Requires-Dist: starlette==0.47.2
|
|
83
|
+
Requires-Dist: trio==0.30.0
|
|
84
|
+
Requires-Dist: trio-websocket==0.12.2
|
|
85
|
+
Requires-Dist: typer==0.16.1
|
|
86
|
+
Requires-Dist: typing-inspection==0.4.1
|
|
87
|
+
Requires-Dist: typing_extensions==4.14.1
|
|
88
|
+
Requires-Dist: tzdata==2025.2
|
|
89
|
+
Requires-Dist: urllib3==2.5.0
|
|
90
|
+
Requires-Dist: uvicorn==0.35.0
|
|
91
|
+
Requires-Dist: websocket-client==1.8.0
|
|
92
|
+
Requires-Dist: wsproto==1.2.0
|
|
93
|
+
Requires-Dist: yarg==0.1.10
|
|
94
|
+
Dynamic: author
|
|
95
|
+
Dynamic: home-page
|
|
96
|
+
Dynamic: license-file
|
|
97
|
+
Dynamic: requires-python
|
|
98
|
+
|
|
99
|
+
# DevKit Forense – Ferramenta Educacional de Perícia Digital
|
|
100
|
+
|
|
101
|
+
   
|
|
102
|
+
|
|
103
|
+
## Sumário
|
|
104
|
+
1. [Introdução](#introdução)
|
|
105
|
+
2. [Estrutura do Projeto](#estrutura-do-projeto)
|
|
106
|
+
3. [Módulos Forenses](#módulos-forenses)
|
|
107
|
+
- [Network](#network)
|
|
108
|
+
- [Browser](#browser)
|
|
109
|
+
- [Email](#email)
|
|
110
|
+
4. [Aplicações de Apoio](#aplicações-de-apoio)
|
|
111
|
+
- [Dashboard](#dashboard)
|
|
112
|
+
- [Visualizadores de Resultados](#visualizadores-de-resultados)
|
|
113
|
+
- [Assistente Interativo (Wizard)](#assistente-interativo-wizard)
|
|
114
|
+
5. [Fluxo de Integração](#fluxo-de-integração)
|
|
115
|
+
6. [Tecnologias Utilizadas](#tecnologias-utilizadas)
|
|
116
|
+
7. [Planejamento e Futuras Extensões](#planejamento-e-futuras-extensões)
|
|
117
|
+
8. [Instalação](#instalação)
|
|
118
|
+
9. [Exemplos de Execução](#exemplos-de-execução)
|
|
119
|
+
10. [Considerações Finais](#considerações-finais)
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 1. Introdução
|
|
124
|
+
|
|
125
|
+
**Objetivo:**
|
|
126
|
+
O DevKit Forense é uma suíte de ferramentas educacionais para análise de evidências digitais, projetada para auxiliar no ensino de perícia digital. Combina **CLI**, **API** e **aplicações de apoio**, tornando o uso mais interativo, visual e didático.
|
|
127
|
+
|
|
128
|
+
**Escopo:**
|
|
129
|
+
- Execução de análises forenses em browsers, arquivos, emails e redes.
|
|
130
|
+
- Visualização interativa de resultados.
|
|
131
|
+
- Geração de relatórios automáticos.
|
|
132
|
+
- Assistente interativo (Wizard) para guiar o usuário em tarefas complexas.
|
|
133
|
+
|
|
134
|
+
**Público-alvo:**
|
|
135
|
+
- Estudantes e professores de Segurança da Informação e Perícia Digital.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 2. Estrutura do Projeto
|
|
140
|
+
|
|
141
|
+
O DevKit está organizado em três camadas principais:
|
|
142
|
+
|
|
143
|
+
1. **CLI** – Executa os módulos forenses pelo terminal.
|
|
144
|
+
2. **API** – Interface programática para execução de módulos e integração com dashboards.
|
|
145
|
+
3. **Core** – Contém a lógica central, classes, funções e utilitários compartilhados pelos módulos.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 3. Módulos Forenses
|
|
150
|
+
|
|
151
|
+
### Network
|
|
152
|
+
| Módulo | Descrição |
|
|
153
|
+
|--------|-----------|
|
|
154
|
+
| `arp_scan` | Varre a rede para identificar dispositivos conectados via ARP. |
|
|
155
|
+
| `dns_recon` | Realiza levantamento de informações de DNS de domínios e hosts. |
|
|
156
|
+
| `fingerprinting` | Identifica sistemas, serviços e versões na rede. |
|
|
157
|
+
| `ip_info` | Consulta informações detalhadas sobre um endereço IP. |
|
|
158
|
+
| `network_map` | Gera mapa visual de hosts e conexões detectadas. |
|
|
159
|
+
| `ping_sweep` | Verifica quais hosts estão ativos em uma faixa de IP. |
|
|
160
|
+
| `port_scanner` | Identifica portas abertas e serviços ativos em hosts. |
|
|
161
|
+
| `snmp_scan` | Realiza varredura SNMP em dispositivos de rede. |
|
|
162
|
+
| `traceroute` | Traça o caminho percorrido por pacotes até um host alvo. |
|
|
163
|
+
|
|
164
|
+
### Browser
|
|
165
|
+
| Módulo | Descrição |
|
|
166
|
+
|--------|-----------|
|
|
167
|
+
| `browser_history` | Coleta histórico de navegação de diferentes browsers. |
|
|
168
|
+
| `common_words` | Identifica palavras mais comuns em histórico de navegação e downloads. |
|
|
169
|
+
| `downloads_history` | Lista arquivos baixados pelos usuários. |
|
|
170
|
+
| `fav_screen` | Captura e organiza screenshots de sites favoritos ou acessados. |
|
|
171
|
+
| `full_browser_history` | Consolida todo histórico de navegação em um único relatório. |
|
|
172
|
+
| `logins_chrome` | Extração de credenciais armazenadas no Chrome. |
|
|
173
|
+
| `logins_edge` | Extração de credenciais armazenadas no Edge. |
|
|
174
|
+
| `unusual_patterns` | Identifica padrões suspeitos em histórico de navegação ou downloads. |
|
|
175
|
+
|
|
176
|
+
### Email
|
|
177
|
+
| Módulo | Descrição |
|
|
178
|
+
|--------|-----------|
|
|
179
|
+
| `email_parser` | Extrai e organiza informações de emails. |
|
|
180
|
+
| `header_analysis` | Analisa cabeçalhos para identificar origem, roteamento e possíveis fraudes. |
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 4. Aplicações de Apoio
|
|
185
|
+
|
|
186
|
+
### Dashboard
|
|
187
|
+
**Objetivo:** Centralizar informações e permitir execução rápida de módulos.
|
|
188
|
+
|
|
189
|
+
**Funcionalidades:**
|
|
190
|
+
- Menu lateral com módulos do DevKit.
|
|
191
|
+
- Cards com resumo de análises recentes.
|
|
192
|
+
- Acesso direto a visualizadores e Wizard.
|
|
193
|
+
|
|
194
|
+
**Tecnologias sugeridas:** Streamlit (web), PyQt (desktop).
|
|
195
|
+
|
|
196
|
+
### Visualizadores de Resultados
|
|
197
|
+
**Objetivo:** Transformar saídas da CLI em gráficos e tabelas interativas.
|
|
198
|
+
|
|
199
|
+
**Exemplos:**
|
|
200
|
+
- Mapas de rede interativos.
|
|
201
|
+
- Timeline de eventos e logs.
|
|
202
|
+
- Gráficos de arquivos analisados, tipos e padrões suspeitos.
|
|
203
|
+
|
|
204
|
+
**Integração:** Recebe dados da CLI em formato JSON ou CSV.
|
|
205
|
+
|
|
206
|
+
### Assistente Interativo (Wizard)
|
|
207
|
+
**Objetivo:** Guiar o usuário passo a passo em tarefas complexas.
|
|
208
|
+
|
|
209
|
+
**Exemplo de fluxo:**
|
|
210
|
+
1. Seleção do tipo de análise (pendrive, rede, logs, etc.)
|
|
211
|
+
2. Configuração de opções (scan de malware, intervalo de IP, dispositivo alvo)
|
|
212
|
+
3. Execução automática dos módulos necessários
|
|
213
|
+
4. Geração de relatórios e acesso aos visualizadores
|
|
214
|
+
|
|
215
|
+
**Tecnologias sugeridas:**
|
|
216
|
+
- Terminal interativo (`questionary`, `PyInquirer`)
|
|
217
|
+
- Web/Desktop (mesmo framework do Dashboard)
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## 5. Fluxo de Integração
|
|
222
|
+
|
|
223
|
+
1. CLI executa módulos → gera resultados.
|
|
224
|
+
2. API possibilita integração programática com dashboards e outras aplicações.
|
|
225
|
+
3. Dashboard centraliza execução e resumo dos resultados.
|
|
226
|
+
4. Visualizadores transformam dados em gráficos e tabelas interativas.
|
|
227
|
+
5. Wizard guia o usuário em tarefas complexas.
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## 6. Tecnologias Utilizadas
|
|
232
|
+
|
|
233
|
+
- **Python** – Linguagem principal do projeto.
|
|
234
|
+
- **FastAPI** – API para integração e execução de módulos.
|
|
235
|
+
- **Typer** – CLI estruturada e interativa.
|
|
236
|
+
- **SQLite** – Banco de dados local leve.
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 7. Planejamento e Futuras Extensões
|
|
241
|
+
|
|
242
|
+
| Aplicação / Módulo | Objetivo | Possíveis Extensões |
|
|
243
|
+
|-------------------|----------|------------------|
|
|
244
|
+
| Dashboard | Painel central para visualização e execução de módulos | Filtros avançados, alertas em tempo real, integração direta com relatórios |
|
|
245
|
+
| Visualizadores | Transformar dados da CLI em gráficos, mapas e tabelas | Timeline interativa, heatmaps de rede, gráficos de comportamento de usuários |
|
|
246
|
+
| Wizard | Guiar o usuário passo a passo | Templates de análise rápida, integração automática com módulos de email e data, relatórios PDF/HTML |
|
|
247
|
+
| Novos módulos CLI | Expansão da análise forense | Logs de sistemas, recuperação de dispositivos móveis, análise de mídia, detecção de malware, integração com threat intelligence |
|
|
248
|
+
| Ferramentas auxiliares | Suporte a módulos existentes e novos | Exportação avançada de relatórios, dashboards customizáveis, notificações em tempo real |
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## 8. Instalação
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
# Clonar o repositório
|
|
256
|
+
git clone https://github.com/ErickG123/devkit_forense.git
|
|
257
|
+
cd devkit-forense
|
|
258
|
+
|
|
259
|
+
# Criar ambiente virtual
|
|
260
|
+
python -m venv venv
|
|
261
|
+
source venv/bin/activate # Linux/macOS
|
|
262
|
+
venv\Scripts\activate # Windows
|
|
263
|
+
|
|
264
|
+
# Instalar dependências
|
|
265
|
+
pip install -r requirements.txt
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 9. Exemplos de Execução
|
|
271
|
+
|
|
272
|
+
**CLI:**
|
|
273
|
+
```bash
|
|
274
|
+
# Executar módulo de network scan
|
|
275
|
+
python cli.py network_map --target 192.168.0.0/24
|
|
276
|
+
|
|
277
|
+
# Coletar histórico do Chrome
|
|
278
|
+
python cli.py browser_history --browser chrome
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**API:**
|
|
282
|
+
```bash
|
|
283
|
+
# Executar API
|
|
284
|
+
uvicorn api.main:app --reload
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## 10. Considerações Finais
|
|
290
|
+
|
|
291
|
+
O DevKit Forense combina **educação e prática**, permitindo que usuários explorem análise forense digital de forma segura, didática e interativa.
|
|
292
|
+
As aplicações de apoio aumentam a acessibilidade e engajamento, tornando o estudo da perícia digital mais visual e intuitivo.
|
|
293
|
+
O planejamento de novos módulos e ferramentas garante evolução contínua da plataforma, mantendo-a atualizada e relevante para atividades acadêmicas e laboratoriais.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
cli/main.py,sha256=saKD2uVcfAho2VwZa9GiQf84Abv5MdjPEMj1IVpHy0g,817
|
|
3
|
+
cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
cli/commands/browser.py,sha256=65g5BQsyFBiIxQsoj0BaBZ578pU0EFsdhxUYsAcExfs,8028
|
|
5
|
+
cli/commands/describe.py,sha256=u-PPIzxrMEMu0ghby1oL6vKN_PrMd_epRWkSCgFqvZQ,1906
|
|
6
|
+
cli/commands/email.py,sha256=PGroEJFTEFUfCQEVEZLw2GkcwPvU6Hst3p9CV4n6ZsI,40
|
|
7
|
+
cli/commands/network.py,sha256=nN3DIUnG5Ba0URElY8Ywp3lW6R7hCKKWd_iSDwQzA7k,4850
|
|
8
|
+
cli/commands/utils.py,sha256=RcRSx8UjthHSSvqfH9dBSHT8U67Stua2Ahwp3uFdU3g,40
|
|
9
|
+
core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
+
core/registry.py,sha256=21eLrDJlwHe80K4i49Wt4Jck3GRNf63f7B-TlzCuqqc,881
|
|
11
|
+
core/browser/browser_history.py,sha256=Gdr0jYFV0hxnvsMK-pDVWGm0W4R-FykWVp9M_-NCdTw,5243
|
|
12
|
+
core/browser/common_words.py,sha256=r2YQTQhYmv71BA_LktFgRA9YIfWsWfPRHzRlSAzoj5k,2129
|
|
13
|
+
core/browser/downloads_history.py,sha256=ZRtiSvB3tpZ8ymeYWZC8wFUO4h_JzyF7wzDi4V8iE5g,4582
|
|
14
|
+
core/browser/fav_screen.py,sha256=9cJiypsIs7Aqccg4Aql6b_Ojwzg5me5GghkrqAOSwRQ,2429
|
|
15
|
+
core/browser/logins.py,sha256=vv_cOgMaI2uxl3-TAXuATdkNyMF85VJtVyNb03HTdXY,3553
|
|
16
|
+
core/browser/unusual_patterns.py,sha256=y2clOPSXTm-MdY-mqMsFazvvWTk5kFhhq4hbPnh_dh8,4219
|
|
17
|
+
core/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
+
core/data/data_recovery.py,sha256=JpUaur0cs-FaFho7INVtVsSqr0SuFD1UIYh7rxE3tIQ,5539
|
|
19
|
+
core/db/db.py,sha256=BQFaEZtvcfASMCwiJW6eXtyfX8luabq_hDUE-Ld3IPM,348
|
|
20
|
+
core/email/email_parser.py,sha256=-LANRbXVpJDqNBO_W2y-QjnzSUwebijRiLRwPDr5qGg,3011
|
|
21
|
+
core/email/header_analysis.py,sha256=8V0zbid1n0HgW44vvHxvLmIkLFN5-dedWEUGYYgRCWk,3108
|
|
22
|
+
core/models/orm.py,sha256=K8odXMvFNSsQV2HL4z8DuxTtGiO7TI2h729lMCVCuoc,1835
|
|
23
|
+
core/models/schemas.py,sha256=nMxG_5Baqv68I06OxriM3W-H6O-M8EmcGWc_TzjjyKw,1455
|
|
24
|
+
core/network/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
|
+
core/network/arp_scan.py,sha256=TDs2XWC2SYFVuaRSZupfYygNVkpy99xDeHIfghofI1E,506
|
|
26
|
+
core/network/dns_recon.py,sha256=odg9D32xW1oQljOdKaRku7gCsCpn0N5duckN68_kP44,3093
|
|
27
|
+
core/network/fingerprinting.py,sha256=zUmo3cv3890bYTD8WbNbhky-9tIm4zD4cmYtMK50Lp4,3899
|
|
28
|
+
core/network/ip_info.py,sha256=MX1ityaIxLDECnUADBa0ivhFUAHDIxXYez2fovgQO7o,835
|
|
29
|
+
core/network/network_map.py,sha256=EYpibTWUuePiBO8Ps3rkDt4KniO8uzF9PedAhqPcZ8Q,4077
|
|
30
|
+
core/network/ping_sweep.py,sha256=Sx0k_tvmHdU80OJLI3c-JewopkALf2cLspoQ5X_EXOo,1603
|
|
31
|
+
core/network/port_scanner.py,sha256=Qzl1v89UJYOOiQqyLqtbS956Rxeb1Sb95UwKncudpOc,2824
|
|
32
|
+
core/network/smb_scan.py,sha256=35ndZCfnnOdOcqK_uMsT0EvSa8p4YNskM10QRt2zwEE,976
|
|
33
|
+
core/network/snmp_scan.py,sha256=dIcNV4DLV3gpf_q_FvNL1kO8FCgCeszlksFgE2Omo8g,1192
|
|
34
|
+
core/network/traceroute.py,sha256=0VLmifNV_6lCMRsRmOjsgSkLBdA5FsmSdR_Z3OU9eLk,1469
|
|
35
|
+
core/network/utils.py,sha256=L77SgGz-3EUDu1A8nQfmuEYybvsX_0EV9e3znmg9mag,649
|
|
36
|
+
core/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
|
+
core/utils/gerar_amostras.py,sha256=BG9KaMFHTH97UjayOW-FtDpZJV8wraKIKn8w4Y_Fy2k,1129
|
|
38
|
+
forensic_cli-1.2.5.dist-info/licenses/LICENSE,sha256=UAyslgL9-LOF_uHDwe6webS9QStw1wKoE1wiK3hVDtw,1087
|
|
39
|
+
forensic_cli-1.2.5.dist-info/licenses/LICENSE-GPL,sha256=vTQ2KWY5j4zsbXhaw1Eei4DDeX8zM1FtqqHI8H0eYlk,35085
|
|
40
|
+
forensic_cli-1.2.5.dist-info/METADATA,sha256=hSZKUTPgcRQcOQpS015pg_gwPKyLY09vta3HGBR9lxI,10972
|
|
41
|
+
forensic_cli-1.2.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
42
|
+
forensic_cli-1.2.5.dist-info/entry_points.txt,sha256=bFWaw4_Bz8PDVqddLXxHQ5HuIm3vnGFIk9wVFcosR4g,46
|
|
43
|
+
forensic_cli-1.2.5.dist-info/top_level.txt,sha256=3d1SrIv4s8kkUKftU2GUWApholP9j4ktB3LaSaSWSNM,9
|
|
44
|
+
forensic_cli-1.2.5.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Erick Gabriel dos Santos Alves
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|