Implementación Python de escaneo de puertos
I. Principios del escaneo de puertos comunes
0. Escaneo encubierto
El escaneo encubierto es una tecnología de escaneo que no puede ser detectada por las herramientas de auditoría.
A menudo se utiliza para ocultarse mientras se filtra (filtrar) a través de un firewall o enrutador normal.
El escaneo oculto evade IDS, firewalls, filtros de paquetes y auditorías de registros para obtener información sobre si los puertos de destino están abiertos o cerrados. Dado que no contiene ninguna parte del protocolo de protocolo de enlace de tres vías TCP, no se puede registrar y es más sutil que un escaneo semiconectado.
Pero la desventaja de este tipo de escaneo es la mayor inestabilidad de los resultados, y el host del escaneo también necesita crear sus propios paquetes IP. Los escaneos encubiertos existentes incluyen escaneo TCP FIN, escaneo TCP ACK, escaneo NULL, escaneo XMAS y escaneo SYN/ACK.
1. Escaneo Connect()
Este escaneo intenta una comunicación de "apretón de manos de tres vías" con cada puerto TCP. Si la conexión se puede establecer con éxito, demuestra que el puerto se ha desarrollado; de lo contrario, el puerto se cerrará. Tiene una alta precisión, pero los firewalls e IDS lo detectan más fácilmente y registra una gran cantidad de solicitudes de conexión y mensajes de error en los registros del host de destino.
El proceso de escaneo del puerto de conexión TCP entre el servidor y el cliente establece una conexión exitosa (el puerto de destino está abierto):
① El cliente envía SYN
②; El servidor devuelve SYN/ACK indica que el puerto se ha abierto
③ El cliente devuelve ACK, lo que indica que se ha establecido la conexión; p>
④ El cliente se desconecta activamente.
La conexión se estableció exitosamente (el puerto de destino está abierto)
El proceso de escaneo del puerto de conexión TCP entre el servidor y el cliente no pudo establecer una conexión (el puerto de destino está cerrado):
① El cliente envía SYN;
② El servidor devuelve RST/ACK, lo que indica que el puerto no está abierto.
Ventajas: Implementación simple, sin requisitos estrictos sobre permisos de operador (algunos tipos de escaneo de puertos requieren que los operadores tengan permisos de root), cualquier usuario en el sistema tiene derecho a usar esta llamada y, si lo desea, esto El método solo se puede utilizar para obtener la información del banner devuelta desde el puerto de destino.
Otra ventaja es la rápida velocidad de escaneo. Si utiliza llamadas connect() independientes para cada puerto de destino de forma lineal, puede acelerar el escaneo abriendo varios sockets simultáneamente.
Desventajas: esto dejará rastros en los registros del host de destino, que se pueden descubrir fácilmente y los paquetes se filtrarán. Los archivos de registro del host de destino mostrarán una serie de mensajes de servicio sobre conexiones y errores de conexión, lo que le permitirá cerrarse rápidamente.
2.Escaneo SYN
El escáner envía un paquete SYN, solicitando una conexión a un puerto en el host de destino. El escáner no enviará una respuesta ACK después de recibir el SYN/ACK. En su lugar, se envía un paquete RST para solicitar una desconexión. De esta manera, el protocolo de enlace de tres vías no se completa y no se puede establecer una conexión TCP normal, por lo que este escaneo no se registrará en el registro del sistema. Esta técnica de escaneo generalmente no deja rastros de escaneo en el host de destino. Sin embargo, este análisis requiere privilegios de root.
-Puerto abierto: (1) el cliente envía SYN; (2) el servidor envía SYN/ACK; (3) el cliente envía RST para desconectarse (solo se necesitan los primeros dos pasos para determinar el puerto abierto)
-Puerto cerrado: (1) el cliente envía SYN; (2) el cliente envía RST; (3) el cliente envía RST.
)El cliente envía SYN; (2) El servidor responde RST (lo que indica que el puerto está cerrado)
Ventajas: el escaneo SYN es más encubierto que el escaneo TCP Connect(), SYN solo necesita enviar el SYN inicial; paquete al host de destino, si el puerto está abierto, se envía el paquete SYN-ACK correspondiente; si el puerto está cerrado, se envía el paquete RST de respuesta
3. p>Escaneo inverso: el principio es enviar un paquete de datos sin configurar ningún bit de bandera en el puerto TCP. En la comunicación normal, se debe configurar al menos un bit de bandera de acuerdo con los requisitos de FRC 793, cuando el puerto está cerrado. , si el campo de datos recibidos no tiene el indicador configurado, el host debe descartar el segmento y enviar un paquete RST; de lo contrario, no responderá a la computadora cliente que inició el escaneo. En otras palabras, si el puerto TCP está cerrado, el host responderá con un paquete RST; si el puerto está abierto, el host no responderá. Sin embargo, debe saberse que el escaneo NULL requiere que todos los hosts cumplan con RFC 793, pero los hosts de Windows no cumplen con RFC 793. Siempre que el paquete recibido no establezca ningún bit de bandera, independientemente de si el puerto está abierto o cerrado , responderá con un paquete RST. Sin embargo, las redes basadas en Unix (*nix, como Linux) cumplen con el estándar RFC 793 y, por lo tanto, pueden utilizar escaneo NULL. Después del análisis anterior, sabemos que NULL puede identificar el sistema operativo que se ejecuta en un host específico.
El puerto está abierto: el cliente envía Null y el servidor no responde
El puerto está cerrado: (1) el cliente envía NUll (2) el servidor responde con RST;
Explicación: el escaneo vacío es exactamente lo opuesto a las condiciones de evaluación TCP Connect () y SYN anteriores. En los dos primeros escaneos, recibir un paquete de respuesta significa que el puerto está abierto, mientras que en un escaneo NUll, recibir un paquete de respuesta significa que el puerto está cerrado. El escaneo inverso es más sutil que los dos primeros tipos de escaneo, pero su precisión también es relativamente baja.
Objetivo: Determinar si se trata de un sistema Windows o un sistema Linux.
4. Escaneo FIN
Es similar a NULL, pero FIN es una indicación del final de la sesión TCP. En el escaneo FIN, se establece un bit FIN y se envía un paquete. se envía si se responde al paquete RST, significa que el puerto está cerrado y si no hay respuesta significa que el puerto está abierto. Este tipo de análisis tampoco puede determinar con precisión el desarrollo de puertos en sistemas Windows.
-Puerto abierto: enviar FIN, sin respuesta
-Puerto cerrado: (1) enviar FIN (2) responder al escaneo ACK;
El host de escaneo envía un paquete ACK al host de destino. Hay dos formas de obtener información del puerto según el paquete RST devuelto. El primer método es: si el valor TTL del paquete RST devuelto es menor o igual a 64, el puerto está abierto; de lo contrario, el puerto está cerrado.
6. Escaneo del árbol de Navidad
Enviando paquetes tcp con las siguientes banderas.
-URG: Indica que el dato es urgente y debe ser tratado de forma inmediata.
-PSH: Fuerza el envío de datos al búfer.
-FIN: Se utiliza al finalizar una sesión TCP.
Normalmente, estos tres indicadores no se pueden configurar al mismo tiempo, pero se pueden usar en este tipo de escaneo para determinar qué puertos están cerrados o abiertos, que es lo mismo que en el escaneo inverso anterior. pero aún no se puede utilizar para determinar puertos en plataformas Windows.
-Puerto abierto: enviar URG/PSH/FIN, sin respuesta
-Puerto cerrado: (1) enviar URG/PSH/FIN, sin respuesta (2) responder RST<; /p>
El principio del escaneo XMAS es similar al escaneo NULL. De manera similar a un escaneo NULL, los indicadores ACK, FIN, RST, SYN, URG, PSH en el paquete TCP se envían al host de destino después de la posición 1. Si el puerto de destino está abierto, el host de destino no devolverá ninguna información.
7. Escaneo de volcado
También conocido como escaneo inactivo o escaneo inverso, el escaneo de computadoras zombies de terceros se aplica al escanear el host. El host zombie envía paquetes SYN al host de destino. El puerto del host de destino responde con SYN|ACK cuando está abierto y RST cuando está cerrado. El host zombie responde a SYN|ACK y no responde a RST. Al escanear desde un zombie, se realiza una operación de ping continua desde la computadora local al zombie. Al observar el campo ID de la respuesta de eco devuelta por el host zombie, puede determinar qué puertos están abiertos o cerrados en el host de destino.
Implementación del código Python
1. Utilice el paquete Socket de Python en el método de conexión para conectarse directamente a la IP y al puerto de destino e intente devolver el resultado sin crear el paquete SYN usted mismo.
2. Puertos IP de escaneo multiproceso. Cabe señalar que el límite superior del número de subprocesos creados cada vez es diferente para diferentes computadoras y diferentes CPU. Si se crean demasiados, puede producirse un error. Deberá modificar cada escaneo usted mismo. Puede aumentar el número de computadoras o extender el tiempo de SEELP.
¿Terminaste? ¡Siéntete libre de hacerlo!
Python Learning Network, una plataforma para el aprendizaje gratuito de Python en línea, ¡bienvenido a prestar atención!
Este artículo es una reproducción de: /p/243bb7cfc40f