如何使Netcat使用现有的HTTP代理


11

我可以通过直接点击我的Web服务器来访问网页,如下所示:

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

现在,我希望netcat通过Squid HTTP代理(侦听端口3128),就像我可以通过其代理首选项配置Firefox浏览器并使其通过HTTP代理一样。

我尝试了以下操作,但没有成功:

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

注意:我正在使用具有以下选项的RHEL 5.3版本的netcat:

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

摘录自手册页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

现在,因为我的不是ssh / SSL用例,所以我不确定如何使用-x/ -X选项,甚至不确定是否应该使用它们!

如果有多种方法可以实现上述目标(即通过HTTP代理路由netcat通信),那么如果您可以共享它们,我将不胜感激。

提前谢谢了。

Answers:


14

Netcat不是专用的HTTP客户端。因此,通过用于Netcat的代理服务器进行连接意味着通过该服务器创建TCP连接,这就是为什么它期望带有-x参数的SOCKS或HTTPS代理的原因,该参数由指定-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指定一种用于通过代理服务器创建SSL(HTTPS)连接的方法。由于代理不是另一个端点,并且连接是按端点加密的,因此CONNECT请求允许您通过HTTP代理(如果允许)建立点对点连接的隧道。(我可能在这里掩盖了细节,但是无论如何这都不是重点;HTTP CONNECT这里有关“ 隧道”的细节

因此,要使用代理连接到您的Web服务器,您必须执行Web浏览器会执行的操作- 与代理交谈

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

这个问题与此相似;我不知道proxychain这里是否有用。

附录 :使用普通的 HTTP代理(例如Squid)的浏览器(或多或少)会执行示例所示的内容,如Netcat可以向您展示的:在nc通话之后,我将Firefox配置为使用127.0.0.1端口8080作为代理并尝试打开谷歌,这是输出(减去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

通过这种方式,您也可以使用Netcat通过HTTP代理访问HTTP服务器。现在,如果您尝试访问HTTPS Web服务器应该怎么办?浏览器肯定不会向中间任何人透露流量,因此需要直接连接。这就是CONNECT发挥作用的地方。再次启动nc -l 8080并尝试访问时,例如,https://google.com将代理设置为127.0.0.1:80,结果如下:

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

您会看到,CONNECT请求将请求服务器直接连接到google.com端口443(https)。 现在,此请求有什么作用?

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

nc -l 8080实例的输出:

CONNECT google.com:443 HTTP/1.0

因此,它使用相同的方式来创建直接连接。但是,由于这几乎可以用于几乎所有东西(例如使用corkscrew),因此CONNECT请求通常只限于明显的端口。


@sr_您能否详细说明浏览器如何通过服务器部分实现... TCP连接?就像socks4,socks5和connect一样,似乎也存在用于纯HTTP代理的协议。您能确认一下吗?非常感谢。
哈利

1
@BruceEdiger,是的,的确如此。我减去0.1以掩饰我的无知。:)
sr_

1
@Harry我的玩法nc和Firefox可以使您澄清一些吗?
sr_12年

@sr_我尝试了nc squid-proxy 3128紧随其后GET http://webserver/sample HTTP/1.0,但是收到了HTTP / 1.0 403 Forbidden(访问被拒绝错误)。
哈利

1
gh,对不起,不知道。这里不是专家,您看到:)您可能可以使用tcpdumpwireshark利用您自己的CONNECT连接并获得见解...
sr_12年

3

谢谢,+ 1。看起来非常复杂。尝试过echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN,但收到此错误:2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden。现在,只是为了了解我是否正确理解了该工具,我接下来尝试了基本的非代理用法:echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDIN,但没有得到任何回复!因此,很明显,我在socat用法中缺少某些内容。如果您能指出我的错误,将不胜感激。
哈利

好的,我可以使用STDIO(或-)代替来使非代理版本调用起作用STDIN。但是代理版本仍然给我同样的错误。
哈利

1
另一个更新:我尝试echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128并成功了。您能否确定这是我应该使用的方式socat(而不是PROXY:...地址规范)?
哈利

1
嗨,我自己并没有使用太多,但是我认为这是正确的。Socat打开到http-proxy的普通TCP连接,而squid解析http-GET并完成其余工作。它对https btw有效吗?最后另一个链接:technostuff.blogspot.com/2008/10/...
法比安Zeindl

不,我还没有尝试过https。我很快也会担心https。谢谢。
哈利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.