Netcat varolan bir HTTP proxy'sini kullanma


11

Bir web sayfasına doğrudan web sunucuma aşağıdaki gibi vurarak erişebilirim:

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

Şimdi, netcat'in Firefox tarayıcımı proxy tercihleri ​​aracılığıyla yapılandırabildiğim ve bir HTTP proxy üzerinden yapmasını sağlayabildiğim gibi bir Squid HTTP proxy'si (3128 numaralı bağlantı noktasını dinleyerek) geçmesini istiyorum.

Aşağıdakileri denedim, ama işe yaramadı:

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

Not: Netcat'in aşağıdaki seçeneklere sahip RHEL 5.3 sürümünü kullanıyorum:

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

Man sayfasından alıntı 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

Şimdi, benimki bir ssh / SSL usecase olmadığından, -x/ -Xoptions'un nasıl kullanılacağından ya da bunları kullanmam gerekip gerekmediğinden emin değilim !

Yukarıdaki hedefe ulaşmak için birden fazla yol varsa (yani, bir HTTP proxy üzerinden netcat trafiğini yönlendirmek), o zaman hepsini paylaşabiliyorsanız çok memnun olurum.

Şimdiden çok teşekkürler.

Yanıtlar:


14

Netcat özel bir HTTP istemcisi değil. Netcat için bir proxy sunucu üzerinden bağlanmak, böylece sunucu üzerinden bir TCP bağlantısı oluşturmak anlamına gelir , bu nedenle aşağıdakilerle -xbelirtilen bağımsız değişkenle bir SOCKS veya HTTPS proxy'si bekler -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.

connectbir proxy sunucusu üzerinden SSL (HTTPS) bağlantıları oluşturma yöntemini belirtir. Proxy diğer uç nokta olmadığından ve bağlantı uç noktadan şifreli olduğu için, bir CONNECTistek bir HTTP Proxy'si aracılığıyla (izin veriliyorsa) noktadan noktaya bağlantı tünellemenize izin verir. (Buradaki ayrıntılar üzerinde parlıyor olabilirim, ama yine de önemli bir nokta değil; " HTTP CONNECTtünel açma" ile ilgili ayrıntılar )

Bu nedenle , web sunucunuza bir proxy kullanarak bağlanmak için web tarayıcısının yapacağı şeyi yapmanız gerekir - proxy ile konuşun :

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

( Bu sorunun buna benzerlikleri var; proxychainburada kullanılıp kullanılmadığını bilmiyorum . )

Ek Sıradan bir HTTP proxy, örneğin Squid (bildiğim gibi) kullanan bir tarayıcı , Netcat'in size gösterebileceği gibi, örnekte gösterileni az çok yapar: ncaramadan sonra Firefox'u 127.0.0.1 bağlantı noktası 8080'i proxy olarak kullanacak şekilde yapılandırdım ve google'ı açmaya çalıştı, çıktı çıktı (bir çerez eksi):

$ 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

Bu şekilde davranarak , HTTP proxy üzerinden bir HTTP sunucusuna erişmek için Netcat'i kullanabilirsiniz. Şimdi, bir HTTPS web sunucusuna erişmeye çalışırsanız ne olur? Tarayıcı kesinlikle ortadaki kimseye olan trafiği göstermemelidir , bu nedenle doğrudan bir bağlantı gereklidir; ve işte burada CONNECTdevreye giriyor. Tekrar başladığımda nc -l 8080ve diyelim ki https://google.comproxy ayarlanmış olarak erişmeye çalıştığımda 127.0.0.1:80, işte bu çıkıyor:

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

Gördüğünüz gibi, CONNECTistekler sunucudan bağlantı google.comnoktası 443(https) ile doğrudan bağlantı ister . Şimdi , bu talep ne yapıyor?

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

Örnek çıktısı nc -l 8080:

CONNECT google.com:443 HTTP/1.0

Bu yüzden doğrudan bağlantı oluşturmak için aynı yolu kullanır. Ancak, elbette neredeyse her şey için (örneğin kullanılarak corkscrew) kullanılabileceğinden, CONNECTistekler genellikle yalnızca bariz bağlantı noktaları ile sınırlıdır.


@sr_ Bir tarayıcının sunucu bölümü üzerinden TCP bağlantısına nasıl ulaştığı hakkında biraz daha ayrıntılı bilgi verebilir misiniz ? Aynı socks4, socks5 ve connect gibi, düz HTTP proxy için de bir protokol var gibi görünüyor. Lütfen bunu onaylar mısınız? Çok teşekkürler.
Harry

1
@BruceEdiger, evet, gerçekten. Ben çıkarılır 0.1Cehaletimi maskelemek için. :)
sr_

1
@Harry ncve Firefox ile oynadığım şeyler biraz netleşiyor mu ?
sr_

@sr_ Ben çalıştı nc squid-proxy 3128izledi GET http://webserver/sample HTTP/1.0ancak bir HTTP / Yasak 1.0 403 (Erişim hatası reddedildi) aldık.
Harry

1
Ah, üzgünüm, hiçbir fikrim yok. Burada bir uzman değil, görüyorsunuz :)Muhtemelen kendi bağlantınızı kullanabilir tcpdumpveya wiresharkdokunabilir CONNECTve içgörü elde edebilirsiniz ...
sr_

3

Teşekkürler +1. ÇOK sofistike ve karmaşık bir araç gibi görünüyor. Güvenilir echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN, ancak bu hata var: 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden. Şimdi, bu aracı doğru anlayıp anlamadığımı görmek için, daha sonra temel, proxy olmayan kullanımı denedim:, echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDINancak geri dönüş yok! Açıkçası, burada socat kullanımında bir şey eksik. Eğer benim hata işaret olabilir eğer takdir ediyorum.
Harry

Tamam, bunun yerine STDIO(veya, -) kullanarak çalışmak için proxy olmayan sürüm çağrısı alabilirsiniz STDIN. Ancak proxy sürümü hala bana aynı hatayı veriyor.
Harry

1
Başka bir güncelleme: Denedim echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128ve işe yaradı. socat( PROXY:...Adres belirtimi yerine) bu şekilde kullanmamın gerekip gerekmediğini onaylar mısınız?
Harry

1
Merhaba, çok fazla kullanmadım, ama bence doğru. Socat, http-proxy'ye düz bir TCP Bağlantısı açar ve kalamar http-GET'i ayrıştırır ve gerisini yapar. Https btw için çalışıyor mu? Ve son olarak başka bir link: technostuff.blogspot.com/2008/10/...
Fabian Zeindl

Hayır, henüz https denemedim. Yakında https için de endişeleneceğim. Teşekkürler.
Harry
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.