Como fazer com que o netcat use um proxy HTTP existente

11

Posso acessar uma página da Web muito bem, acessando diretamente meu servidor da Web da seguinte maneira:

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

Agora, eu gostaria que o netcat fosse por um proxy HTTP do Squid (escutando na porta 3128), assim como eu posso configurar meu navegador Firefox por meio de suas preferências de proxy e fazê-lo por 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 possui 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 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

Agora, como o meu não é um caso de usuário 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 netcat por meio de um proxy HTTP), agradeceria muito se você pudesse compartilhar todos eles.

Muito obrigado antecipadamente.

atormentar
fonte

Respostas:

14

O Netcat não é um cliente HTTP especializado. Conectar-se através de um servidor proxy para Netcat significa criar uma conexão TCP através do servidor , razão pela qual espera um proxy SOCKS ou HTTPS com o -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 um método para criar conexões SSL (HTTPS) por meio de um servidor proxy. Como o proxy não é o outro ponto de extremidade e a conexão é criptografada por ponto de extremidade, uma CONNECTsolicitação permite que você encapsule uma conexão ponto a ponto por meio de um Proxy HTTP (se for permitido). (Talvez eu esteja encobrindo detalhes aqui, mas de qualquer maneira não é o ponto importante; detalhes sobre " HTTP CONNECTencapsulamento" aqui )

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

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

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

Adendo Um navegador que usa um proxy HTTP comum , por exemplo, Squid (como eu o conheço), faz mais ou menos o que o exemplo ilustrado, como o Netcat pode lhe mostrar: após a ncchamada, configurei o Firefox para usar a porta 127.0.0.1 8080 como proxy e tentei abrir o google, é isso 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

Ao se comportar dessa maneira , também é possível usar o Netcat para acessar um servidor HTTP por meio 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 , portanto é necessária uma conexão direta ; e é aí que CONNECTentra em jogo. Quando eu inicio novamente nc -l 8080e tento acessar, digamos, https://google.comcom o proxy definido como 127.0.0.1:80, é isso que sai:

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

Veja bem, os CONNECTpedidos solicitam ao servidor uma conexão direta com a google.comporta 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 nc -l 8080instância:

CONNECT google.com:443 HTTP/1.0

Por isso, usa da mesma maneira para criar uma conexão direta. No entanto, como isso pode ser explorado para quase qualquer coisa (usando, por exemplo corkscrew), as CONNECTsolicitações geralmente são restritas apenas às portas óbvias.

sr_
fonte
@sr_ Você poderia elaborar um pouco mais sobre como um navegador pode estar alcançando a ... conexão TCP através da parte do servidor ? Assim como socks4, socks5 e connect, parece que também existe um protocolo para proxy HTTP simples. Você poderia confirmar isso? Muito Obrigado.
Harry
1
@BruceEdiger, sim, de fato. Subtraí 0.1para mascarar minha ignorância. :)
sr_
1
@ Harry O meu brincar com o ncFirefox esclarece um pouco as coisas?
sr_
@sr_ Tentei nc squid-proxy 3128seguir GET http://webserver/sample HTTP/1.0, mas recebi um HTTP / 1.0 403 Proibido (erro de acesso negado).
Harry
1
Ugh, desculpe, não faço ideia. Não é um especialista aqui, você vê :)Você provavelmente pode usar tcpdumpou wiresharkpara tocar suas próprias CONNECTpercepções de conexão e ganho ...
sr_
3

Dê uma olhada no socat: http://www.dest-unreach.org/socat/doc/README

Fabian Zeindl
fonte
Obrigado, +1. Parece uma ferramenta MUITO sofisticada e complexa. Tentou echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN, mas tenho esse erro: 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden. Agora, apenas para ver se entendi bem essa ferramenta, tentei o uso básico e não proxy:, echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDINmas não obtive resposta! Então, obviamente, estou perdendo alguma coisa aqui no uso social. Agradeceria se você pudesse apontar o meu erro.
Harry
Ok, eu poderia obter a chamada da versão não proxy para trabalhar usando STDIO(ou, -) em vez de STDIN. Mas a versão do proxy ainda está me dando o mesmo erro.
Harry
1
Outra atualização: tentei echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128e funcionou. Você confirmaria se é assim que devo usar socat(em vez da PROXY:...especificação de endereço)?
Harry
1
Oi, eu não usei muito isso sozinho, mas acho que está correto. O Socat abre uma conexão TCP simples com o proxy http e o squid analisa o http-GET e faz o resto. Funciona para https btw.? E finalmente outro link: technostuff.blogspot.com/2008/10/…
Fabian Zeindl
Não, ainda não tentei o https. Logo estarei me preocupando com https também. Obrigado.
Harry