¿Cómo evitar que Windows envíe paquetes RST cuando intenta conectarse con alguien a través de Pcap.net?
sockets tcp (3)
Estoy tratando de usar Pcap.Net para abrir una conexión tcp.
Enviaré el siguiente paquete:
El servidor está respondiendo con:
Después de esto, Windows solo envía el paquete de reinicio:
¿Por qué está sucediendo esto y cómo bloqueo este comportamiento?
Estoy haciendo esto en Windows 7
Esencialmente, el problema es que scapy
ejecuta en el espacio de usuario, y el núcleo de Windows recibirá primero el SYN-ACK. Su kernel de Windows enviará un TCP RST porque no tendrá un socket abierto en el número de puerto en cuestión, antes de que tenga la oportunidad de hacer algo con scapy.
La solución típica (en Linux) es proteger a su kernel de recibir un paquete RST en ese puerto TCP (12456) mientras ejecuta el script ... el problema es que no creo que el firewall de Windows le permita ser tan granular (es decir, mirando banderas de TCP) para gotas de paquetes.
Quizás la solución más fácil es hacer esto bajo una VM de Linux y usar iptables
para implementar las caídas de RST.
Ya sea usando Boring Old Winsock para hacer una conexión TCP al servidor, en lugar de construir sus propios paquetes TCP-over-IP-over-Ethernet y enviarlos a un servidor, o de alguna manera convencer a la pila de protocolo de Internet de Windows para que ignore el SYN + ACK (y todos los paquetes subsiguientes) que obtiene del servidor, para que no vea el SYN + ACK del servidor, observe que ningún proceso ha intentado configurar una conexión TCP de 192.168.1.3:12456 a 192.168. 1.1: 80 usando la pila de red estándar en el núcleo (es decir, nadie ha intentado configurarlo usando Boring Old Winsock), y envía un RST para decirle al servidor que no hay nadie escuchando en el puerto 12456 en la máquina.
Es posible que pueda hacer lo último con WinDivert . En sí mismo no parece tener un contenedor .NET, por lo que es posible que tenga que buscar uno si va a usar .NET en lugar de Abordar el viejo C no administrado o Abordar el viejo C ++ no administrado.
Como dice el Sr. Harris, puedes usar WinDivert para hacer lo que quieras. Por ejemplo, para hacer el protocolo de enlace TCP, puede escribir algo como lo siguiente:
// TCP handshake using WinDivert:
HANDLE handle = DivertOpen("inbound && tcp.SrcPort == 80 && tcp.Syn && tcp.Ack", 0, 0, 0);
DivertSend(handle, synPacket, sizeof(synPacket), dstAddr, NULL);
...
DivertRecv(handle, synAckPacket, sizeof(synAckPacket), &srcAddr, &length);
...
DivertSend(handle, ackPacket, sizeof(ackPacket), dstAddr, NULL);
...
La función DivertRecv () redirige la respuesta del servidor al espacio de usuario antes de que sea manejada por la pila TCP / IP de Windows. Entonces no se generará ningún molesto TCP RST. DivertSend () inyecta paquetes.
Estas son las principales diferencias entre WinDivert y WinPCAP. Este último es simplemente un detector de paquetes, mientras que el primero puede interceptar / filtrar / bloquear el tráfico.
WinDivert está escrito en C, por lo que necesitaría escribir su propio .NET wrapper.
(divulgación habitual: WinDivert es mi proyecto).