Jak zmusić netcat do używania istniejącego proxy HTTP

11

Mogę uzyskać dostęp do strony internetowej dobrze, bezpośrednio uderzając w mój serwer w następujący sposób:

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

Teraz chciałbym, aby netcat działał przez serwer proxy Squid HTTP (nasłuchuje na porcie 3128), podobnie jak mogę skonfigurować moją przeglądarkę Firefox za pomocą preferencji serwera proxy i pozwolić, aby działała przez serwer proxy HTTP.

Próbowałem następujące, ale to nie działało:

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

Uwaga: Używam wersji NetHata RHEL 5.3, która ma następujące opcje:

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

Fragment strony man 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

Ponieważ mój nie jest przypadkiem użycia ssh / SSL, nie jestem pewien, jak korzystać z opcji -x/ -X, ani nawet czy powinienem ich w ogóle używać!

Jeśli istnieje więcej niż jeden sposób na osiągnięcie powyższego celu (mianowicie routing ruchu netcat przez proxy HTTP), byłbym bardzo wdzięczny, gdybyś mógł udostępnić je wszystkie.

Z góry bardzo dziękuję.

Złupić
źródło

Odpowiedzi:

14

Netcat nie jest wyspecjalizowanym klientem HTTP. Połączenie przez serwer proxy dla Netcat oznacza zatem utworzenie połączenia TCP przez serwer , dlatego oczekuje on proxy SOCKS lub HTTPS z -xargumentem określonym przez -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.

connectokreśla metodę tworzenia połączeń SSL (HTTPS) przez serwer proxy. Ponieważ serwer proxy nie jest drugim punktem końcowym, a połączenie jest szyfrowane pod względem punktu końcowego, CONNECTżądanie umożliwia tunelowanie połączenia punkt-punkt za pośrednictwem serwera proxy HTTP (jeśli jest to dozwolone). (Być może przeglądam tutaj szczegóły, ale i tak nie jest to ważny punkt; szczegóły na temat „ HTTP CONNECTtunelowania” tutaj )

Aby połączyć się z serwerem za pomocą serwera proxy, musisz zrobić to, co zrobiłaby przeglądarka internetowa - porozmawiaj z serwerem proxy :

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

( To pytanie ma podobieństwo do tego; nie wiem, czy proxychainjest tu przydatne ).

Dodatek Przeglądarka korzystająca ze zwykłego serwera proxy HTTP, np. Squid (jak wiem), robi mniej więcej to, co ilustruje przykład, jak pokazuje Netcat: po ncwywołaniu skonfigurowałem Firefoksa, aby używał portu 8080 127.0.0.1 jako serwera proxy i próbowałem otworzyć google, oto co zostało wygenerowane (minus ciasteczko):

$ 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

Zachowując się w ten sposób , możesz także użyć Netcat, aby uzyskać dostęp do serwera HTTP za pośrednictwem serwera proxy HTTP. Co się teraz stanie, jeśli spróbujesz uzyskać dostęp do serwera HTTPS? Przeglądarka z pewnością nie powinna ujawniać ruchu nikomu w środku , dlatego potrzebne jest bezpośrednie połączenie ; i tutaj CONNECTwchodzi w grę. Kiedy ponownie zaczynam nc -l 8080i próbuję uzyskać dostęp, powiedzmy, https://google.comz ustawionym proxy 127.0.0.1:80, oto, co wychodzi:

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

Widzisz, CONNECTżądania prosi serwer o bezpośrednie połączenie z google.comportem 443(https). Teraz , co to żądanie zrobić?

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

Dane wyjściowe z nc -l 8080instancji:

CONNECT google.com:443 HTTP/1.0

Więc używa tego samego sposobu, aby utworzyć bezpośrednie połączenie. Ponieważ jednak można to oczywiście wykorzystać do prawie wszystkiego (na przykład przy użyciu corkscrew), CONNECTżądania są zwykle ograniczone tylko do oczywistych portów.

sr_
źródło
@ sr_ Czy mógłbyś rozwinąć nieco więcej informacji na temat tego, jak przeglądarka może uzyskiwać ... połączenie TCP za pośrednictwem części serwerowej ? Podobnie jak socks4, socks5 i connect, wydaje się, że istnieje również protokół zwykłego proxy HTTP. Czy mógłbyś to potwierdzić? Wielkie dzięki.
Harry
1
@BruceEdiger, tak, rzeczywiście. Odejmowałem, 0.1aby ukryć moją ignorancję. :)
sr_
1
@Harry Czy moja gra nci Firefox trochę to wyjaśniają?
sr_
@sr_ Próbowałem nc squid-proxy 3128następnie GET http://webserver/sample HTTP/1.0, ale dostałem HTTP / 1.0 403 Forbidden (błąd odmowy dostępu).
Harry
1
Ugh, przepraszam, nie mam pojęcia. Nie jesteś tutaj ekspertem, widzisz, że :)prawdopodobnie możesz użyć tcpdumplub wiresharkstuknąć własne CONNECTpołączenie i uzyskać wgląd ...
sr_
3

Spójrz na socat: http://www.dest-unreach.org/socat/doc/README

Fabian Zeindl
źródło
Dzięki, +1. Wygląda jak BARDZO wyrafinowane i złożone narzędzie. Próbowaliśmy echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN, ale mam ten błąd: 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden. Teraz, aby zobaczyć, czy dobrze zrozumiałem to narzędzie, wypróbowałem podstawowe użycie bez serwera proxy: echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDINale nie otrzymałem odpowiedzi! Więc, oczywiście, brakuje mi czegoś tutaj w związku z używaniem socat. Byłbym wdzięczny, gdybyś mógł wskazać mój błąd.
Harry
Ok, mogę uzyskać wywołanie wersji innej niż proxy do pracy za pomocą STDIO(lub, -) zamiast STDIN. Ale wersja proxy nadal wyświetla ten sam błąd.
Harry
1
Kolejna aktualizacja: próbowałem echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128i zadziałało. Czy potwierdziłbyś, czy właśnie w ten sposób mam korzystać socat(zamiast PROXY:...specyfikacji adresu)?
Harry
1
Cześć, nie używałem go tak często, ale myślę, że to prawda. Socat otwiera zwykłe połączenie TCP do proxy HTTP, a kałamarnica analizuje http-GET i robi resztę. Czy to działa dla https btw.? I wreszcie kolejny link: technostuff.blogspot.com/2008/10/...
Fabian Zeindl
Nie, jeszcze nie próbowałem https. Wkrótce będę się również martwić o https. Dzięki.
Harry