Comment faire en sorte que Netcat utilise un proxy HTTP existant

11

Je peux très bien accéder à une page Web en touchant directement mon serveur Web comme suit:

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

Maintenant, je voudrais que netcat passe par un proxy HTTP Squid (écoute sur le port 3128), tout comme je peux configurer mon navigateur Firefox via ses préférences de proxy et le faire passer via un proxy HTTP.

J'ai essayé ce qui suit, mais cela n'a pas fonctionné:

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

Remarque: j'utilise la version RHEL 5.3 de netcat qui dispose des options suivantes:

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

Extrait de la page de manuel de 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

Maintenant, parce que le mien n'est pas un cas d'utilisation ssh / SSL, je ne sais pas comment utiliser les options -x/ -X, ni même si je devrais les utiliser du tout!

S'il y a plus d'une façon d'atteindre l'objectif ci-dessus (à savoir, acheminer le trafic netcat via un proxy HTTP), j'apprécierais grandement si vous pouviez tous les partager.

Merci d'avance.

Harry
la source

Réponses:

14

Netcat n'est pas un client HTTP spécialisé. Se connecter via un serveur proxy pour Netcat signifie donc créer une connexion TCP via le serveur , c'est pourquoi il attend un proxy SOCKS ou HTTPS avec l' -xargument, spécifié par -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.

connectspécifie une méthode pour créer des connexions SSL (HTTPS) via un serveur proxy. Étant donné que le proxy n'est pas l'autre point de terminaison et que la connexion est chiffrée par point de terminaison, une CONNECTdemande vous permet de tunneler une connexion point à point via un proxy HTTP (si cela est autorisé). (Je vais peut-être passer sous silence les détails ici, mais ce n'est pas le point important de toute façon; les détails sur le " HTTP CONNECTtunneling" ici )

Donc , pour vous connecter à votre serveur Web à l'aide d'un proxy, vous devrez faire ce que le navigateur Web ferait - parler au proxy :

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

( Cette question a des similitudes avec celle-ci; je ne sais pas si elle proxychainest utile ici. )

Addendum Un navigateur utilisant un proxy HTTP ordinaire , par exemple Squid (tel que je le connais), fait plus ou moins ce que l'exemple illustré, comme Netcat peut vous le montrer: après l' ncappel, j'ai configuré Firefox pour utiliser le port 8080 127.0.0.1 comme proxy et a essayé d'ouvrir google, voici ce qui a été sorti (moins un 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

En agissant de cette manière également, vous pouvez utiliser Netcat pour accéder à un serveur HTTP via le proxy HTTP. Maintenant, que devrait-il se passer si vous essayez d'accéder à un serveur Web HTTPS? Le navigateur ne doit sûrement pas révéler le trafic à quiconque au milieu , donc une connexion directe est nécessaire; et c'est là CONNECTqu'entre en jeu. Lorsque je recommence nc -l 8080et que j'essaie d'accéder, disons, https://google.comavec le proxy défini sur 127.0.0.1:80, voici ce qui sort:

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

Vous voyez, la CONNECTdemande demande au serveur une connexion directe à google.com, port 443(https). Maintenant , que fait cette demande?

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

La sortie de l' nc -l 8080instance:

CONNECT google.com:443 HTTP/1.0

Il utilise donc la même manière pour créer une connexion directe. Cependant, comme cela peut bien sûr être exploité pour presque n'importe quoi (en utilisant par exemple corkscrew), les CONNECTdemandes sont généralement limitées aux ports évidents uniquement.

sr_
la source
@sr_ Pourriez-vous nous en dire un peu plus sur la façon dont un navigateur pourrait réaliser la ... connexion TCP via la partie serveur ? Tout comme socks4, socks5 et connect, il semble qu'il existe également un protocole pour le proxy HTTP standard. Pourriez-vous s'il vous plaît confirmer cela? Merci beaucoup.
Harry
1
@BruceEdiger, oui, en effet. J'ai soustrait 0.1pour masquer mon ignorance. :)
sr_
1
@Harry Mon jeu avec ncFirefox clarifie-t-il un peu les choses?
sr_
@sr_ J'ai essayé nc squid-proxy 3128suivi GET http://webserver/sample HTTP/1.0, mais j'ai obtenu un HTTP / 1.0 403 Interdit (erreur d'accès refusé).
Harry
1
Ugh, désolé, aucune idée. Pas un expert ici, vous voyez :)Vous pouvez probablement utiliser tcpdumpou wiresharkpour exploiter votre propre CONNECTconnexion et obtenir des informations ...
sr_
3

Jetez un œil à socat: http://www.dest-unreach.org/socat/doc/README

Fabian Zeindl
la source
Merci, +1. On dirait un outil TRÈS sophistiqué et complexe. J'ai essayé echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN, mais nous avons eu cette erreur: 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden. Maintenant, juste pour voir si j'ai bien compris cet outil, j'ai ensuite essayé l'utilisation de base non proxy:, echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDINmais je n'ai reçu aucune réponse! Donc, évidemment, il me manque quelque chose ici dans l'utilisation de socat. Je vous serais reconnaissant de bien vouloir signaler mon erreur.
Harry
Ok, je pourrais obtenir l'invocation de la version non proxy en utilisant STDIO(ou, -) au lieu de STDIN. Mais la version proxy me donne toujours la même erreur.
Harry
1
Une autre mise à jour: j'ai essayé echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128et cela a fonctionné. Confirmez-vous si c'est ainsi que je suis censé utiliser socat(au lieu de la PROXY:...spécification d'adresse)?
Harry
1
Salut, je ne l'ai pas tellement utilisé moi-même, mais je pense que c'est correct. Socat ouvre une simple connexion TCP au proxy http et squid analyse le http-GET et fait le reste. Cela fonctionne-t-il pour https btw.? Et enfin un autre lien: technostuff.blogspot.com/2008/10/…
Fabian Zeindl
Non, je n'ai pas encore essayé https. Je vais aussi bientôt m'inquiéter pour https. Merci.
Harry