Creé un Escáner de Puertos desde Cero con Python
Introducción y Objetivo del Video
Presentación del Canal
- Chavales, muy buenas y bienvenidos a otro vídeo del canal secundario. Espero que todo esté yendo correctamente por ahí.
Mejora en la Calidad de la Cámara
- Se ha adquirido un nuevo objetivo para la cámara, lo que podría mejorar la calidad visual del contenido. Aunque es un cambio mínimo, se espera que sea notorio para los espectadores.
Tema Principal: Escáner de Puertos con Python
- En el video se enseñará a crear un escáner de puertos similar a Nmap, pero más simplificado para evitar complicaciones innecesarias. La idea es desarrollar un escáner eficiente y potente utilizando Python.
Teoría Necesaria para el Proyecto
Importancia de Entender Protocolos
- Es crucial entender aspectos como capas y encapsulamientos al construir paquetes desde cero con Scapy en Python, lo cual ayudará a evitar problemas durante el proceso de creación.
Expectativas del Aprendizaje
- Se espera que esta clase sea interesante y útil para comprender mejor cómo funcionan las cosas a nivel más bajo en redes informáticas. Se anima a los espectadores a apoyar el video con "likes".
Configuración Inicial y Escaneo TCP
Uso de Arch Linux
- El presentador utiliza Arch Linux como sistema operativo en su máquina virtual para realizar las demostraciones prácticas relacionadas con el escaneo de puertos.
Ejemplo Práctico: Escaneo TCP Connect Scan
- Se realizará un escaneo inicial usando Nmap para verificar si el puerto 80 está abierto o cerrado, explicando cómo funciona el proceso de tres vías (three-way handshake) involucrado en este tipo de escaneo.
Captura de Paquetes con T-Shark
Captura Inicial
- Se utilizará T-shark para capturar tramas durante el escaneo TCP Connect Scan, comenzando por enviar un paquete SYN al puerto 80 y esperando una respuesta SYN ACK del servidor.
Filtrado Efectivo
- Para evitar ruido en los datos capturados, se establecerán filtros específicos en T-shark que permitan capturar solo los paquetes relevantes (SYN, SYN ACK). Esto optimiza la captura al enfocarse únicamente en lo necesario.
Construcción Manual de Paquetes
Configuración Avanzada de Filtros
- Al configurar filtros avanzados en T-shark, se puede especificar qué tipo de tramas se desean capturar (SYN o ACK), así como definir puertos específicos tanto destino como origen según sea necesario durante las pruebas.
Proceso Iterativo
- El presentador explica cómo lanzar múltiples intentos para observar diferentes respuestas desde el servidor al cambiar dinámicamente los parámetros utilizados durante cada intento de captura. Esto permite ver variaciones en las respuestas recibidas dependiendo del estado del puerto objetivo (abierto/cerrado).
Escaneo de Puertos: Entendiendo el Proceso
Introducción al Escaneo de Puertos
- Se presenta un seguimiento detallado del comportamiento de los puertos abiertos y cerrados, comenzando con la observación de respuestas cuando se envía un paquete SYN.
- Al enviar un paquete SYN a un puerto cerrado (ejemplo: puerto 83), no se recibe una respuesta SYN-ACK, lo que indica que el puerto está inactivo.
Respuestas a Paquetes en Puertos Cerrados
- Cuando el puerto está cerrado, la respuesta esperada es un paquete RST (reset), lo cual es crucial para reportar el estado del puerto.
- La confirmación de que el puerto está cerrado se realiza mediante la recepción de un paquete RST tras enviar el SYN.
Diferencias entre TCP Connect Scan y Stealth Scan
- En el escaneo sigiloso (stealth scan), se envía un SYN y se recibe un SYN-ACK, pero no se completa la conexión con un ACK; en su lugar, se envía un paquete RST.
- Este método evita dejar registros en los logs del sistema, lo que permite realizar escaneos sin ser detectado.
Implementación Práctica del Escaneo
- Para llevar a cabo el escaneo sigiloso, es necesario configurar correctamente los parámetros como source port y destination port antes de ejecutar las pruebas.
- La ausencia de una trama final ACK confirma que no hay conexión establecida; en su lugar, solo se observa el paquete RST.
Preparativos para Crear un Script de Escaneo
- Es recomendable operar como usuario root para evitar restricciones durante la ejecución del script. Se sugiere crear un entorno virtual utilizando Python para evitar conflictos con otros paquetes.
- Se inicia la creación del script
scanner.py, donde se definirán las funciones necesarias para realizar el escaneo y manejar los argumentos como target y puertos específicos.
Ejecución del Escaneo
- El flujo inicial del programa comienza definiendo cómo procederá con las instrucciones básicas. Se establece una función
scannerque tomará como argumentos tanto la dirección IP objetivo como los puertos a escanear.
- Inicialmente, se planea escanear los primeros 100 puertos comunes (como 22 y 80), dejando abierta la posibilidad de implementar hilos más adelante para mejorar la eficiencia.
¿Qué es el encapsulamiento en redes?
Conceptos básicos de encapsulamiento
- Se presenta el concepto de encapsulamiento, donde se observa que la capa IP contiene un segmento TCP. Esto significa que cada protocolo envuelve al anterior.
- Para construir un paquete inicial (SYN), es necesario definir las capas IP y TCP, indicando los valores correspondientes para cada una.
- El uso de Scapy permite representar el encapsulamiento mediante una barra, mostrando cómo la capa TCP está contenida dentro de la capa IP.
Detalles sobre las capas IP y TCP
- En la capa IP, lo más relevante es especificar la dirección IP destino (DST), que corresponde al router objetivo.
- La capa TCP requiere información adicional como el puerto origen (aleatorio) y el puerto destino (80). También se menciona un flag para indicar que se trata de un paquete SYN.
Construcción del paquete
- Se sugiere no utilizar puertos por debajo de 1024 para evitar conflictos con servicios estándar; se recomienda usar puertos aleatorios a partir del 1024.
- Se puede generar un número aleatorio entre 1024 y 65535 para el puerto origen utilizando
random.randint.
Envío del paquete
- Para enviar el paquete construido, se utiliza
SR1, que espera una respuesta. Se establece un tiempo máximo de espera (timeout) para determinar si el puerto está abierto o cerrado.
- Al enviar el paquete, se puede optar por no mostrar información adicional en consola configurando
verbosea cero.
Manejo de respuestas
- Si la respuesta incluye una capa TCP, se indica que todo ha funcionado correctamente. De lo contrario, hay que manejar errores potenciales en caso de recibir
None.
- Un error común es recibir un objeto
None, lo cual indica que no hubo respuesta del puerto escaneado; esto puede significar que está filtrado o sin respuesta.
Escaneo de Puertos y Respuestas TCP
Introducción al Escaneo de Puertos
- Se discute la importancia de identificar el estado de un puerto: abierto, filtrado, sin respuesta o cerrado. El objetivo es obtener una visión completa del estado del puerto.
Proceso de Captura de Paquetes
- Se menciona la necesidad de capturar un paquete SYN ACK para determinar si el puerto está abierto. Esto implica crear condiciones específicas en el código para manejar las respuestas adecuadas.
Identificación del Estado del Puerto
- La captura de un SYN ACK indica que el puerto está abierto, lo que lleva a enviar un paquete reset (RST). Este paso es crucial para confirmar la apertura del puerto.
- Se explica cómo construir un paquete RST utilizando capas IP y TCP, asegurando que se envíe correctamente al destino especificado.
Manejo de Respuestas TCP
- Si se recibe un RST ACK en lugar de un SYN ACK, esto indica que el puerto está cerrado. Es fundamental diferenciar entre estos dos tipos de respuestas para evaluar correctamente el estado del puerto.
Resultados y Reportes
- Al recibir un RST ACK (0x14), se concluye que el puerto está cerrado. En caso contrario, si no hay coincidencias con los estados conocidos, se clasifica como desconocido.
- Se presentan los resultados finales mostrando puertos abiertos y cerrados. Los puertos 53 y 80 están abiertos mientras que otros están cerrados o filtrados. Esto permite entender mejor la red escaneada.
Optimización del Código
- Se sugiere optimizar la salida eliminando información innecesaria sobre puertos cerrados o desconocidos para enfocarse solo en los puertos abiertos detectados durante el escaneo.
Este resumen proporciona una guía clara sobre cómo realizar un escaneo efectivo de puertos utilizando técnicas específicas en programación y análisis TCP/IP.
Implementación de Hilos en Python
Introducción a los Hilos
- Se introduce el concepto de hilos, que permite realizar múltiples tareas en paralelo, mejorando la velocidad y eficiencia del programa.
- Se menciona la necesidad de cambiar la estructura para representar puertos como un iterable, lo cual es esencial para utilizar la función
map.
Configuración de Puertos
- Se establece que se escanearán solo los primeros 100 puertos (del 1 al 65535), ya que no es necesario escanear todos los puertos del router.
- Se utiliza
concurrent.futures.ThreadPoolExecutorcomo manejador de contexto para ejecutar hasta 100 tareas en paralelo, facilitando el manejo automático de conexiones.
Ejecución de Tareas Concurrentes
- Las respuestas se almacenarán en una tupla con información sobre cada puerto y su estado.
- La función
maprequiere dos parámetros: una función y un iterable; aquí, el iterable son los puertos.
Definición de Funciones Anónimas
- Se explica cómo usar funciones anónimas (
lambda) para optimizar el tratamiento individual de cada puerto durante el escaneo.
- La función anónima retornará una tupla con el puerto y su estado (abierto o cerrado), utilizando una función llamada
escáner.
Manejo de Respuestas
- Cada respuesta será procesada para mostrar si un puerto está abierto; si no hay contenido relevante, se omite la información.
- El código se ajusta para iterar sobre las respuestas y mostrar únicamente aquellos puertos que están abiertos.
Resultados y Consideraciones Finales
- Al probar el escáner en Python 3, se observa una mejora significativa en la velocidad del proceso comparado con métodos secuenciales anteriores.
- Se advierte que aumentar el número de tareas concurrentes puede resultar en falsos negativos al reportar estados incorrectos sobre los puertos.
¿Cómo afectan los metadatos a los resultados?
Análisis de rendimiento en puertos
- Se menciona que al aumentar la cantidad de metadatos, los resultados tienden a empeorar. Un número óptimo sugerido es 100.
- Se hace referencia a un análisis de los primeros 500 puertos y se espera que el tiempo de respuesta no sea prolongado.
- El presentador decide no realizar un barrido completo en su router para evitar problemas técnicos.
Reflexiones finales
- El presentador comparte que trabaja con una compañía sensible, Andorra Telecom, lo cual influye en sus decisiones técnicas.
- Concluye el video agradeciendo a la audiencia y mencionando que tiene una cena próxima, indicando la necesidad de prepararse.