Ultimas do CanalQb

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 sys
import threading
import socket
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QLineEdit

class 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 socket
import threading
from PyQt5 import QtWidgets, QtCore

class 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:
            pass

    def 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:
            pass

app = 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 sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, QWidget, QGroupBox, QListWidget, QLineEdit, QVBoxLayout, QHBoxLayout, QPushButton, QMessageBox


from PyQt5.QtGui import QFont
import socket

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Port Scanner")
        self.setGeometry(100, 100, 600, 400)
        
        # Criando um label para o IP
        ip_label = QLabel("Digite o IP:", self)
        ip_label.setFont(QFont("Arial", 12))
        
        # Criando um line edit para o IP
        self.ip_edit = QLineEdit(self)
        self.ip_edit.setFont(QFont("Arial", 12))
        
        # Criando um botão para scanear as portas
        scan_button = QPushButton("Scan", self)
        scan_button.setFont(QFont("Arial", 12))
        scan_button.clicked.connect(self.scan_ports)
        
        # Criando uma listbox para mostrar as portas abertas
        self.port_list = QListWidget(self)
        self.port_list.setFont(QFont("Arial", 12))
        
        # Criando um grupo box para o input e botão
        input_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 listbox
        listbox_groupbox = QGroupBox("Portas Abertas")
        listbox_layout = QGridLayout()
        listbox_layout.addWidget(self.port_list)
        listbox_groupbox.setLayout(listbox_layout)
        
        # Criando um layout principal
        main_layout = QGridLayout()
        main_layout.addWidget(input_groupbox, 0, 0)
        main_layout.addWidget(listbox_groupbox, 1, 0)
        
        # Criando um widget central e definindo o layout principal
        central_widget = QWidget()
        central_widget.setLayout(main_layout)
        self.setCentralWidget(central_widget)
        
    def scan_ports(self):
        # Obtendo o IP a partir do line edit
        ip = self.ip_edit.text()
        
        # Fazendo a varredura de portas
        open_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 listbox
        self.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.