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,182 +0,0 @@
1
- """
2
- Módulo de execução de comandos para o WiFiPPLER.
3
-
4
- Fornece funções para execução segura de comandos de sistema.
5
- """
6
- import asyncio
7
- import shlex
8
- import logging
9
- import subprocess
10
- from typing import List, Optional, Union, Dict, Any, Tuple
11
-
12
- logger = logging.getLogger(__name__)
13
-
14
- def run_command(
15
- cmd: Union[str, List[str]],
16
- capture_output: bool = False,
17
- check: bool = True,
18
- **kwargs
19
- ) -> subprocess.CompletedProcess:
20
- """Executa um comando no shell com tratamento de erros.
21
-
22
- Args:
23
- cmd: Comando a ser executado (string ou lista)
24
- capture_output: Se deve capturar a saída padrão e de erro
25
- check: Se deve lançar uma exceção em caso de código de saída diferente de zero
26
- **kwargs: Argumentos adicionais para subprocess.run()
27
-
28
- Returns:
29
- subprocess.CompletedProcess: Resultado da execução do comando
30
-
31
- Raises:
32
- subprocess.CalledProcessError: Se check=True e o comando retornar código de saída não zero
33
- """
34
- # Configura os argumentos padrão
35
- kwargs.setdefault('stdout', subprocess.PIPE if capture_output else None)
36
- kwargs.setdefault('stderr', subprocess.PIPE if capture_output else None)
37
- kwargs.setdefault('text', True)
38
-
39
- # Converte o comando para lista se for string
40
- if isinstance(cmd, str):
41
- cmd = shlex.split(cmd)
42
-
43
- # Executa o comando
44
- try:
45
- logger.debug(f"Executando comando: {' '.join(cmd)}")
46
- result = subprocess.run(cmd, check=check, **kwargs)
47
- return result
48
- except subprocess.CalledProcessError as e:
49
- logger.error(f"Erro ao executar comando: {e}")
50
- if capture_output:
51
- logger.error(f"Saída de erro: {e.stderr}")
52
- raise
53
- except Exception as e:
54
- logger.error(f"Erro inesperado ao executar comando: {e}")
55
- raise
56
-
57
- async def run_command_async(
58
- cmd: Union[str, List[str]],
59
- **kwargs
60
- ) -> subprocess.CompletedProcess:
61
- """Executa um comando de forma assíncrona.
62
-
63
- Args:
64
- cmd: Comando a ser executado (string ou lista)
65
- **kwargs: Argumentos adicionais para asyncio.create_subprocess_exec()
66
-
67
- Returns:
68
- subprocess.CompletedProcess: Resultado da execução do comando
69
- """
70
- # Converte o comando para lista se for string
71
- if isinstance(cmd, str):
72
- cmd = shlex.split(cmd)
73
-
74
- # Configura os argumentos padrão
75
- kwargs.setdefault('stdout', subprocess.PIPE)
76
- kwargs.setdefault('stderr', subprocess.PIPE)
77
- kwargs.setdefault('text', True)
78
-
79
- logger.debug(f"Executando comando assíncrono: {' '.join(cmd)}")
80
-
81
- try:
82
- # Cria o processo assíncrono
83
- process = await asyncio.create_subprocess_exec(
84
- cmd[0],
85
- *cmd[1:],
86
- **kwargs
87
- )
88
-
89
- # Aguarda a conclusão do processo
90
- stdout, stderr = await process.communicate()
91
-
92
- # Cria um objeto CompletedProcess com o resultado
93
- return subprocess.CompletedProcess(
94
- args=cmd,
95
- returncode=process.returncode,
96
- stdout=stdout,
97
- stderr=stderr
98
- )
99
- except Exception as e:
100
- logger.error(f"Erro ao executar comando assíncrono: {e}")
101
- raise
102
-
103
- def run_sudo_command(
104
- cmd: Union[str, List[str]],
105
- password: Optional[str] = None,
106
- **kwargs
107
- ) -> subprocess.CompletedProcess:
108
- """Executa um comando com privilégios de superusuário.
109
-
110
- Args:
111
- cmd: Comando a ser executado (sem o 'sudo')
112
- password: Senha do usuário (opcional, pode ser solicitada interativamente)
113
- **kwargs: Argumentos adicionais para run_command()
114
-
115
- Returns:
116
- subprocess.CompletedProcess: Resultado da execução do comando
117
- """
118
- if isinstance(cmd, str):
119
- cmd = shlex.split(cmd)
120
-
121
- # Adiciona o sudo ao início do comando
122
- sudo_cmd = ['sudo']
123
-
124
- # Se uma senha for fornecida, usa o -S para ler do stdin
125
- if password is not None:
126
- sudo_cmd.extend(['-S'])
127
-
128
- sudo_cmd.extend(cmd)
129
-
130
- # Se uma senha for fornecida, envia pelo stdin
131
- if password is not None:
132
- kwargs['input'] = f"{password}\n"
133
-
134
- return run_command(sudo_cmd, **kwargs)
135
-
136
- def command_success(cmd: str) -> bool:
137
- """Verifica se um comando é executado com sucesso.
138
-
139
- Args:
140
- cmd: Comando a ser verificado
141
-
142
- Returns:
143
- bool: True se o comando for executado com sucesso, False caso contrário
144
- """
145
- try:
146
- run_command(cmd, capture_output=True, check=True)
147
- return True
148
- except subprocess.CalledProcessError:
149
- return False
150
-
151
- def get_command_output(cmd: Union[str, List[str]], **kwargs) -> str:
152
- """Executa um comando e retorna sua saída padrão.
153
-
154
- Args:
155
- cmd: Comando a ser executado
156
- **kwargs: Argumentos adicionais para run_command()
157
-
158
- Returns:
159
- str: Saída padrão do comando
160
-
161
- Raises:
162
- subprocess.CalledProcessError: Se o comando retornar código de saída não zero
163
- """
164
- kwargs['capture_output'] = True
165
- result = run_command(cmd, **kwargs)
166
- return result.stdout.strip()
167
-
168
- def get_command_output_safe(cmd: Union[str, List[str]], default: str = "", **kwargs) -> str:
169
- """Executa um comando e retorna sua saída padrão ou um valor padrão em caso de erro.
170
-
171
- Args:
172
- cmd: Comando a ser executado
173
- default: Valor padrão a ser retornado em caso de erro
174
- **kwargs: Argumentos adicionais para run_command()
175
-
176
- Returns:
177
- str: Saída padrão do comando ou o valor padrão em caso de erro
178
- """
179
- try:
180
- return get_command_output(cmd, **kwargs)
181
- except (subprocess.CalledProcessError, FileNotFoundError):
182
- return default
@@ -1,262 +0,0 @@
1
- """
2
- Módulo de utilidades de rede para o WiFiPPLER.
3
-
4
- Fornece funções para manipulação de interfaces de rede, endereçamento e operações relacionadas.
5
- """
6
- import os
7
- import re
8
- import socket
9
- import fcntl
10
- import struct
11
- import array
12
- import platform
13
- from typing import Dict, List, Optional, Union, Any
14
-
15
- # Constantes para chamadas de sistema
16
- SIOCGIFHWADDR = 0x8927 # Get hardware address
17
- SIOCGIFADDR = 0x8915 # Get IP address
18
- SIOCGIFNETMASK = 0x891B # Get netmask
19
- SIOCGIFBRDADDR = 0x8919 # Get broadcast address
20
- SIOCGIFMTU = 0x8921 # Get MTU
21
- SIOCGIFINDEX = 0x8933 # Get interface index
22
- SIOCGIFNAME = 0x8910 # Get interface name
23
- SIOCGIFFLAGS = 0x8913 # Get interface flags
24
- SIOCSIFFLAGS = 0x8914 # Set interface flags
25
-
26
- # Flags de interface
27
- IFF_UP = 0x1
28
- IFF_BROADCAST = 0x2
29
- IFF_DEBUG = 0x4
30
- IFF_LOOPBACK = 0x8
31
- IFF_POINTOPOINT = 0x10
32
- IFF_NOTRAILERS = 0x20
33
- IFF_RUNNING = 0x40
34
- IFF_NOARP = 0x80
35
- IFF_PROMISC = 0x100
36
- IFF_ALLMULTI = 0x200
37
- IFF_MASTER = 0x400
38
- IFF_SLAVE = 0x800
39
- IFF_MULTICAST = 0x1000
40
- IFF_PORTSEL = 0x2000
41
- IFF_AUTOMEDIA = 0x4000
42
- IFF_DYNAMIC = 0x8000
43
- IFF_LOWER_UP = 0x10000
44
- IFF_DORMANT = 0x20000
45
- IFF_ECHO = 0x40000
46
-
47
- def get_interface_mac(interface: str) -> Optional[str]:
48
- """Obtém o endereço MAC de uma interface de rede.
49
-
50
- Args:
51
- interface: Nome da interface de rede
52
-
53
- Returns:
54
- str: Endereço MAC formatado ou None se não encontrado
55
- """
56
- try:
57
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
58
- info = fcntl.ioctl(s.fileno(), SIOCGIFHWADDR, struct.pack('256s', interface[:15].encode('utf-8')))
59
- return ':'.join(f'{b:02x}' for b in info[18:24])
60
- except (IOError, OSError):
61
- return None
62
-
63
- def get_interface_ip(interface: str) -> Optional[str]:
64
- """Obtém o endereço IP de uma interface de rede.
65
-
66
- Args:
67
- interface: Nome da interface de rede
68
-
69
- Returns:
70
- str: Endereço IP ou None se não encontrado
71
- """
72
- try:
73
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
74
- return socket.inet_ntoa(fcntl.ioctl(
75
- s.fileno(),
76
- SIOCGIFADDR,
77
- struct.pack('256s', interface[:15].encode('utf-8'))
78
- )[20:24])
79
- except (IOError, OSError):
80
- return None
81
-
82
- def get_interface_netmask(interface: str) -> Optional[str]:
83
- """Obtém a máscara de rede de uma interface.
84
-
85
- Args:
86
- interface: Nome da interface de rede
87
-
88
- Returns:
89
- str: Máscara de rede ou None se não encontrada
90
- """
91
- try:
92
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
93
- return socket.inet_ntoa(fcntl.ioctl(
94
- s.fileno(),
95
- SIOCGIFNETMASK,
96
- struct.pack('256s', interface[:15].encode('utf-8'))
97
- )[20:24])
98
- except (IOError, OSError):
99
- return None
100
-
101
- def get_interface_gateway(interface: str) -> Optional[str]:
102
- """Obtém o gateway padrão de uma interface.
103
-
104
- Args:
105
- interface: Nome da interface de rede
106
-
107
- Returns:
108
- str: Endereço do gateway ou None se não encontrado
109
- """
110
- try:
111
- # Lê a tabela de roteamento
112
- with open('/proc/net/route') as f:
113
- for line in f:
114
- fields = line.strip().split()
115
- if len(fields) >= 2 and fields[0] == interface and fields[1] == '00000000':
116
- # Converte o endereço hex para IP
117
- return socket.inet_ntoa(struct.pack('<L', int(fields[2], 16)))
118
- except (IOError, OSError):
119
- pass
120
- return None
121
-
122
- def is_wireless_interface(interface: str) -> bool:
123
- """Verifica se uma interface é sem fio.
124
-
125
- Args:
126
- interface: Nome da interface de rede
127
-
128
- Returns:
129
- bool: True se for uma interface sem fio, False caso contrário
130
- """
131
- # Verifica se a interface existe em /sys/class/net/
132
- if not os.path.exists(f'/sys/class/net/{interface}'):
133
- return False
134
-
135
- # Verifica se é uma interface wireless
136
- wireless_path = f'/sys/class/net/{interface}/wireless'
137
- return os.path.exists(wireless_path)
138
-
139
- def get_wireless_interfaces() -> List[Dict[str, Any]]:
140
- """Obtém uma lista de interfaces de rede sem fio.
141
-
142
- Returns:
143
- List[Dict[str, Any]]: Lista de dicionários com informações das interfaces
144
- """
145
- interfaces = []
146
-
147
- # Lista todos os diretórios em /sys/class/net
148
- for iface in os.listdir('/sys/class/net'):
149
- if is_wireless_interface(iface):
150
- interfaces.append({
151
- 'name': iface,
152
- 'mac': get_interface_mac(iface),
153
- 'ip': get_interface_ip(iface),
154
- 'wireless': True,
155
- 'up': is_interface_up(iface),
156
- 'mtu': get_interface_mtu(iface)
157
- })
158
-
159
- return interfaces
160
-
161
- def is_interface_up(interface: str) -> bool:
162
- """Verifica se uma interface de rede está ativa.
163
-
164
- Args:
165
- interface: Nome da interface de rede
166
-
167
- Returns:
168
- bool: True se a interface estiver ativa, False caso contrário
169
- """
170
- try:
171
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
172
- flags = struct.unpack('H', fcntl.ioctl(
173
- s.fileno(),
174
- SIOCGIFFLAGS,
175
- struct.pack('256s', interface[:15].encode('utf-8'))
176
- )[16:18])[0]
177
- return bool(flags & IFF_UP)
178
- except (IOError, OSError):
179
- return False
180
-
181
- def get_interface_mtu(interface: str) -> int:
182
- """Obtém o MTU de uma interface de rede.
183
-
184
- Args:
185
- interface: Nome da interface de rede
186
-
187
- Returns:
188
- int: Valor do MTU ou 1500 (padrão) se não for possível obter
189
- """
190
- try:
191
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
192
- ifreq = struct.pack('256s', interface.encode('utf-8')[:15])
193
- mtu = fcntl.ioctl(s.fileno(), SIOCGIFMTU, ifreq)
194
- return struct.unpack('H', mtu[16:18])[0]
195
- except (IOError, OSError, struct.error):
196
- return 1500 # Valor padrão para MTU
197
-
198
-
199
- def get_network_interfaces() -> List[Dict[str, Any]]:
200
- """Obtém uma lista de todas as interfaces de rede.
201
-
202
- Returns:
203
- List[Dict[str, Any]]: Lista de dicionários com informações das interfaces
204
- """
205
- interfaces = []
206
-
207
- try:
208
- # Lista todos os diretórios em /sys/class/net
209
- for iface in os.listdir('/sys/class/net'):
210
- if iface == 'lo': # Ignora a interface de loopback
211
- continue
212
-
213
- # Verifica se é uma interface wireless
214
- is_wireless = is_wireless_interface(iface)
215
-
216
- interfaces.append({
217
- 'name': iface,
218
- 'mac': get_interface_mac(iface),
219
- 'ip': get_interface_ip(iface),
220
- 'wireless': is_wireless,
221
- 'up': is_interface_up(iface),
222
- 'mtu': get_interface_mtu(iface)
223
- })
224
- except Exception as e:
225
- print(f"Erro ao listar interfaces de rede: {e}")
226
-
227
- return interfaces
228
-
229
-
230
- def get_monitor_interfaces() -> List[Dict[str, Any]]:
231
- """Obtém uma lista de interfaces de rede em modo monitor.
232
-
233
- Returns:
234
- List[Dict[str, Any]]: Lista de dicionários com informações das interfaces em modo monitor
235
- """
236
- monitor_interfaces = []
237
-
238
- try:
239
- # Obtém todas as interfaces de rede
240
- interfaces = get_network_interfaces()
241
-
242
- # Filtra apenas as interfaces sem fio
243
- wireless_interfaces = [iface for iface in interfaces if iface.get('wireless')]
244
-
245
- # Verifica quais interfaces estão em modo monitor
246
- for iface in wireless_interfaces:
247
- ifname = iface['name']
248
-
249
- # Verifica se a interface está em modo monitor
250
- try:
251
- with open(f'/sys/class/net/{ifname}/type', 'r') as f:
252
- iftype = int(f.read().strip())
253
- # O tipo 803 indica modo monitor (IEEE80211_IF_TYPE_MONITOR)
254
- if iftype == 803:
255
- monitor_interfaces.append(iface)
256
- except (IOError, ValueError):
257
- continue
258
-
259
- except Exception as e:
260
- print(f"Erro ao listar interfaces em modo monitor: {e}")
261
-
262
- return monitor_interfaces
@@ -1,153 +0,0 @@
1
- """
2
- Módulo de utilidades do sistema para o WiFiPPLER.
3
-
4
- Fornece funções para verificação de permissões, dependências e outras operações do sistema.
5
- """
6
- import os
7
- import sys
8
- import subprocess
9
- import shutil
10
- from typing import List, Optional, Union, Dict, Any
11
-
12
- def is_root() -> bool:
13
- """Verifica se o script está sendo executado como root.
14
-
15
- Returns:
16
- bool: True se for root, False caso contrário
17
- """
18
- return os.geteuid() == 0
19
-
20
- def command_exists(cmd: str) -> bool:
21
- """Verifica se um comando existe no sistema.
22
-
23
- Args:
24
- cmd: Nome do comando a ser verificado
25
-
26
- Returns:
27
- bool: True se o comando existir, False caso contrário
28
- """
29
- return shutil.which(cmd) is not None
30
-
31
- def check_dependencies() -> List[str]:
32
- """Verifica as dependências necessárias para o funcionamento do WiFiPPLER.
33
-
34
- Returns:
35
- List[str]: Lista de dependências ausentes
36
- """
37
- required_commands = [
38
- 'iwconfig',
39
- 'ifconfig',
40
- 'iw',
41
- 'aircrack-ng',
42
- 'airodump-ng',
43
- 'aireplay-ng',
44
- 'airmon-ng',
45
- 'macchanger'
46
- ]
47
-
48
- missing = []
49
- for cmd in required_commands:
50
- if not command_exists(cmd):
51
- missing.append(cmd)
52
-
53
- return missing
54
-
55
- def get_os_info() -> Dict[str, str]:
56
- """Obtém informações sobre o sistema operacional.
57
-
58
- Returns:
59
- Dict[str, str]: Dicionário com informações do sistema
60
- """
61
- import platform
62
-
63
- return {
64
- 'system': platform.system(),
65
- 'node': platform.node(),
66
- 'release': platform.release(),
67
- 'version': platform.version(),
68
- 'machine': platform.machine(),
69
- 'processor': platform.processor(),
70
- 'python_version': platform.python_version()
71
- }
72
-
73
- def ensure_root() -> None:
74
- """Verifica se o script está sendo executado como root.
75
-
76
- Raises:
77
- RuntimeError: Se não estiver sendo executado como root
78
- """
79
- if not is_root():
80
- raise RuntimeError("Este script requer privilégios de superusuário (root). Execute com sudo.")
81
-
82
- def ensure_dependencies() -> None:
83
- """Verifica se todas as dependências estão instaladas.
84
-
85
- Raises:
86
- RuntimeError: Se alguma dependência estiver faltando
87
- """
88
- missing = check_dependencies()
89
- if missing:
90
- raise RuntimeError(
91
- f"As seguintes dependências estão faltando: {', '.join(missing)}\n"
92
- "Por favor, instale-as antes de continuar."
93
- )
94
-
95
- def get_available_interfaces() -> List[str]:
96
- """Obtém uma lista de interfaces de rede disponíveis.
97
-
98
- Returns:
99
- List[str]: Lista de nomes de interfaces de rede
100
- """
101
- try:
102
- return [
103
- iface for iface in os.listdir('/sys/class/net/')
104
- if iface != 'lo' # Ignora interface de loopback
105
- ]
106
- except (OSError, IOError):
107
- return []
108
-
109
- def get_wireless_interfaces() -> List[str]:
110
- """Obtém uma lista de interfaces de rede sem fio disponíveis.
111
-
112
- Returns:
113
- List[str]: Lista de nomes de interfaces sem fio
114
- """
115
- try:
116
- return [
117
- iface for iface in os.listdir('/sys/class/net/')
118
- if os.path.exists(f'/sys/class/net/{iface}/wireless')
119
- ]
120
- except (OSError, IOError):
121
- return []
122
-
123
- def get_interface_info(interface: str) -> Dict[str, Any]:
124
- """Obtém informações detalhadas sobre uma interface de rede.
125
-
126
- Args:
127
- interface: Nome da interface de rede
128
-
129
- Returns:
130
- Dict[str, Any]: Dicionário com informações da interface
131
- """
132
- return {
133
- 'name': interface,
134
- 'wireless': os.path.exists(f'/sys/class/net/{interface}/wireless'),
135
- 'state': get_interface_state(interface),
136
- 'mac_address': get_interface_mac(interface),
137
- 'ip_address': get_interface_ip(interface)
138
- }
139
-
140
- def get_interface_state(interface: str) -> str:
141
- """Obtém o estado atual de uma interface de rede.
142
-
143
- Args:
144
- interface: Nome da interface de rede
145
-
146
- Returns:
147
- str: Estado da interface (up/down/unknown)
148
- """
149
- try:
150
- with open(f'/sys/class/net/{interface}/operstate', 'r') as f:
151
- return f.read().strip()
152
- except (OSError, IOError):
153
- return 'unknown'