moriarty-project 0.1.22__py3-none-any.whl → 0.1.24__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.
- moriarty/__init__.py +1 -1
- moriarty/cli/app.py +4 -3
- moriarty/cli/domain_cmd.py +5 -1
- moriarty/modules/directory_fuzzer.py +25 -5
- moriarty/modules/web_crawler.py +448 -91
- {moriarty_project-0.1.22.dist-info → moriarty_project-0.1.24.dist-info}/METADATA +3 -3
- {moriarty_project-0.1.22.dist-info → moriarty_project-0.1.24.dist-info}/RECORD +9 -27
- moriarty/modules/wifippler/__init__.py +0 -92
- moriarty/modules/wifippler/cli/__init__.py +0 -8
- moriarty/modules/wifippler/cli/commands.py +0 -123
- moriarty/modules/wifippler/core/__init__.py +0 -94
- moriarty/modules/wifippler/core/attacks/__init__.py +0 -146
- moriarty/modules/wifippler/core/attacks/deauth.py +0 -262
- moriarty/modules/wifippler/core/attacks/handshake.py +0 -402
- moriarty/modules/wifippler/core/attacks/pmkid.py +0 -424
- moriarty/modules/wifippler/core/attacks/wep.py +0 -467
- moriarty/modules/wifippler/core/attacks/wpa.py +0 -446
- moriarty/modules/wifippler/core/attacks/wps.py +0 -474
- moriarty/modules/wifippler/core/models/__init__.py +0 -10
- moriarty/modules/wifippler/core/models/network.py +0 -240
- moriarty/modules/wifippler/core/scanner.py +0 -903
- moriarty/modules/wifippler/core/utils/__init__.py +0 -624
- moriarty/modules/wifippler/core/utils/exec.py +0 -182
- moriarty/modules/wifippler/core/utils/network.py +0 -262
- moriarty/modules/wifippler/core/utils/system.py +0 -153
- {moriarty_project-0.1.22.dist-info → moriarty_project-0.1.24.dist-info}/WHEEL +0 -0
- {moriarty_project-0.1.22.dist-info → moriarty_project-0.1.24.dist-info}/entry_points.txt +0 -0
@@ -1,240 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Modelos de dados para redes e clientes WiFi.
|
3
|
-
"""
|
4
|
-
from dataclasses import dataclass, field, asdict
|
5
|
-
from datetime import datetime
|
6
|
-
from typing import Dict, List, Optional, Set, Tuple, Any
|
7
|
-
from enum import Enum, auto
|
8
|
-
import json
|
9
|
-
|
10
|
-
|
11
|
-
class WiFiSecurityType(Enum):
|
12
|
-
"""Tipos de segurança WiFi suportados."""
|
13
|
-
NONE = auto()
|
14
|
-
WEP = auto()
|
15
|
-
WPA = auto()
|
16
|
-
WPA2 = auto()
|
17
|
-
WPA3 = auto()
|
18
|
-
WPA2_ENTERPRISE = auto()
|
19
|
-
WPA3_ENTERPRISE = auto()
|
20
|
-
OWE = auto() # Opportunistic Wireless Encryption (OWE)
|
21
|
-
WPS = auto() # WiFi Protected Setup
|
22
|
-
|
23
|
-
|
24
|
-
# Mapeamento de códigos de segurança para WiFiSecurityType
|
25
|
-
SECURITY_MAP = {
|
26
|
-
'WPA2': WiFiSecurityType.WPA2,
|
27
|
-
'WPA3': WiFiSecurityType.WPA3,
|
28
|
-
'WPA2-EAP': WiFiSecurityType.WPA2_ENTERPRISE,
|
29
|
-
'WPA3-EAP': WiFiSecurityType.WPA3_ENTERPRISE,
|
30
|
-
'WEP': WiFiSecurityType.WEP,
|
31
|
-
'OPEN': WiFiSecurityType.NONE,
|
32
|
-
'NONE': WiFiSecurityType.NONE,
|
33
|
-
'WPA': WiFiSecurityType.WPA,
|
34
|
-
'WPA2-PSK': WiFiSecurityType.WPA2,
|
35
|
-
'WPA3-PSK': WiFiSecurityType.WPA3,
|
36
|
-
'WPA2-PSK-CCMP': WiFiSecurityType.WPA2,
|
37
|
-
'WPA2-PSK-TKIP': WiFiSecurityType.WPA2,
|
38
|
-
'WPA-PSK': WiFiSecurityType.WPA,
|
39
|
-
'WPA-PSK-CCMP': WiFiSecurityType.WPA,
|
40
|
-
'WPA-PSK-TKIP': WiFiSecurityType.WPA,
|
41
|
-
'WPA2-ENTERPRISE': WiFiSecurityType.WPA2_ENTERPRISE,
|
42
|
-
'WPA3-ENTERPRISE': WiFiSecurityType.WPA3_ENTERPRISE,
|
43
|
-
'OWE': WiFiSecurityType.OWE,
|
44
|
-
'WPS': WiFiSecurityType.WPS,
|
45
|
-
}
|
46
|
-
|
47
|
-
|
48
|
-
class WiFiCipherType(Enum):
|
49
|
-
"""Tipos de cifra suportados."""
|
50
|
-
NONE = auto()
|
51
|
-
WEP_40 = auto()
|
52
|
-
WEP_104 = auto()
|
53
|
-
TKIP = auto()
|
54
|
-
CCMP = auto()
|
55
|
-
GCMP = auto()
|
56
|
-
|
57
|
-
|
58
|
-
class WiFiAuthType(Enum):
|
59
|
-
"""Tipos de autenticação suportados."""
|
60
|
-
OPEN = auto()
|
61
|
-
SHARED = auto()
|
62
|
-
WPA_PSK = auto()
|
63
|
-
WPA_EAP = auto()
|
64
|
-
WPA2_PSK = auto()
|
65
|
-
WPA2_EAP = auto()
|
66
|
-
WPA3_SAE = auto()
|
67
|
-
WPA3_EAP = auto()
|
68
|
-
OWE = auto()
|
69
|
-
|
70
|
-
|
71
|
-
@dataclass
|
72
|
-
class WiFiNetwork:
|
73
|
-
"""Representa uma rede WiFi descoberta."""
|
74
|
-
# Identificação
|
75
|
-
bssid: str
|
76
|
-
ssid: str
|
77
|
-
channel: int
|
78
|
-
frequency: int # Em MHz
|
79
|
-
band: str # 2.4GHz, 5GHz, 6GHz, etc.
|
80
|
-
|
81
|
-
# Sinal e qualidade
|
82
|
-
signal_dbm: int # Potência do sinal em dBm
|
83
|
-
signal_percent: int # Porcentagem de qualidade do sinal (0-100%)
|
84
|
-
noise_dbm: int # Nível de ruído em dBm
|
85
|
-
|
86
|
-
# Segurança
|
87
|
-
security: WiFiSecurityType
|
88
|
-
encryption: str # Ex: WPA2, WPA3, WEP, etc.
|
89
|
-
cipher: WiFiCipherType
|
90
|
-
auth: WiFiAuthType
|
91
|
-
|
92
|
-
# WPS (WiFi Protected Setup)
|
93
|
-
wps: bool = False
|
94
|
-
wps_locked: bool = False
|
95
|
-
wps_version: str = ""
|
96
|
-
wps_state: str = ""
|
97
|
-
|
98
|
-
# Clientes conectados
|
99
|
-
clients: List['WiFiClient'] = field(default_factory=list)
|
100
|
-
|
101
|
-
# Metadados
|
102
|
-
first_seen: datetime = field(default_factory=datetime.utcnow)
|
103
|
-
last_seen: datetime = field(default_factory=datetime.utcnow)
|
104
|
-
vendor: str = "" # Fabricante do roteador baseado no OUI do BSSID
|
105
|
-
country: str = "" # Código do país
|
106
|
-
|
107
|
-
# Flags adicionais
|
108
|
-
is_hidden: bool = False
|
109
|
-
is_associated: bool = False
|
110
|
-
is_internet: bool = False # Se a rede tem acesso à internet
|
111
|
-
|
112
|
-
# Estatísticas
|
113
|
-
beacon: int = 0
|
114
|
-
data: int = 0
|
115
|
-
data_rate: float = 0.0 # Em Mbps
|
116
|
-
|
117
|
-
# Informações adicionais
|
118
|
-
extra: Dict[str, Any] = field(default_factory=dict)
|
119
|
-
|
120
|
-
def to_dict(self) -> Dict[str, Any]:
|
121
|
-
"""Converte o objeto para dicionário."""
|
122
|
-
data = asdict(self)
|
123
|
-
# Converte enums para strings
|
124
|
-
data['security'] = self.security.name
|
125
|
-
data['cipher'] = self.cipher.name
|
126
|
-
data['auth'] = self.auth.name
|
127
|
-
# Converte datetimes para strings ISO
|
128
|
-
data['first_seen'] = self.first_seen.isoformat()
|
129
|
-
data['last_seen'] = self.last_seen.isoformat()
|
130
|
-
# Converte clientes para dicionários
|
131
|
-
data['clients'] = [client.to_dict() for client in self.clients]
|
132
|
-
return data
|
133
|
-
|
134
|
-
def to_json(self, indent: int = 2) -> str:
|
135
|
-
"""Converte o objeto para JSON."""
|
136
|
-
return json.dumps(self.to_dict(), indent=indent, ensure_ascii=False)
|
137
|
-
|
138
|
-
def update_signal(self, signal_dbm: int, noise_dbm: int):
|
139
|
-
"""Atualiza as métricas de sinal."""
|
140
|
-
self.signal_dbm = signal_dbm
|
141
|
-
self.noise_dbm = noise_dbm
|
142
|
-
self.signal_percent = self._calculate_signal_percentage(signal_dbm, noise_dbm)
|
143
|
-
self.last_seen = datetime.utcnow()
|
144
|
-
|
145
|
-
def add_client(self, client: 'WiFiClient'):
|
146
|
-
"""Adiciona um cliente à rede."""
|
147
|
-
# Verifica se o cliente já existe
|
148
|
-
for idx, c in enumerate(self.clients):
|
149
|
-
if c.mac == client.mac:
|
150
|
-
self.clients[idx] = client
|
151
|
-
return
|
152
|
-
self.clients.append(client)
|
153
|
-
|
154
|
-
def remove_client(self, mac: str) -> bool:
|
155
|
-
"""Remove um cliente da rede."""
|
156
|
-
for idx, client in enumerate(self.clients):
|
157
|
-
if client.mac == mac:
|
158
|
-
self.clients.pop(idx)
|
159
|
-
return True
|
160
|
-
return False
|
161
|
-
|
162
|
-
@staticmethod
|
163
|
-
def _calculate_signal_percentage(signal_dbm: int, noise_dbm: int) -> int:
|
164
|
-
"""Calcula a porcentagem de qualidade do sinal."""
|
165
|
-
# Se não houver sinal, retorna 0%
|
166
|
-
if signal_dbm == 0 or signal_dbm <= -100:
|
167
|
-
return 0
|
168
|
-
|
169
|
-
# Se o sinal for maior que -50dBm, retorna 100%
|
170
|
-
if signal_dbm >= -50:
|
171
|
-
return 100
|
172
|
-
|
173
|
-
# Calcula a porcentagem baseada na força do sinal
|
174
|
-
# Considerando -100dBm como 0% e -50dBm como 100%
|
175
|
-
return 2 * (signal_dbm + 100)
|
176
|
-
|
177
|
-
|
178
|
-
@dataclass
|
179
|
-
class WiFiClient:
|
180
|
-
"""Representa um cliente conectado a uma rede WiFi."""
|
181
|
-
# Identificação
|
182
|
-
mac: str
|
183
|
-
ip: str = ""
|
184
|
-
hostname: str = ""
|
185
|
-
vendor: str = "" # Fabricante baseado no OUI do MAC
|
186
|
-
|
187
|
-
# Sinal e conexão
|
188
|
-
signal_dbm: int = 0
|
189
|
-
signal_percent: int = 0
|
190
|
-
rx_rate: float = 0.0 # Em Mbps
|
191
|
-
tx_rate: float = 0.0 # Em Mbps
|
192
|
-
|
193
|
-
# Metadados
|
194
|
-
first_seen: datetime = field(default_factory=datetime.utcnow)
|
195
|
-
last_seen: datetime = field(default_factory=datetime.utcnow)
|
196
|
-
|
197
|
-
# Informações adicionais
|
198
|
-
is_associated: bool = False
|
199
|
-
is_authenticated: bool = False
|
200
|
-
is_wps: bool = False
|
201
|
-
|
202
|
-
# Estatísticas
|
203
|
-
packets: int = 0
|
204
|
-
data: int = 0 # Em bytes
|
205
|
-
|
206
|
-
# Informações adicionais
|
207
|
-
extra: Dict[str, Any] = field(default_factory=dict)
|
208
|
-
|
209
|
-
def to_dict(self) -> Dict[str, Any]:
|
210
|
-
"""Converte o objeto para dicionário."""
|
211
|
-
data = asdict(self)
|
212
|
-
# Converte datetimes para strings ISO
|
213
|
-
data['first_seen'] = self.first_seen.isoformat()
|
214
|
-
data['last_seen'] = self.last_seen.isoformat()
|
215
|
-
return data
|
216
|
-
|
217
|
-
def to_json(self, indent: int = 2) -> str:
|
218
|
-
"""Converte o objeto para JSON."""
|
219
|
-
return json.dumps(self.to_dict(), indent=indent, ensure_ascii=False)
|
220
|
-
|
221
|
-
def update_signal(self, signal_dbm: int):
|
222
|
-
"""Atualiza as métricas de sinal."""
|
223
|
-
self.signal_dbm = signal_dbm
|
224
|
-
self.signal_percent = self._calculate_signal_percentage(signal_dbm)
|
225
|
-
self.last_seen = datetime.utcnow()
|
226
|
-
|
227
|
-
@staticmethod
|
228
|
-
def _calculate_signal_percentage(signal_dbm: int) -> int:
|
229
|
-
"""Calcula a porcentagem de qualidade do sinal."""
|
230
|
-
# Se não houver sinal, retorna 0%
|
231
|
-
if signal_dbm == 0 or signal_dbm <= -100:
|
232
|
-
return 0
|
233
|
-
|
234
|
-
# Se o sinal for maior que -50dBm, retorna 100%
|
235
|
-
if signal_dbm >= -50:
|
236
|
-
return 100
|
237
|
-
|
238
|
-
# Calcula a porcentagem baseada na força do sinal
|
239
|
-
# Considerando -100dBm como 0% e -50dBm como 100%
|
240
|
-
return 2 * (signal_dbm + 100)
|