Cách tạo netcat sử dụng proxy HTTP hiện có


11

Tôi có thể truy cập một trang web tốt bằng cách truy cập trực tiếp vào máy chủ web của mình như sau:

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

Bây giờ, tôi muốn netcat đi qua proxy HTTP Squid (nghe trên cổng 3128), giống như tôi có thể định cấu hình trình duyệt Firefox của mình thông qua các tùy chọn proxy của nó và đưa nó qua proxy HTTP.

Tôi đã thử như sau, nhưng nó không hoạt động:

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

Lưu ý: Tôi đang sử dụng phiên bản RHEL 5.3 của netcat có các tùy chọn sau:

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

Trích từ trang người đàn ông của 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

Bây giờ, vì tôi không phải là một usshase ssh / SSL, tôi không chắc cách sử dụng -x/ -Xtùy chọn, hoặc thậm chí liệu tôi có nên sử dụng chúng hay không!

Nếu có nhiều hơn một cách để đạt được mục tiêu trên (cụ thể là định tuyến lưu lượng truy cập netcat qua proxy HTTP), thì tôi sẽ đánh giá rất cao nếu bạn có thể chia sẻ tất cả.

Rất cám ơn trước.

Câu trả lời:


14

Netcat không phải là một máy khách HTTP chuyên dụng. Kết nối thông qua máy chủ proxy cho Netcat, do đó có nghĩa là tạo kết nối TCP thông qua máy chủ , đó là lý do tại sao nó mong đợi proxy SOCKS hoặc HTTPS với -xđối số, được chỉ định bởi -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.

connectchỉ định phương thức tạo kết nối SSL (HTTPS) thông qua máy chủ proxy. Vì proxy không phải là điểm cuối khác và kết nối được mã hóa theo điểm cuối, nên một CONNECTyêu cầu cho phép bạn tạo đường hầm kết nối điểm-điểm thông qua Proxy HTTP (nếu được phép). (Tôi có thể đang theo dõi chi tiết ở đây, nhưng dù sao đó cũng không phải là điểm quan trọng; chi tiết về " HTTP CONNECTđường hầm" ở đây )

Vì vậy , để kết nối với máy chủ web của bạn bằng proxy, bạn sẽ phải làm những gì trình duyệt web sẽ làm - nói chuyện với proxy :

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

( Câu hỏi đó có điểm tương đồng với câu hỏi này; tôi không biết có proxychainđược sử dụng ở đây không. )

Phụ lục Một trình duyệt sử dụng proxy HTTP thông thường , ví dụ Squid (như tôi biết), thực hiện những gì ví dụ minh họa, vì Netcat có thể cho bạn thấy: sau nccuộc gọi, tôi đã cấu hình Firefox để sử dụng cổng 127.0.0.1 8080 làm proxy và đã cố mở google, đây là đầu ra (trừ 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

Bằng cách hành xử theo cách này cũng vậy, bạn có thể sử dụng Netcat để truy cập máy chủ HTTP thông qua proxy HTTP. Bây giờ, điều gì sẽ xảy ra nếu bạn cố gắng truy cập máy chủ web HTTPS? Trình duyệt chắc chắn không nên tiết lộ lưu lượng cho bất kỳ ai ở giữa , vì vậy cần có kết nối trực tiếp ; và đây là nơi CONNECTđi vào chơi Khi tôi một lần nữa bắt đầu nc -l 8080và cố gắng truy cập, giả sử, https://google.comvới proxy được đặt thành 127.0.0.1:80, đây là thứ xuất hiện:

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

Bạn thấy, các CONNECTyêu cầu yêu cầu máy chủ kết nối trực tiếp tới google.comcổng 443(https). Bây giờ , yêu cầu này làm gì?

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

Đầu ra từ nc -l 8080thể hiện:

CONNECT google.com:443 HTTP/1.0

Vì vậy, nó sử dụng cùng một cách để tạo ra một kết nối trực tiếp. Tuy nhiên, vì điều này tất nhiên có thể được khai thác cho hầu hết mọi thứ (ví dụ sử dụng corkscrew), CONNECTcác yêu cầu thường chỉ được giới hạn ở các cổng rõ ràng.


@sr_ Bạn có thể nói rõ hơn một chút về cách trình duyệt có thể đạt được ... kết nối TCP thông qua phần máy chủ không? Giống như vớ4, vớ5 và kết nối, có vẻ như cũng có một giao thức để ủy quyền HTTP đơn giản. Bạn vui lòng xác nhận điều này? Cảm ơn nhiều.
Harry

1
@BruceEdiger, vâng, thực sự. Tôi trừ đi 0.1để che dấu sự thiếu hiểu biết của mình. :)
sr_

1
@Harry Việc tôi chơi xung quanh ncvà Firefox có làm rõ mọi thứ một chút không?
sr_

@sr_ Tôi đã thử nc squid-proxy 3128theo sau GET http://webserver/sample HTTP/1.0, nhưng đã bị cấm HTTP / 1.0 403 (Lỗi từ chối truy cập).
Harry

1
Ugh, xin lỗi, không có ý kiến. Không phải là một chuyên gia ở đây, bạn thấy :)Bạn có thể có thể sử dụng tcpdumphoặc wiresharknhấn vào CONNECTkết nối của riêng bạn và hiểu rõ hơn ...
sr_

3

Cảm ơn, +1. Trông giống như một công cụ RẤT tinh vi và phức tạp. Đã thử echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN, nhưng đã nhận được lỗi này : 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden. Bây giờ, chỉ để xem tôi có hiểu đúng công cụ này không, tiếp theo tôi đã thử cách sử dụng cơ bản, không phải proxy : echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDIN, nhưng không nhận được phản hồi! Vì vậy, rõ ràng, tôi đang thiếu một cái gì đó ở đây trong việc sử dụng socat. Sẽ đánh giá cao nếu bạn có thể chỉ ra sai lầm của tôi.
Harry

Ok, tôi có thể làm cho lệnh gọi phiên bản không phải proxy hoạt động bằng cách sử dụng STDIO(hoặc, -) thay vì STDIN. Nhưng phiên bản proxy vẫn cho tôi lỗi tương tự.
Harry

1
Một cập nhật khác: Tôi đã thử echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128và nó hoạt động. Bạn có xác nhận nếu đây là cách tôi phải sử dụng socat(thay vì PROXY:...đặc tả địa chỉ) không?
Harry

1
Xin chào, tôi đã không sử dụng nó rất nhiều cho mình, nhưng tôi nghĩ rằng nó chính xác. Socat mở một kết nối TCP đơn giản với http-proxy và mực phân tích cú pháp http-GET và thực hiện phần còn lại. Nó có hoạt động cho https btw.? Và cuối cùng một liên kết khác: technostuff.blogspot.com/2008/10/...
Fabian Zeindl

Không, tôi chưa thử dùng https. Tôi cũng sẽ sớm lo lắng về https. Cảm ơn.
Harry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.