Як змусити netcat використовувати існуючий HTTP-проксі


11

Я можу отримати доступ до веб-сторінки просто чудово, прямо натиснувши на свій веб-сервер наступним чином:

$ 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/ -Xoptions, або навіть, чи повинен я взагалі їх використовувати!

Якщо для досягнення зазначеної мети існує більше ніж один спосіб (а саме маршрутизація мережевого трафіку через HTTP-проксі), то я дуже вдячний, якщо ви зможете поділитися ними всіма.

Заздалегідь дякую.

Відповіді:


14

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запити, як правило, обмежуються лише явними портами.


@sr_ Не могли б ви детальніше розібратися, як браузер може досягти ... TCP-з'єднання через серверну частину? Як і socks4, socks5, і підключення, схоже, є протокол і для звичайного HTTP-проксі. Чи підтвердите це, будь ласка? Дуже дякую.
Гаррі

1
@BruceEdiger, так, справді. Я відняв, 0.1щоб замаскувати своє незнання. :)
sr_

1
@Harry Чи грає я з ncFirefox і трохи прояснює речі?
sr_

@sr_ Я спробував nc squid-proxy 3128 слідувати за цим GET http://webserver/sample HTTP/1.0, але отримав HTTP / 1.0 403 Заборонено (у доступі відхилено помилку).
Гаррі

1
Фу, вибачте, поняття не має. Чи не експерт тут, ви бачите , :)ви , ймовірно , можна використовувати tcpdumpабо wiresharkзадіяти свої власні CONNECTз'єднання і отримати уявлення про ...
SR_

3

Погляньте на socat: http://www.dest-unreach.org/socat/doc/README


Спасибі, +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 відкриває звичайне TCP-з'єднання з http-проксі і кальмарами аналізує http-GET і робить все інше. Це працює для https btw.? І , нарешті , ще одне посилання: technostuff.blogspot.com/2008/10 / ...
Fabian Zeindl

Ні, я ще не спробував https. Я скоро потурбуюсь і про https. Дякую.
Гаррі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.