Come fare in modo che netcat utilizzi un proxy HTTP esistente


11

Posso accedere bene a una pagina Web colpendo direttamente il mio server Web come segue:

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

Ora, vorrei che netcat passasse attraverso un proxy Squid HTTP (ascoltando sulla porta 3128), proprio come posso configurare il mio browser Firefox tramite le sue preferenze proxy e farlo passare tramite un proxy HTTP.

Ho provato quanto segue, ma non ha funzionato:

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

Nota: sto usando la versione RHEL 5.3 di netcat che ha le seguenti opzioni:

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

Estratto dalla pagina man di 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

Ora, poiché il mio non è un caso d'uso SSH / SSL, non sono sicuro di come utilizzare le opzioni -x/ -X, o anche se dovrei usarle affatto!

Se esiste più di un modo per raggiungere l'obiettivo sopra indicato (vale a dire, instradare il traffico netcat tramite un proxy HTTP), apprezzerei molto se tu potessi condividerli tutti.

Molte grazie in anticipo.

Risposte:


14

Netcat non è un client HTTP specializzato. Connettersi tramite un server proxy per Netcat significa quindi creare una connessione TCP attraverso il server , motivo per cui si aspetta un proxy SOCKS o HTTPS con l' -xargomento, specificato da -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.

connectspecifica un metodo per la creazione di connessioni SSL (HTTPS) tramite un server proxy. Poiché il proxy non è l'altro endpoint e la connessione è crittografata in base all'endpoint, una CONNECTrichiesta consente di eseguire il tunneling di una connessione da punto a punto tramite un proxy HTTP (se consentito). (Potrei passare in rassegna i dettagli qui, ma non è comunque il punto importante; dettagli sul " HTTP CONNECTtunneling" qui )

Quindi , per connetterti al tuo server web usando un proxy, dovrai fare ciò che farebbe il browser web - parla con il proxy :

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

( Questa domanda ha somiglianze con questa; non so se proxychainsia utile qui. )

Addendum Un browser che utilizza un normale proxy HTTP, ad esempio Squid (come lo so), fa più o meno ciò che l'esempio illustrato, come Netcat può mostrarti: dopo la ncchiamata, ho configurato Firefox per utilizzare la porta 80.0.0.1.18080 come proxy e ho provato ad aprire google, ecco cosa è stato prodotto (meno 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

Anche in questo modo , è possibile utilizzare Netcat per accedere a un server HTTP tramite il proxy HTTP. Ora, cosa dovrebbe succedere se si tenta di accedere a un server Web HTTPS? Il browser sicuramente non dovrebbe rivelare il traffico a nessuno nel mezzo , quindi è necessaria una connessione diretta ; ed è qui che CONNECTentra in gioco. Quando inizio di nuovo nc -l 8080e provo ad accedere, ad esempio, https://google.comcon il proxy impostato su 127.0.0.1:80, ecco cosa viene fuori:

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

Vedete, le CONNECTrichieste chiedono al server una connessione diretta a google.com, port 443(https). Ora , cosa fa questa richiesta?

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

L'output nc -l 8080dall'istanza:

CONNECT google.com:443 HTTP/1.0

Quindi utilizza lo stesso modo per creare una connessione diretta. Tuttavia, poiché questo può ovviamente essere sfruttato per quasi tutto (usando ad esempio corkscrew), le CONNECTrichieste sono generalmente limitate solo alle porte ovvie.


@sr_ Potresti approfondire un po 'di più su come un browser potrebbe raggiungere la ... connessione TCP attraverso la parte server ? Proprio come socks4, socks5 e connect, sembra che esista anche un protocollo per il proxy HTTP semplice. Per favore, lo confermi? Grazie molto.
Harry,

1
@BruceEdiger, sì, davvero. Ho sottratto 0.1per mascherare la mia ignoranza. :)
sr_

1
@Harry Il mio gioco con ncFirefox mi chiarisce un po 'le cose?
sr_

@sr_ Ho provato nc squid-proxy 3128seguito da GET http://webserver/sample HTTP/1.0, ma ho ricevuto un HTTP / 1.0 403 proibito (errore accesso negato).
Harry,

1
Uff, scusa, non ne ho idea. Qui non sei un esperto, vedi :)Probabilmente puoi usare tcpdumpo wiresharktoccare la tua CONNECTconnessione e ottenere approfondimenti ...
sr_

3

Grazie +1. Sembra uno strumento MOLTO sofisticato e complesso. Provato echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN, ma ha ottenuto l'errore: 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden. Ora, solo per vedere se ho capito bene questo strumento, ho successivamente provato l'uso di base, non proxy:, echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDINma non ho ricevuto risposta! Quindi, ovviamente, mi manca qualcosa qui nell'uso socat. Gradirei se potessi sottolineare il mio errore.
Harry,

Ok, potrei far funzionare l'invocazione della versione non proxy usando STDIO(o, -) invece di STDIN. Ma la versione proxy mi sta ancora dando lo stesso errore.
Harry,

1
Un altro aggiornamento: ho provato echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128e ha funzionato. Confermeresti se è così che dovrei usare socat(invece della PROXY:...specifica dell'indirizzo)?
Harry,

1
Ciao, non l'ho usato così tanto da solo, ma penso che sia corretto. Socat apre una semplice connessione TCP al proxy http e squid analizza http-GET e fa il resto. Funziona per HTTPS BTW? E infine un altro link: technostuff.blogspot.com/2008/10/…
Fabian Zeindl,

No, non ho ancora provato https. Presto mi preoccuperò anche di HTTPS. Grazie.
Harry,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.