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,4 +1,4 @@
|
|
1
|
-
moriarty/__init__.py,sha256
|
1
|
+
moriarty/__init__.py,sha256=p4Djdhmv6FeCw-z_OFHcm4SkmafU1L00Iny0SkEY3Kk,85
|
2
2
|
moriarty/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
moriarty/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
moriarty/assets/modules/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -328,10 +328,10 @@ moriarty/assets/templates/vulnerabilities/xss-reflected.yaml,sha256=iG0WphhygN2p
|
|
328
328
|
moriarty/assets/templates/vulnerabilities/xxe-basic.yaml,sha256=7bG1KT5jBm8SAQp-pbjxknFuW5fIkF9yrufsq2OghRk,565
|
329
329
|
moriarty/assets/wordlists/subdomains-1000.txt,sha256=XKDCiJMJ2wnDRngglAiv7iuDnwlUIr_-LnjlNwWp4sc,8032
|
330
330
|
moriarty/cli/__init__.py,sha256=PQ8kA28EJ9h8mIK_VJtH1PtJ3xfVsF3d7IsmpZfl_Bc,54
|
331
|
-
moriarty/cli/app.py,sha256=
|
331
|
+
moriarty/cli/app.py,sha256=Y1KF8Z9I5VUyQg0HE7agy4BsGkoLyPq5JLAeKiIS0fg,7987
|
332
332
|
moriarty/cli/async_utils.py,sha256=jleTd2nyAVsNqJae2kKlo514gKKcH3nBXvfoLubOq6A,393
|
333
333
|
moriarty/cli/dns.py,sha256=QhDwe9uoAmk243XbO9YBYk3YlPmiXYT_vLqUXum9i70,2735
|
334
|
-
moriarty/cli/domain_cmd.py,sha256=
|
334
|
+
moriarty/cli/domain_cmd.py,sha256=i-NSsTqmIu0wK9VYD0e2yiBbFY4p9sdbUD1zxvRh2jk,24274
|
335
335
|
moriarty/cli/email.py,sha256=AcXMwtppFHxbjNHagrKXCdEGx-zWpvFFCB4QlCo_STU,14763
|
336
336
|
moriarty/cli/email_investigate.py,sha256=w2OlrwpRAzPNW0YLxmt-eTB3lGJ3a-oQCM4elRFJ7lw,8319
|
337
337
|
moriarty/cli/intelligence.py,sha256=81BnrS8ES7fH2lI34AMB5Yxuw-lbWvu44T2R444b-kE,11852
|
@@ -374,7 +374,7 @@ moriarty/models/relation.py,sha256=e__ewQhptimr9BZ3GdfFX9MxLLnCB5KKBfQxm-YsNj8,6
|
|
374
374
|
moriarty/models/types.py,sha256=WlNtgcF4P3XYcQLresQjfmogh-JyPC21Bd721Z6fl9I,514
|
375
375
|
moriarty/modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
376
376
|
moriarty/modules/avatar_hash.py,sha256=5Yub_N6OjUNMbt8bHShmln7i0ySDyNXrOtihWMKRivA,5919
|
377
|
-
moriarty/modules/directory_fuzzer.py,sha256=
|
377
|
+
moriarty/modules/directory_fuzzer.py,sha256=R78fxkV6prKtj7Qq0-THPpXvWGV_OeTwa9dE-j-GY-M,12581
|
378
378
|
moriarty/modules/dns_scan.py,sha256=lR1sGwhk1FXDmn6pCTrtd6Cr33uPllBpm_jqAi3-HxA,1096
|
379
379
|
moriarty/modules/domain_scanner.py,sha256=fsPDogDPnRfrocAlQGN09nUvxD501DFlZMIQ3dm8OlM,23841
|
380
380
|
moriarty/modules/email_check.py,sha256=VBAWvK3cH2Zu7wjDB2xhnqZ0scifp3s1K67CmAoUVuY,3343
|
@@ -399,25 +399,7 @@ moriarty/modules/tls_validator.py,sha256=26HoAiTv7YGiry-mya78BDDULVPC4KcOXugn9UN
|
|
399
399
|
moriarty/modules/vuln_scanner.py,sha256=-sRWOPzmrzUP9Mly471JCbP7iAxSwoho9DVn-6bFC6A,18279
|
400
400
|
moriarty/modules/waf_detector.py,sha256=5biF5OVBHbLAj_5x0ZXzCS-94bQeJNzIcYm7kMDAX0I,20744
|
401
401
|
moriarty/modules/wayback_discovery.py,sha256=sJN9at7Py-ZiUWuwnMU7fHOc_F3WwN1R3Y72qNSmxck,8573
|
402
|
-
moriarty/modules/web_crawler.py,sha256=
|
403
|
-
moriarty/modules/wifippler/__init__.py,sha256=Xb04yiG7hhKYj9d_fvxwYeH1Ss30w9ar6m92zFA0LBg,2080
|
404
|
-
moriarty/modules/wifippler/cli/__init__.py,sha256=HrNoCBUKri_rkGJnE9GTFOUPK_CIDIwmeeoWuU_d9V4,273
|
405
|
-
moriarty/modules/wifippler/cli/commands.py,sha256=XOARaL0YHwfUILXEfvYUo1tDJjcg5ucoZspxsc-B-NQ,4236
|
406
|
-
moriarty/modules/wifippler/core/__init__.py,sha256=HV1W43MqT7UQ2Ab4GOFzJYjyHPwdplBBAa9hKHjh4O0,1962
|
407
|
-
moriarty/modules/wifippler/core/scanner.py,sha256=qJfadgeAFwiHPJXftW7w70M-hPEryqrfB5HhCZA3mv4,34452
|
408
|
-
moriarty/modules/wifippler/core/attacks/__init__.py,sha256=Eg9KX2l_l1uIZO6pMq-XNTiPrdzrW4Fz2u29UjYpg1A,4788
|
409
|
-
moriarty/modules/wifippler/core/attacks/deauth.py,sha256=WdAES4XZVrNRCFVfIF7SveGLtQs7pr3yTd4BjNR8ruM,10372
|
410
|
-
moriarty/modules/wifippler/core/attacks/handshake.py,sha256=OGGtL9V69SukJXMrPyQ-NMXHGpDBsZU1-K5_Nm-iufM,16029
|
411
|
-
moriarty/modules/wifippler/core/attacks/pmkid.py,sha256=gc83t2ejr_nH2GIom_Pui4xqKSbhr4AUa8vQ-zxQ1tg,16992
|
412
|
-
moriarty/modules/wifippler/core/attacks/wep.py,sha256=GPr30ZcFwECjjs2-A7g-TutgSO3oZAZ4spjMPBOXZ0I,17299
|
413
|
-
moriarty/modules/wifippler/core/attacks/wpa.py,sha256=meYN_ZOeAghXnht2GWUpLcXAbz8miaiU3S0fB7Yw8fQ,17327
|
414
|
-
moriarty/modules/wifippler/core/attacks/wps.py,sha256=yYx6VITE3QYGBwM8J1RO6yu_r45ZLWNDWwdVMaU6xho,17504
|
415
|
-
moriarty/modules/wifippler/core/models/__init__.py,sha256=J6GPV457hbFy7Tdk2PNKzT8LnO9Cj3xqRDaQ8IoDptA,148
|
416
|
-
moriarty/modules/wifippler/core/models/network.py,sha256=vP0QNDG0PCd2D8NFVYAfr7fH0jGkRcUBYxGUVv-B1zM,7564
|
417
|
-
moriarty/modules/wifippler/core/utils/__init__.py,sha256=oY1H9qv-eYb7zE9xxfSZ3PSRB2dxJ9-K_ToxyT0xGO0,20284
|
418
|
-
moriarty/modules/wifippler/core/utils/exec.py,sha256=Dngsd3J49LMqUKEkunwIyJwjl8kjJLwCiiRfaVrQZ30,5766
|
419
|
-
moriarty/modules/wifippler/core/utils/network.py,sha256=PgpTxGhht5ynd0-OO8QQjZTSkjBIBhK0Pnv1QibCx4g,8233
|
420
|
-
moriarty/modules/wifippler/core/utils/system.py,sha256=xNrSQT1jUow46RvY8RFaNR1thUJhqW2DWhUkpuux_hY,4289
|
402
|
+
moriarty/modules/web_crawler.py,sha256=1pVLMz5vPoYFHWh2GB3ENlM2hCX07CNEXX9rKoNEI_c,20316
|
421
403
|
moriarty/net/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
422
404
|
moriarty/net/dns_cache.py,sha256=JwuDYKqmuSD-hl7PMyyQAen57ut-uvIszYrMKT-i8pY,6022
|
423
405
|
moriarty/net/dns_client.py,sha256=iem7FekC79ruwxWzG6eFkicYJi-urkRV0kNvj9uakM0,6591
|
@@ -431,7 +413,7 @@ moriarty/tests/test_email_service.py,sha256=mWqimjQRlljZNBuNePvSzhfq5FZ4mljrILGW
|
|
431
413
|
moriarty/tests/test_models.py,sha256=etklIISEUts3banaSRDSjhv-g6kd4wxucchCmlJkx6Y,1282
|
432
414
|
moriarty/tests/test_orchestrator.py,sha256=Do3M1qnbqPf_1pR3v89FXxhiwfYPZfXRvcfl05isQvs,856
|
433
415
|
moriarty/tests/test_tls_client.py,sha256=bQ46yXlIYNZwPTd8WGs6eUynHj56hVosxBycSU1gJe4,461
|
434
|
-
moriarty_project-0.1.
|
435
|
-
moriarty_project-0.1.
|
436
|
-
moriarty_project-0.1.
|
437
|
-
moriarty_project-0.1.
|
416
|
+
moriarty_project-0.1.24.dist-info/METADATA,sha256=y2VGfhCSIvtkV5IfEcieRpC4sMLhSRRlEJjsasUJ_gw,11709
|
417
|
+
moriarty_project-0.1.24.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
418
|
+
moriarty_project-0.1.24.dist-info/entry_points.txt,sha256=L4TAUKy7HAy5hT46ZqS6eNOCmUTMi4x7ehZkIkTNnuE,51
|
419
|
+
moriarty_project-0.1.24.dist-info/RECORD,,
|
@@ -1,92 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
WifiPPLER - Ferramenta Avançada de Análise de Segurança WiFi
|
3
|
-
|
4
|
-
Uma ferramenta abrangente de auditoria de segurança WiFi que combina os melhores
|
5
|
-
recursos de ferramentas existentes com técnicas modernas e uma interface limpa.
|
6
|
-
|
7
|
-
Módulos principais:
|
8
|
-
- scanner: Escaneamento de redes WiFi
|
9
|
-
- attacks: Implementações de ataques de segurança
|
10
|
-
- models: Modelos de dados
|
11
|
-
- utils: Funções utilitárias
|
12
|
-
- cli: Interface de linha de comando
|
13
|
-
"""
|
14
|
-
|
15
|
-
__version__ = "1.0.0"
|
16
|
-
__author__ = "Moriarty Team"
|
17
|
-
__license__ = "MIT"
|
18
|
-
|
19
|
-
# Importações principais
|
20
|
-
from .core.scanner import WiFiScanner
|
21
|
-
from .core.attacks import (
|
22
|
-
Attack, # Interface base para ataques
|
23
|
-
register_attack, # Decorador para registrar novos ataques
|
24
|
-
get_attack, # Obter um ataque pelo nome
|
25
|
-
list_attacks, # Listar todos os ataques disponíveis
|
26
|
-
)
|
27
|
-
|
28
|
-
# Importar ataques padrão para registro
|
29
|
-
from .core.attacks import (
|
30
|
-
WPSAttack,
|
31
|
-
WPAHandshakeAttack,
|
32
|
-
PMKIDAttack,
|
33
|
-
WEPAttack,
|
34
|
-
DeauthAttack,
|
35
|
-
HandshakeCapture
|
36
|
-
)
|
37
|
-
|
38
|
-
# Utilitários comuns
|
39
|
-
from .core.utils import (
|
40
|
-
is_root,
|
41
|
-
check_dependencies,
|
42
|
-
get_network_interfaces,
|
43
|
-
get_wireless_interfaces,
|
44
|
-
set_monitor_mode,
|
45
|
-
restore_network_interface,
|
46
|
-
start_monitor_mode,
|
47
|
-
stop_monitor_mode,
|
48
|
-
get_monitor_interfaces,
|
49
|
-
)
|
50
|
-
|
51
|
-
# Modelos de dados
|
52
|
-
from .core.models.network import WiFiNetwork, WiFiClient
|
53
|
-
|
54
|
-
# Interface CLI
|
55
|
-
from .cli.commands import app as cli_app
|
56
|
-
|
57
|
-
__all__ = [
|
58
|
-
# Classes principais
|
59
|
-
'WiFiScanner',
|
60
|
-
|
61
|
-
# Sistema de ataques
|
62
|
-
'Attack',
|
63
|
-
'register_attack',
|
64
|
-
'get_attack',
|
65
|
-
'list_attacks',
|
66
|
-
|
67
|
-
# Ataques específicos
|
68
|
-
'WPSAttack',
|
69
|
-
'WPAHandshakeAttack',
|
70
|
-
'PMKIDAttack',
|
71
|
-
'WEPAttack',
|
72
|
-
'DeauthAttack',
|
73
|
-
'HandshakeCapture',
|
74
|
-
|
75
|
-
# Utilitários
|
76
|
-
'is_root',
|
77
|
-
'check_dependencies',
|
78
|
-
'get_network_interfaces',
|
79
|
-
'get_wireless_interfaces',
|
80
|
-
'set_monitor_mode',
|
81
|
-
'restore_network_interface',
|
82
|
-
'start_monitor_mode',
|
83
|
-
'stop_monitor_mode',
|
84
|
-
'get_monitor_interfaces',
|
85
|
-
|
86
|
-
# Modelos
|
87
|
-
'WiFiNetwork',
|
88
|
-
'WiFiClient',
|
89
|
-
|
90
|
-
# CLI
|
91
|
-
'cli_app'
|
92
|
-
]
|
@@ -1,8 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Módulo CLI do WiFiPPLER.
|
3
|
-
|
4
|
-
Fornece a interface de linha de comando para interagir com as funcionalidades do WiFiPPLER.
|
5
|
-
"""
|
6
|
-
|
7
|
-
# Este arquivo é deixado intencionalmente vazio para marcar o diretório como um pacote Python.
|
8
|
-
# A implementação da CLI está em commands.py
|
@@ -1,123 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Interface de linha de comando (CLI) para o WiFiPPLER.
|
3
|
-
|
4
|
-
Utiliza Typer para criar uma interface de linha de comando amigável.
|
5
|
-
"""
|
6
|
-
import typer
|
7
|
-
from typing import Optional, List
|
8
|
-
from rich.console import Console
|
9
|
-
from rich.table import Table
|
10
|
-
|
11
|
-
# Importa o scanner e o registro de ataques
|
12
|
-
from ..core.scanner import WiFiScanner
|
13
|
-
from ..core.attacks import list_attacks, get_attack, Attack
|
14
|
-
|
15
|
-
# Cria a aplicação Typer
|
16
|
-
app = typer.Typer(help="WiFiPPLER - Ferramenta Avançada de Análise de Segurança WiFi")
|
17
|
-
console = Console()
|
18
|
-
|
19
|
-
# Instância do scanner
|
20
|
-
scanner = WiFiScanner()
|
21
|
-
|
22
|
-
@app.command()
|
23
|
-
def list_attacks():
|
24
|
-
"""Lista todos os ataques disponíveis."""
|
25
|
-
attacks = scanner.list_attacks()
|
26
|
-
|
27
|
-
if not attacks:
|
28
|
-
console.print("[yellow]Nenhum ataque registrado.[/yellow]")
|
29
|
-
return
|
30
|
-
|
31
|
-
table = Table(show_header=True, header_style="bold magenta")
|
32
|
-
table.add_column("Nome", style="cyan")
|
33
|
-
table.add_column("Descrição")
|
34
|
-
|
35
|
-
for name, attack_cls in attacks.items():
|
36
|
-
table.add_row(name, attack_cls.description)
|
37
|
-
|
38
|
-
console.print("\n[bold]Ataques disponíveis:[/bold]")
|
39
|
-
console.print(table)
|
40
|
-
|
41
|
-
@app.command()
|
42
|
-
def scan(iface: str = typer.Option(..., "--iface", "-i", help="Interface de rede a ser usada")):
|
43
|
-
"""Escaneia redes WiFi próximas."""
|
44
|
-
try:
|
45
|
-
console.print(f"[bold]Escaneando redes na interface {iface}...[/bold]")
|
46
|
-
# Implementar lógica de escaneamento aqui
|
47
|
-
networks = scanner.scan(iface=iface)
|
48
|
-
|
49
|
-
if not networks:
|
50
|
-
console.print("[yellow]Nenhuma rede encontrada.[/yellow]")
|
51
|
-
return
|
52
|
-
|
53
|
-
table = Table(show_header=True, header_style="bold green")
|
54
|
-
table.add_column("BSSID", style="cyan")
|
55
|
-
table.add_column("SSID", style="green")
|
56
|
-
table.add_column("Canal")
|
57
|
-
table.add_column("Sinal")
|
58
|
-
table.add_column("Segurança")
|
59
|
-
|
60
|
-
for net in networks:
|
61
|
-
table.add_row(
|
62
|
-
net.bssid,
|
63
|
-
net.ssid or "[dim](oculto)[/dim]",
|
64
|
-
str(net.channel),
|
65
|
-
f"{net.signal} dBm",
|
66
|
-
", ".join(net.security) if net.security else "Aberta"
|
67
|
-
)
|
68
|
-
|
69
|
-
console.print("\n[bold]Redes encontradas:[/bold]")
|
70
|
-
console.print(table)
|
71
|
-
|
72
|
-
except Exception as e:
|
73
|
-
console.print(f"[red]Erro ao escanear redes: {e}[/red]")
|
74
|
-
raise typer.Exit(1)
|
75
|
-
|
76
|
-
@app.command()
|
77
|
-
def run(
|
78
|
-
attack: str = typer.Argument(..., help="Nome do ataque a ser executado"),
|
79
|
-
iface: str = typer.Option(..., "--iface", "-i", help="Interface de rede a ser usada"),
|
80
|
-
target: Optional[str] = typer.Option(None, "--target", "-t", help="Alvo do ataque (opcional)"),
|
81
|
-
channel: Optional[int] = typer.Option(None, "--channel", "-c", help="Canal a ser monitorado (opcional)"),
|
82
|
-
):
|
83
|
-
"""Executa um ataque específico."""
|
84
|
-
try:
|
85
|
-
console.print(f"[bold]Preparando para executar o ataque: {attack}[/bold]")
|
86
|
-
|
87
|
-
# Verifica se o ataque existe
|
88
|
-
attack_cls = get_attack(attack)
|
89
|
-
if not attack_cls:
|
90
|
-
available = ", ".join(scanner.list_attacks().keys())
|
91
|
-
console.print(f"[red]Ataque '{attack}' não encontrado. Ataques disponíveis: {available}[/red]")
|
92
|
-
raise typer.Exit(1)
|
93
|
-
|
94
|
-
# Cria e executa o ataque
|
95
|
-
attack_instance = attack_cls()
|
96
|
-
|
97
|
-
# Configura parâmetros comuns
|
98
|
-
params = {
|
99
|
-
'iface': iface,
|
100
|
-
'target': target
|
101
|
-
}
|
102
|
-
|
103
|
-
if channel is not None:
|
104
|
-
params['channel'] = channel
|
105
|
-
|
106
|
-
console.print(f"[bold]Iniciando ataque {attack}...[/]")
|
107
|
-
console.print("[yellow]Pressione Ctrl+C para interromper[/yellow]")
|
108
|
-
|
109
|
-
# Executa o ataque
|
110
|
-
attack_instance.run(**params)
|
111
|
-
|
112
|
-
except KeyboardInterrupt:
|
113
|
-
console.print("\n[yellow]Ataque interrompido pelo usuário.[/yellow]")
|
114
|
-
raise typer.Exit(0)
|
115
|
-
except Exception as e:
|
116
|
-
console.print(f"[red]Erro ao executar o ataque: {e}[/red]")
|
117
|
-
if typer.get_app_dir("wifippler").startswith("DEBUG"):
|
118
|
-
import traceback
|
119
|
-
console.print(traceback.format_exc())
|
120
|
-
raise typer.Exit(1)
|
121
|
-
|
122
|
-
if __name__ == "__main__":
|
123
|
-
app()
|
@@ -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
|
-
]
|