Como fazer com que o netcat use um proxy HTTP existente

9

Eu posso acessar uma página da Web bem diretamente acessando meu servidor da seguinte maneira:

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

Agora, eu gostaria que o netcat passasse por um proxy HTTP do Squid (escutando na porta 3128), da mesma forma que eu posso configurar meu navegador Firefox por meio de suas preferências de proxy e fazê-lo através de um proxy HTTP.

Eu tentei o seguinte, mas não funcionou:

$ 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: Estou usando a versão RHEL 5.3 do netcat que tem as seguintes opções:

$ 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]]

Trecho da página do 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

Agora, porque o meu não é um usbase ssh / SSL, não sei como usar as opções -x / -X , ou mesmo se devo usá-las!

Se houver mais de uma maneira de atingir o objetivo acima (ou seja, rotear o tráfego do netcat por meio de um proxy HTTP), agradecemos muito se você puder compartilhá-los.

Muito obrigado antecipadamente.

    
por Harry 16.05.2012 / 14:13

2 respostas

12

O Netcat não é um cliente HTTP especializado. Conectar-se através de um servidor proxy para o Netcat significa criar uma conexão TCP através do servidor , razão pela qual espera um proxy SOCKS ou HTTPS com o argumento -x , 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.

connect especifica um método para criar conexões SSL (HTTPS) por meio de um servidor proxy. Como o proxy não é o outro ponto final e a conexão é criptografada no ponto de extremidade, uma solicitação CONNECT permite encapsular uma conexão ponto-a-ponto por meio de um Proxy HTTP (se permitido). (Eu poderia estar encobrindo os detalhes aqui, mas não é o ponto importante de qualquer maneira; detalhes sobre " HTTP CONNECT tunelamento" aqui )

Então, , para se conectar ao seu servidor web usando um proxy, você terá que fazer o que o navegador da Web faria - falar com o proxy :

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

( Essa pergunta tem semelhanças com esta; não sei se proxychain é útil aqui. )

Adendo Um navegador usando um proxy HTTP comum , por exemplo O Squid (como eu sei), faz o que mais ou menos o exemplo ilustrado, como o Netcat pode mostrar: após a chamada nc , configurei o Firefox para usar 127.0.0.1 a porta 8080 como proxy e tentei abrir o google, esse é o que foi produzido (menos um 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

Por se comportar dessa maneira , você também pode usar o Netcat para acessar um servidor HTTP através do proxy HTTP. Agora, o que deve acontecer se você tentar acessar um servidor da Web HTTPS? O navegador certamente não deve revelar o tráfego para ninguém no meio , então é necessária uma conexão direta ; e é aqui que entra em jogo CONNECT . Quando eu inicio novamente nc -l 8080 e tento acessar, digamos, https://google.com com o proxy definido como 127.0.0.1:80 , isso é o que aparece:

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

Você vê que as solicitações CONNECT solicitam ao servidor uma conexão direta com google.com , porta 443 (https). Agora , o que essa solicitação faz?

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

A saída da instância nc -l 8080 :

CONNECT google.com:443 HTTP/1.0

Portanto, ele usa o mesmo caminho para criar uma conexão direta. No entanto, como isso pode ser explorado para quase tudo (usando, por exemplo, corkscrew ), as solicitações CONNECT geralmente são restritas apenas às portas óbvias.

    
por 16.05.2012 / 14:33
3

Dê uma olhada no socat: link

    
por 16.05.2012 / 22:03