Cómo hacer que netcat use un proxy HTTP existente

11

Puedo acceder a una página web muy bien presionando directamente mi servidor web de la siguiente manera:

$ echo "GET /sample" | nc web-server 80
This is contents of /sample...
$

Ahora, me gustaría que netcat vaya a través de un proxy HTTP Squid (escuchando en el puerto 3128), al igual que puedo configurar mi navegador Firefox a través de sus preferencias de proxy y hacer que funcione a través de un proxy HTTP.

Intenté lo siguiente, pero no funcionó:

$ echo "GET /sample" | nc -x squid-proxy:3128 web-server 80
    <Seemed to be blocked FOREVER on input, so I killed it.>
<Ctrl-C>
$

Nota: Estoy usando la versión RHEL 5.3 de netcat que tiene las siguientes opciones:

$ nc --help
nc: invalid option -- -
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port]
  [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version]
  [-x proxy_address[:port]] [hostname] [port[s]]

Extracto de la página de manual de nc:

 EXAMPLES
    <snip>
 Connect to port 42 of host.example.com via an HTTP proxy at 10.2.3.4, port 8080. 
 This example could also be used by ssh(1); see the ProxyCommand directive in
 ssh_config(5) for more information.
       $ nc -x10.2.3.4:8080 -Xconnect host.example.com 42

Ahora, debido a que el mío no es un caso de uso ssh / SSL, ¡no estoy seguro de cómo usar las opciones -x/ -X, o incluso si debería usarlas en absoluto!

Si hay más de una forma de lograr el objetivo anterior (es decir, enrutar el tráfico de netcat a través de un proxy HTTP), agradecería enormemente si pudiera compartirlos todos.

Muchas gracias de antemano.

Harry
fuente

Respuestas:

14

Netcat no es un cliente HTTP especializado. Conectarse a través de un servidor proxy para Netcat significa crear una conexión TCP a través del servidor , por lo que espera un proxy SOCKS o HTTPS con el -xargumento, especificado por -X:

 -X proxy_protocol
         Requests that nc should use the specified protocol when talking
         to the proxy server.  Supported protocols are “4” (SOCKS v.4),
         “5” (SOCKS v.5) and “connect” (HTTPS proxy).  If the protocol is
         not specified, SOCKS version 5 is used.

connectespecifica un método para crear conexiones SSL (HTTPS) a través de un servidor proxy. Dado que el proxy no es el otro punto final y la conexión está encriptada en un punto final, una CONNECTsolicitud le permite tunelizar una conexión punto a punto a través de un proxy HTTP (si está permitido). (Podría pasar por alto detalles aquí, pero no es el punto importante de todos modos; detalles sobre " HTTP CONNECTtúneles" aquí )

Entonces , para conectarse a su servidor web usando un proxy, tendrá que hacer lo que haría el navegador web: hable con el proxy :

$ nc squid-proxy 3128
GET http://webserver/sample HTTP/1.0

( Esa pregunta tiene similitudes con esta; no sé si proxychaines útil aquí ) .

Anexo Un navegador que usa un proxy HTTP ordinario , por ejemplo, Squid (como lo sé), hace más o menos lo que el ejemplo ilustra, como Netcat puede mostrarle: después de la ncllamada, configuré Firefox para usar el puerto 8080 127.0.0.1 como proxy e intenté abrir google, esto es lo que salió (menos una cookie):

$ nc -l 8080
GET http://google.com/ HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Proxy-Connection: keep-alive

Al comportarse de esta manera , también, puede usar Netcat para acceder a un servidor HTTP a través del proxy HTTP. Ahora, ¿qué debería suceder si intenta acceder a un servidor web HTTPS? El navegador seguramente no debe revelar el tráfico a nadie en el medio , por lo que se necesita una conexión directa ; Y aquí es donde CONNECTentra en juego. Cuando vuelvo a comenzar nc -l 8080e intento acceder, digamos, https://google.comcon el proxy configurado a 127.0.0.1:80, esto es lo que sale:

CONNECT google.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Proxy-Connection: keep-alive
Host: google.com

Verá, las CONNECTsolicitudes le piden al servidor una conexión directa a google.com, puerto 443(https). Ahora , ¿qué hace esta solicitud?

$ nc -X connect -x 127.0.0.1:8080 google.com 443

El resultado de la nc -l 8080instancia:

CONNECT google.com:443 HTTP/1.0

Por lo tanto, utiliza la misma forma para crear una conexión directa. Sin embargo, como esto, por supuesto, puede explotarse para casi cualquier cosa (usando, por ejemplo corkscrew), las CONNECTsolicitudes generalmente se restringen a los puertos obvios solamente.

sr_
fuente
@sr_ ¿Podría explicarnos un poco más sobre cómo un navegador podría lograr la ... conexión TCP a través de la parte del servidor ? Al igual que socks4, socks5 y connect, parece que también hay un protocolo para proxy HTTP simple. ¿Podría por favor confirmar esto? Muchas gracias.
Harry
1
@BruceEdiger, sí, de hecho. Reste 0.1para enmascarar mi ignorancia. :)
Sr_
1
@Harry ¿Mi juego con ncFirefox aclara un poco las cosas?
Sr_
@sr_ Intenté nc squid-proxy 3128seguido GET http://webserver/sample HTTP/1.0, pero obtuve un HTTP / 1.0 403 Prohibido (Error de acceso denegado).
Harry
1
Ugh, lo siento, no tengo idea. No es un experto aquí, se ve :)Probablemente puede utilizar tcpdumpo wiresharkpara aprovechar sus propias CONNECTideas de conexión y de ganancia ...
SR_
3

Echa un vistazo a socat: http://www.dest-unreach.org/socat/doc/README

Fabian Zeindl
fuente
Gracias +1. Parece una herramienta MUY sofisticada y compleja. Intentado echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN, pero llegado este error: 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden. Ahora, solo para ver si entendí bien esta herramienta, probé el uso básico sin proxy: ¡ echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDINpero no obtuve respuesta! Entonces, obviamente, me falta algo aquí en el uso de socat. Le agradecería si pudiera señalar mi error.
Harry
Ok, podría hacer que la invocación de la versión no proxy funcione al usar STDIO(o, -) en lugar de STDIN. Pero la versión proxy todavía me da el mismo error.
Harry
1
Otra actualización: lo intenté echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128y funcionó. ¿Confirmaría si así es como se supone que debo usar socat(en lugar de la PROXY:...especificación de la dirección)?
Harry
1
Hola, no lo he usado tanto, pero creo que es correcto. Socat abre una conexión TCP simple al proxy http y squid analiza el http-GET y hace el resto. ¿Funciona para https por cierto? Y, finalmente, otro enlace: technostuff.blogspot.com/2008/10/...
Fabian Zeindl
No, todavía no he probado https. Pronto me preocuparé también por https. Gracias.
Harry