¿Cómo pasar una comprobación de host local para una solicitud entrante?

1

Estoy intentando enviar una solicitud a un servidor http alojado en una máquina. El servidor http está en C # y descarta cualquier paquete que no sea de localhost:

public void Request(HttpListenerContext context) {
    if(!IPAddress.IsLoopback(context.Request.LocalEndPoint.Address))
        this.ConnectionRefused()
    ...
}

Tuve la idea de usar scapy y falsificar el TCP src IP para 127.0.0.1, y la máquina recibe el paquete (confirmado en wireshark), pero la solicitud no parece activarse. Me pregunto si alguien sabe cómo puedo realizar una solicitud http a este puerto sin pasar por la verificación Loopback.

    
pregunta Rob Gates 02.10.2018 - 00:22
fuente

1 respuesta

3

Usted "pasa" un cheque localhost enviando la solicitud a localhost (o 127. * o :: 1). Por ejemplo, puede hacer que un navegador web haga esto navegando a enlace o enlace . El fragmento de código de C # que publicó para el servidor está verificando la dirección IP local, por lo que para un servidor que es la dirección IP en la que el servidor recibió la solicitud de conexión, y desde la perspectiva de un cliente, es la dirección IP a la que el cliente intenta conectarse ( el destino).

Si intenta enviar una solicitud de este tipo desde una máquina distinta a la que está intentando conectar, enrutará la solicitud a su propia máquina, que no es lo que desea (pero es el punto del bucle de retorno). dirección). Si intenta crear paquetes de Ethernet sin procesar que simplemente contienen tráfico TCP / IP y configura el destino de IP a 127.0.0.1 pero intenta transmitir el paquete a otra máquina (a través de la dirección MAC), sucederá una de estas cosas:

  • Recibirá un error de su pila de red, porque se reconoció que el paquete era tráfico IP y se está transmitiendo mal. Sin embargo, la mayoría de los controladores de red probablemente no lo harán, y si lo hacen, puede (en teoría) editar ese comportamiento.
  • Su paquete saldrá a la red, pero será rechazado por el primer nodo al que llega (probablemente un conmutador o enrutador, a menos que tenga una conexión directa con la otra máquina) porque, de nuevo, no es válido; Está vinculado a la red de bucle invertido pero proviene de una red externa. Este podría ser lo que estás viendo en Wireshark.
  • Su enrutador o conmutador aceptará su paquete, pero se pasará a la red de bucle invertido de ese enrutador / conmutador (después de todo, esa es la dirección IP de destino) en lugar de pasarlo a cualquier otro host (no se sabe dónde estará). enviar el paquete). Esto sería un error de seguridad en el dispositivo y vale la pena informar al fabricante si se encuentra.
  • Su paquete irá a la computadora de destino (si está conectada directamente, o posiblemente si se transmite a través de un concentrador de red), y la pila de red lo aceptará inicialmente como un paquete TCP SYN . Sin embargo, cuando el servidor intenta responder con SYN/ACK , fallará porque está intentando enviar un paquete no válido (que se origina con localhost pero está destinado a un host externo). Este es probablemente un error de seguridad en el controlador de red / pila de IP , porque los paquetes UDP no requieren un saludo de ese tipo. Vale mucho la pena informar.
  • Su paquete llega al host de destino y se acepta (como arriba), y obtiene un TCP SYN/ACK del servidor, invitándole a completar el protocolo de enlace con un ACK final y comenzar a transmitir datos. Probablemente necesitarías un escucha de socket sin formato para esto, porque la pila de red del sistema operativo no va a reconocer el paquete entrante como parte de un protocolo de enlace TCP en el que estaba trabajando (aunque, teóricamente, puedes parchearlo para hacerlo). Esto indica un error de seguridad grave en la pila de red del servidor .

Tenga en cuenta que en ninguno de estos casos, excepto en el último, hay alguna posibilidad de que el servidor web de C # vea la solicitud. HTTP se transmite a través de TCP, y los servidores TCP ni siquiera son notificados de que alguien se está conectando A ellos hasta que se complete el apretón de manos. Por lo tanto, a menos que tenga un error grave realmente en su pila de red y esté conectado de forma bastante directa, esto nunca sucederá.

Ahora, si desea saber cómo llegar a un servidor que solo escucha en loopback desde fuera de la máquina, la solución es encontrar algún programa en el mismo host que el servidor de destino que hace escuche el tráfico externo y retransmitirá las solicitudes a destinos específicos (un proxy), o puede usarse para crear nuevas solicitudes web (esto es un Server-Side Request Forgery (SSRF) , y una forma común de crearlos es a través de un XML eXternal Entidad (XXE) ataque).

    
respondido por el CBHacking 02.10.2018 - 03:51
fuente

Lea otras preguntas en las etiquetas