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.