Qué es

Mi Trabajo Fin de Grado de ASIR: una aplicación de escritorio en Python (interfaz con CustomTkinter) que combina dos herramientas en un único cliente: un escáner de puertos/hosts con fingerprinting de sistema operativo, y un chat cliente-servidor cifrado con TLS/SSL, autenticación por roles y panel de administración.

Por qué lo hice

Quería un proyecto final que no fuera solo “una cosa”, sino que tocara varias partes de lo aprendido en el ciclo: redes a bajo nivel (sockets, Scapy, fragmentación de paquetes), seguridad (cifrado, censura, control de acceso) y una interfaz gráfica real que alguien pudiera usar sin tocar la terminal.

Cómo funciona

El escaneo de puertos usa Scapy para construir paquetes TCP/IP a medida (SYN scans, fragmentación, fingerprinting por banners), mientras que el chat monta un servidor multihilo donde cada cliente se atiende en su propio hilo:

context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile="server-cert.pem", keyfile="server-key.key")
server_socket = context.wrap_socket(server_socket, server_side=True)

while True:
    client_socket, address = server_socket.accept()
    clients.append(client_socket)
    thread = threading.Thread(target=client_thread, args=(client_socket, clients, usernames))
    thread.daemon = True
    thread.start()

Un UserManager gestiona usuarios, roles (user/admin) y bloqueos, y el panel de administración permite expulsar, banear o crear usuarios sin tocar el servidor directamente.

He escrito el desglose técnico completo de la herramienta —escáner de puertos con fingerprinting de SO, escáner de hosts por ARP con topología visual, y la arquitectura del chat cifrado.

// Desglose técnico completo TFG: escáner de red y chat cifrado en Python

Stack

Pieza Uso
Python Lógica de cliente, servidor y escáner
CustomTkinter Interfaz gráfica
Scapy Construcción de paquetes para el escáner
SSL/TLS Cifrado de la comunicación del chat
Threading Servidor multicliente y recepción sin bloqueo

Qué aprendí

La fragmentación manual de paquetes IPv4 fue la parte que más me costó — probé con Scapy y con raw sockets, y ninguno de los dos consiguió que los fragmentos llegaran a verse en las capturas de red, probablemente por reensamblado a nivel de kernel. Ahí aprendí más de las limitaciones reales del sistema operativo que si hubiera funcionado a la primera.