-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscanner.py
More file actions
76 lines (67 loc) · 4.37 KB
/
Copy pathscanner.py
File metadata and controls
76 lines (67 loc) · 4.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import socket
import argparse
import requests
from datetime import datetime
def scan_tcp(ip, portas, arquivo_saida):
resultados = [] # Armazena os resultados da varredura
for porta in portas:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Cria um objeto de soquete TCP
sock.settimeout(2) # Define um tempo limite de 2 segundos para a conexão
resultado = sock.connect_ex((ip, porta)) # Tenta conectar ao endereço IP e porta especificados
if resultado == 0:
resultados.append(f"tcp/{porta} Open") # Adiciona a porta aberta à lista de resultados
else:
resultados.append(f"tcp/{porta} Closed") # Adiciona a porta fechada à lista de resultados
sock.close() # Fecha o soquete
if arquivo_saida: # Se um arquivo de saída for especificado
with open(arquivo_saida, 'a') as arquivo: # Abre o arquivo no modo de anexação
arquivo.write('\n'.join(resultados)) # Escreve os resultados no arquivo
arquivo.write('\n')
else:
print('\n'.join(resultados)) # Caso contrário, imprime os resultados na saída padrão
def scan_udp(ip, portas, arquivo_saida):
resultados = [] # Armazena os resultados da varredura
for porta in portas:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Cria um objeto de soquete UDP
sock.settimeout(2) # Define um tempo limite de 2 segundos para a operação
carga = bytes('noname'.encode('utf-8')) # Prepara uma carga útil de dados para enviar ao servidor UDP
sock.sendto(carga, (ip, porta)) # Envia a carga útil para o endereço IP e porta especificados
try:
dados, _ = sock.recvfrom(1024) # Tenta receber dados de volta do servidor UDP
resposta = dados.decode('utf-8').split('.') # Decodifica os dados recebidos e divide-os em partes separadas
if len(resposta) == 4 and resposta[0] == 'ACK' and resposta[1] == 'NONAME': # Se a resposta for válida (ACK.NONAME.X.X)
resultados.append(f"{porta}/udp Open") # Adiciona a porta aberta à lista de resultados
resultados.append('.'.join(resposta)) # Adiciona a resposta completa à lista de resultados
else:
resultados.append(f"{porta}/udp Closed") # Adiciona a porta fechada à lista de resultados
except socket.timeout:
resultados.append(f"{porta}/udp Closed/Filtered") # Adiciona a porta filtrada à lista de resultados
sock.close() # Fecha o soquete
if arquivo_saida: # Se um arquivo de saída for especificado
with open(arquivo_saida, 'a') as arquivo: # Abre o arquivo no modo de anexação
arquivo.write('\n'.join(resultados))# Escreve os resultados no arquivo
arquivo.write('\n')
else:
print('\n'.join(resultados)) # Caso contrário, imprime os resultados na saída padrão
def main():
parser = argparse.ArgumentParser(description='Scanner de Rede') # Cria um objeto de análise de argumentos
parser.add_argument('protocolo', choices=['tcp', 'udp'], help='Tipo de protocolo de transporte (TCP ou UDP)') # Adiciona um argumento obrigatório para especificar o protocolo
parser.add_argument('ip', help='Endereço IPv4 do host de destino') # Adiciona um argumento obrigatório para especificar o endereço IP de destino
parser.add_argument('portas', nargs='+', type=int, help='Portas a serem verificadas (separadas por vírgula)') # Adiciona um argumento obrigatório para especificar as portas a serem verificadas
parser.add_argument('--saida', '-o', help='Arquivo de saída') # Adiciona um argumento opcional para especificar um arquivo de saída
args = parser.parse_args() # Analisa os argumentos da linha de comando
if args.protocolo == 'tcp':
scan_tcp(args.ip, args.portas, args.saida) # Executa a varredura TCP
elif args.protocolo == 'udp':
scan_udp(args.ip, args.portas, args.saida) # Executa a varredura UDP
# Obtém o endereço IP da máquina local
ip = socket.gethostbyname(socket.gethostname())
# Imprime o endereço IP
print("Endereço IP local:", ip)
# Faz uma solicitação HTTP a um serviço que retorna o IP público
response = requests.get("https://api.ipify.org?format=json")
public_ip = response.json()["ip"]
# Imprime o endereço IP público
print("Endereço IP público:", public_ip)
if __name__ == '__main__':
main()