如何讓 netcat 使用現有的 HTTP 代理
我可以通過直接訪問我的網路伺服器來訪問網頁,如下所示:
$ 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 流量),那麼如果您能全部分享,我將不勝感激。
提前謝謝了。
Netcat 不是專門的 HTTP 客戶端。因此,通過 Netcat 的代理伺服器連接意味著通過伺服器創建 TCP 連接,這就是為什麼它需要一個帶有參數的 SOCKS 或 HTTPS 代理,
-x
由以下參數指定-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
隧道”的詳細資訊)因此,要使用代理連接到您的網路伺服器,您必須執行網路瀏覽器會執行的操作 -與代理通信:
$ nc squid-proxy 3128 GET http://webserver/sample HTTP/1.0
(這個問題與這個問題有相似之處;我不知道在
proxychain
這裡是否有用。)附錄 使用普通HTTP 代理的瀏覽器,例如 Squid(據我所知),或多或少地執行範例所示的操作,Netcat 可以向您展示:
nc
呼叫後,我將 Firefox 配置為使用 127.0.0.1 埠 8080 作為代理並試圖打開Google,這是輸出(減去 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 網路伺服器會發生什麼?瀏覽器當然不應該向中間的任何人透露流量,因此需要直接連接;這就是
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
因此請求通常僅限於明顯的埠。