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.
Files changed (27) hide show
  1. moriarty/__init__.py +1 -1
  2. moriarty/cli/app.py +4 -3
  3. moriarty/cli/domain_cmd.py +5 -1
  4. moriarty/modules/directory_fuzzer.py +25 -5
  5. moriarty/modules/web_crawler.py +448 -91
  6. {moriarty_project-0.1.22.dist-info → moriarty_project-0.1.24.dist-info}/METADATA +3 -3
  7. {moriarty_project-0.1.22.dist-info → moriarty_project-0.1.24.dist-info}/RECORD +9 -27
  8. moriarty/modules/wifippler/__init__.py +0 -92
  9. moriarty/modules/wifippler/cli/__init__.py +0 -8
  10. moriarty/modules/wifippler/cli/commands.py +0 -123
  11. moriarty/modules/wifippler/core/__init__.py +0 -94
  12. moriarty/modules/wifippler/core/attacks/__init__.py +0 -146
  13. moriarty/modules/wifippler/core/attacks/deauth.py +0 -262
  14. moriarty/modules/wifippler/core/attacks/handshake.py +0 -402
  15. moriarty/modules/wifippler/core/attacks/pmkid.py +0 -424
  16. moriarty/modules/wifippler/core/attacks/wep.py +0 -467
  17. moriarty/modules/wifippler/core/attacks/wpa.py +0 -446
  18. moriarty/modules/wifippler/core/attacks/wps.py +0 -474
  19. moriarty/modules/wifippler/core/models/__init__.py +0 -10
  20. moriarty/modules/wifippler/core/models/network.py +0 -240
  21. moriarty/modules/wifippler/core/scanner.py +0 -903
  22. moriarty/modules/wifippler/core/utils/__init__.py +0 -624
  23. moriarty/modules/wifippler/core/utils/exec.py +0 -182
  24. moriarty/modules/wifippler/core/utils/network.py +0 -262
  25. moriarty/modules/wifippler/core/utils/system.py +0 -153
  26. {moriarty_project-0.1.22.dist-info → moriarty_project-0.1.24.dist-info}/WHEEL +0 -0
  27. {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)