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,4 +1,4 @@
1
- moriarty/__init__.py,sha256=-vTPkKzGx_K-QAVtGkAJOndmDwYSTRh-3sRSKmWOfBU,85
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=eszaYMs7PfFS0e7B31FZ-ratFHKzs4S7KCvAiAljh24,7992
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=CgpTN0kMKlAvrH72wDPuAodXOhBb0hgR4HBfZYfSTEg,24193
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=xrRst5LIghLJDpH_bzd02uo47kx1br8z7KtTxICGZak,11703
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=hxWbnD2GO_IbIb2FChCxCesgGu4dNhlloVqr5u1MC1k,5890
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.22.dist-info/METADATA,sha256=K9jYJmYY0RhmohYPkJcn6apqjLMnLuVYTJs5WFQ2RWw,11709
435
- moriarty_project-0.1.22.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
436
- moriarty_project-0.1.22.dist-info/entry_points.txt,sha256=L4TAUKy7HAy5hT46ZqS6eNOCmUTMi4x7ehZkIkTNnuE,51
437
- moriarty_project-0.1.22.dist-info/RECORD,,
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
- ]