So lassen Sie Netcat einen vorhandenen HTTP-Proxy verwenden

11

Ich kann problemlos auf eine Webseite zugreifen, indem ich direkt auf meinen Webserver gehe:

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

Jetzt möchte ich, dass Netcat über einen Squid-HTTP-Proxy (der Port 3128 überwacht) verwendet wird, ähnlich wie ich meinen Firefox-Browser über seine Proxy-Einstellungen konfigurieren und über einen HTTP-Proxy verwenden kann.

Ich habe Folgendes versucht, aber es hat nicht funktioniert:

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

Hinweis: Ich verwende die RHEL 5.3-Version von Netcat mit den folgenden Optionen:

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

Auszug aus der Manpage von 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

Jetzt, da mein kein ssh / SSL usecase ist, ich bin nicht sicher , wie die verwenden -x/ -XOptionen oder sogar , ob ich sie überhaupt verwenden soll!

Wenn es mehr als einen Weg gibt, um das oben genannte Ziel zu erreichen (nämlich das Weiterleiten des Netcat-Verkehrs über einen HTTP-Proxy), würde ich mich sehr freuen, wenn Sie alle gemeinsam nutzen könnten.

Vielen Dank im Voraus.

Harry
quelle

Antworten:

14

Netcat ist kein spezialisierter HTTP-Client. Das Herstellen einer Verbindung über einen Proxyserver für Netcat bedeutet daher, dass eine TCP-Verbindung über den Server hergestellt wird. Aus diesem Grund wird ein SOCKS- oder HTTPS-Proxy mit dem folgenden -xArgument erwartet -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.

connectGibt eine Methode zum Erstellen von SSL-Verbindungen (HTTPS) über einen Proxyserver an. Da der Proxy nicht der andere Endpunkt ist und die Verbindung endpunktweise verschlüsselt ist, CONNECTkönnen Sie mit einer Anforderung eine Punkt-zu-Punkt-Verbindung über einen HTTP-Proxy tunneln (sofern dies zulässig ist). (Ich beschönige hier vielleicht Details, aber es ist sowieso nicht der wichtige Punkt; Details zum " HTTP CONNECTTunneln" hier )

Also , auf den Webserver zu verbinden , einen Proxy verwenden, müssen Sie tun , was der Web - Browser tun würde - sprechen Sie mit dem Proxy :

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

( Diese Frage hat Ähnlichkeiten mit dieser; ich weiß nicht, ob sie proxychainhier von Nutzen ist. )

Nachtrag Ein Browser, der einen normalen HTTP-Proxy verwendet, z. B. Squid (wie ich ihn kenne), macht mehr oder weniger das, was das Beispiel zeigt, wie Netcat Ihnen zeigen kann: Nach dem ncAufruf habe ich Firefox so konfiguriert, dass 127.0.0.1 Port 8080 als Proxy verwendet wird und versucht, Google zu öffnen, wurde Folgendes ausgegeben (abzüglich eines Cookies):

$ 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

Auf diese Weise können Sie auch Netcat verwenden, um über den HTTP-Proxy auf einen HTTP-Server zuzugreifen. Was sollte nun passieren, wenn Sie versuchen, auf einen HTTPS-Webserver zuzugreifen? Der Browser sollte den Datenverkehr sicherlich niemandem in der Mitte offenlegen , daher ist eine direkte Verbindung erforderlich. und hier CONNECTkommt ins Spiel. Wenn ich erneut starte nc -l 8080und versuche, beispielsweise https://google.commit eingestelltem Proxy auf etwas zuzugreifen, 127.0.0.1:80kommt Folgendes heraus:

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

Sie sehen, die CONNECTAnforderungen fordern den Server auf, eine direkte Verbindung zum google.comPort 443(https) herzustellen . Nun , was macht diese Anforderung?

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

Die Ausgabe der nc -l 8080Instanz:

CONNECT google.com:443 HTTP/1.0

Auf die gleiche Weise wird also eine direkte Verbindung hergestellt. Da dies natürlich für fast alles ausgenutzt werden kann (z. B. mit corkscrew), sind CONNECTAnforderungen normalerweise nur auf die offensichtlichen Ports beschränkt.

sr_
quelle
@sr_ Könnten Sie etwas näher erläutern, wie ein Browser die ... TCP-Verbindung über den Serverteil herstellen kann ? Genau wie bei socks4, socks5 und connect scheint es auch ein Protokoll für einfaches HTTP-Proxy zu geben. Würden Sie dies bitte bestätigen? Danke vielmals.
Harry
1
@ BruceEdiger, ja, in der Tat. Ich subtrahierte 0.1, um meine Unwissenheit zu maskieren. :)
sr_
1
@Harry Klärt mein Herumspielen mit ncund Firefox die Dinge ein wenig?
sr_
@sr_ Ich habe es versucht, nc squid-proxy 3128gefolgt von GET http://webserver/sample HTTP/1.0einem HTTP / 1.0 403 Forbidden (Zugriff verweigert Fehler).
Harry
1
Ugh, sorry, keine Ahnung. Sie sehen, :)Sie sind hier kein Experte. Sie können wahrscheinlich Ihre eigene Verbindung verwenden tcpdumpoder nutzen wireshark, CONNECTum Einblicke zu gewinnen ...
sr_
3

Schauen Sie sich socat an: http://www.dest-unreach.org/socat/doc/README

Fabian Zeindl
quelle
Danke, +1. Sieht aus wie ein sehr ausgeklügeltes und komplexes Werkzeug. Versucht echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN, aber diesen Fehler bekommen : 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden. Um zu sehen, ob ich dieses Tool richtig verstanden habe, habe ich als nächstes die grundlegende Nicht-Proxy-Verwendung ausprobiert : echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDIN, aber keine Antwort zurückbekommen! Offensichtlich fehlt mir hier im Socat-Gebrauch etwas. Würde mich freuen, wenn Sie auf meinen Fehler hinweisen könnten.
Harry
Ok, ich könnte den Aufruf der Nicht-Proxy-Version zum Funktionieren bringen, indem ich STDIO(oder, -) anstelle von verwende STDIN. Aber die Proxy-Version gibt mir immer noch den gleichen Fehler.
Harry
1
Noch ein Update: Ich habe es versucht echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128und es hat funktioniert. Würden Sie bestätigen, ob ich dies so verwenden soll socat(anstelle der PROXY:...Adressangabe)?
Harry
1
Hallo, ich habe es selbst nicht so oft benutzt, aber ich denke es ist richtig. Socat öffnet eine einfache TCP-Verbindung zum http-Proxy und Squid analysiert das http-GET und erledigt den Rest. Funktioniert es übrigens für https? Und zum Schluss noch ein Link: technostuff.blogspot.com/2008/10/…
Fabian Zeindl
Nein, ich habe https noch nicht ausprobiert. Ich werde mir bald auch Sorgen um https machen. Vielen Dank.
Harry