Python - Script de Portscan em PyQt para detecção de portas abertas
Python - Script de Portscan em PyQt para detecção de portas abertas | ||
Canal Qb |
Aqui está um exemplo de código em Python 3 e PyQt que realiza um portscan usando sockets e threads:
pip install pyqt5
Script:
import sysimport threadingimport socketfrom PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QLineEditclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("CanalQb no Youtube, se inscreve lá pra dar uma força")self.setGeometry(100, 100, 500, 300)self.label_host = QLabel("Host:", self)self.label_host.move(50, 50)self.textbox_host = QLineEdit(self)self.textbox_host.move(150, 50)self.textbox_host.resize(200, 30)self.label_portas = QLabel("Portas:", self)self.label_portas.move(50, 100)self.textbox_portas = QLineEdit(self)self.textbox_portas.move(150, 100)self.textbox_portas.resize(200, 30)self.label_resultado = QLabel("", self)self.label_resultado.move(50, 200)self.button = QPushButton("Scan", self)self.button.move(150, 150)self.button.clicked.connect(self.scan)def scan(self):host = self.textbox_host.text()portas = self.textbox_portas.text().split(",")self.label_resultado.setText("Scanning...")for porta in portas:t = threading.Thread(target=self.scan_porta, args=(host, int(porta)))t.start()def scan_porta(self, host, porta):sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(1)resultado = sock.connect_ex((host, porta))if resultado == 0:self.label_resultado.setText("Porta " + str(porta) + " aberta")app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())
Este script cria uma janela com campos de entrada para o host e as portas a serem escaneadas, além de um botão "Scan" para iniciar o portscan. Quando o usuário clica no botão, o programa inicia uma thread para cada porta a ser escaneada. Cada thread tenta se conectar à porta usando um socket TCP. Se a porta estiver aberta, o programa atualiza um rótulo na janela para indicar que a porta está aberta.
Observe que usamos a função split() para separar as portas inseridas pelo usuário em uma lista. Também usamos a função threading.Thread() para criar uma nova thread para cada porta a ser escaneada. Finalmente, usamos o método connect_ex() do objeto socket para tentar se conectar à porta. Se a porta estiver aberta, o método retorna 0.
Agora se você quiser algo um pouco melhorado, segue um para TCP e UDP
import socketimport threadingfrom PyQt5 import QtWidgets, QtCoreclass Portscan(QtWidgets.QWidget):def __init__(self):super().__init__()self.init_ui()def init_ui(self):self.setWindowTitle('CanalQb no Youtube, se inscreve lá pra dar uma força')self.setGeometry(100, 100, 400, 300)self.host_label = QtWidgets.QLabel('Host:', self)self.host_label.move(20, 20)self.host_input = QtWidgets.QLineEdit(self)self.host_input.move(80, 20)self.start_port_label = QtWidgets.QLabel('Porta Inicial:', self)self.start_port_label.move(20, 60)self.start_port_input = QtWidgets.QLineEdit(self)self.start_port_input.move(80, 60)self.end_port_label = QtWidgets.QLabel('Porta Final:', self)self.end_port_label.move(20, 100)self.end_port_input = QtWidgets.QLineEdit(self)self.end_port_input.move(80, 100)self.tcp_scan_button = QtWidgets.QPushButton('Scan TCP', self)self.tcp_scan_button.clicked.connect(self.scan_tcp_ports)self.tcp_scan_button.move(20, 140)self.udp_scan_button = QtWidgets.QPushButton('Scan UDP', self)self.udp_scan_button.clicked.connect(self.scan_udp_ports)self.udp_scan_button.move(120, 140)self.results_list = QtWidgets.QListWidget(self)self.results_list.move(20, 180)self.show()def scan_tcp_ports(self):self.results_list.clear()host = self.host_input.text()start_port = int(self.start_port_input.text())end_port = int(self.end_port_input.text())for port in range(start_port, end_port + 1):t = threading.Thread(target=self.tcp_scan, args=(host, port))t.start()def scan_udp_ports(self):self.results_list.clear()host = self.host_input.text()start_port = int(self.start_port_input.text())end_port = int(self.end_port_input.text())for port in range(start_port, end_port + 1):t = threading.Thread(target=self.udp_scan, args=(host, port))t.start()def tcp_scan(self, host, port):try:with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:s.settimeout(0.5)if s.connect_ex((host, port)) == 0:self.results_list.addItem(f'Porta {port} aberta (TCP)')except:passdef udp_scan(self, host, port):try:with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:s.settimeout(0.5)s.sendto(b'', (host, port))if s.recvfrom(1024):self.results_list.addItem(f'Porta {port} aberta (UDP)')except:passapp = QtWidgets.QApplication([])portscan = Portscan()app.exec_()
Atendendo a pedidos,
segue mais uma versão com listbox incluída:
Instale:
pip install PyQtDataVisualization
Monte o código:
import sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, QWidget, QGroupBox, QListWidget, QLineEdit, QVBoxLayout, QHBoxLayout, QPushButton, QMessageBoxfrom PyQt5.QtGui import QFontimport socketclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Port Scanner")self.setGeometry(100, 100, 600, 400)# Criando um label para o IPip_label = QLabel("Digite o IP:", self)ip_label.setFont(QFont("Arial", 12))# Criando um line edit para o IPself.ip_edit = QLineEdit(self)self.ip_edit.setFont(QFont("Arial", 12))# Criando um botão para scanear as portasscan_button = QPushButton("Scan", self)scan_button.setFont(QFont("Arial", 12))scan_button.clicked.connect(self.scan_ports)# Criando uma listbox para mostrar as portas abertasself.port_list = QListWidget(self)self.port_list.setFont(QFont("Arial", 12))# Criando um grupo box para o input e botãoinput_groupbox = QGroupBox("Port Scanner")input_layout = QGridLayout()input_layout.addWidget(ip_label, 0, 0)input_layout.addWidget(self.ip_edit, 0, 1)input_layout.addWidget(scan_button, 0, 2)input_groupbox.setLayout(input_layout)# Criando um grupo box para a listboxlistbox_groupbox = QGroupBox("Portas Abertas")listbox_layout = QGridLayout()listbox_layout.addWidget(self.port_list)listbox_groupbox.setLayout(listbox_layout)# Criando um layout principalmain_layout = QGridLayout()main_layout.addWidget(input_groupbox, 0, 0)main_layout.addWidget(listbox_groupbox, 1, 0)# Criando um widget central e definindo o layout principalcentral_widget = QWidget()central_widget.setLayout(main_layout)self.setCentralWidget(central_widget)def scan_ports(self):# Obtendo o IP a partir do line editip = self.ip_edit.text()# Fazendo a varredura de portasopen_ports = []for port in range(80, 91):sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(1)result = sock.connect_ex((ip, port))if result == 0:open_ports.append((port, "aberta"))else:open_ports.append((port, "fechada"))sock.close()# Adicionando as portas abertas na listboxself.port_list.clear()for port in open_ports:self.port_list.addItem(f"Porta {port[0]} - {port[1]}")if __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())
Nenhum comentário
Comente só assim vamos crescer juntos!
Observação: somente um membro deste blog pode postar um comentário.