Cara membuat netcat menggunakan proxy HTTP yang ada

11

Saya dapat mengakses halaman web dengan baik dengan langsung menekan server web saya sebagai berikut:

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

Sekarang, saya ingin netcat untuk pergi melalui proxy HTTP Squid (mendengarkan pada port 3128), seperti saya dapat mengkonfigurasi browser Firefox saya melalui preferensi proxy dan memilikinya melalui proxy HTTP.

Saya mencoba yang berikut, tetapi tidak berhasil:

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

Catatan: Saya menggunakan versi netcat RHEL 5.3 yang memiliki opsi berikut:

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

Kutipan dari halaman manual 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

Sekarang, karena milik saya bukan usecase ssh / SSL, saya tidak yakin bagaimana menggunakan opsi -x/ -X, atau bahkan apakah saya harus menggunakannya sama sekali!

Jika ada lebih dari satu cara untuk mencapai tujuan di atas (yaitu, merutekan lalu lintas netcat melalui proxy HTTP), maka saya akan sangat menghargai jika Anda dapat membagikan semuanya.

Banyak terima kasih sebelumnya.

Harry
sumber

Jawaban:

14

Netcat bukan klien HTTP khusus. Menghubungkan melalui server proxy untuk Netcat dengan demikian berarti membuat koneksi TCP melalui server , itulah sebabnya ia mengharapkan proxy SOCKS atau HTTPS dengan -xargumen, yang ditentukan oleh -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.

connectmenentukan metode untuk membuat koneksi SSL (HTTPS) melalui server proxy. Karena proksi bukan titik akhir yang lain dan koneksi dienkripsi dari titik akhir, CONNECTpermintaan memungkinkan Anda untuk melakukan terowongan titik-ke-titik melalui Proxy HTTP (jika diizinkan). (Saya mungkin membahas detail di sini, tapi itu bukan poin penting pula; detail tentang " HTTP CONNECTtunneling" di sini )

Jadi , untuk terhubung ke server web Anda menggunakan proxy, Anda harus melakukan apa yang browser web akan lakukan - berbicara dengan proxy :

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

( Pertanyaan itu memiliki kemiripan dengan yang ini; Saya tidak tahu apakah proxychainada gunanya di sini. )

Tambahan Peramban yang menggunakan proxy HTTP biasa , misalnya Squid (seperti yang saya tahu), melakukan apa yang kurang lebih seperti contoh diilustrasikan, seperti yang ditunjukkan Netcat kepada Anda: setelah ncpanggilan, saya mengonfigurasi Firefox untuk menggunakan 127.0.0.1 port 8080 sebagai proxy dan mencoba membuka google, inilah yang menjadi keluaran (dikurangi 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

Dengan berperilaku seperti ini , Anda juga dapat menggunakan Netcat untuk mengakses server HTTP melalui proxy HTTP. Sekarang, apa yang harus terjadi jika Anda mencoba mengakses server web HTTPS? Browser pasti tidak boleh mengungkapkan lalu lintas ke siapa pun di tengah , sehingga koneksi langsung diperlukan; dan di sinilah CONNECTperannya. Ketika saya mulai lagi nc -l 8080dan mencoba mengakses, katakanlah, https://google.comdengan proxy disetel ke 127.0.0.1:80, inilah yang keluar:

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

Anda lihat, CONNECTpermintaan meminta server untuk koneksi langsung ke google.com, port 443(https). Sekarang , apa yang dilakukan permintaan ini?

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

Output dari nc -l 8080instance:

CONNECT google.com:443 HTTP/1.0

Jadi ia menggunakan cara yang sama untuk membuat koneksi langsung. Namun, karena hal ini tentu saja dapat dieksploitasi untuk hampir semua hal (misalnya menggunakan corkscrew), CONNECTpermintaan biasanya dibatasi hanya untuk port yang jelas.

sr_
sumber
@sr_ Bisakah Anda menguraikan sedikit lebih banyak tentang bagaimana browser mungkin mencapai ... koneksi TCP melalui bagian server ? Sama seperti socks4, socks5, dan terhubung, sepertinya ada protokol untuk proxy HTTP juga. Bisakah Anda mengkonfirmasi ini? Terimakasih banyak.
Harry
1
@BruceEdiger, ya, memang. Saya mengurangi 0.1untuk menutupi ketidaktahuan saya. :)
sr_
1
@ Harry Apakah bermain-main dengan saya ncdan Firefox sedikit memperjelas hal-hal?
sr_
@ sr_ Saya mencoba nc squid-proxy 3128diikuti GET http://webserver/sample HTTP/1.0, tetapi mendapat HTTP / 1.0 403 Forbidden (Akses ditolak kesalahan).
Harry
1
Ugh, maaf, tidak tahu. Bukan ahli di sini, Anda lihat :)Anda mungkin dapat menggunakan tcpdumpatau wiresharkmengetuk CONNECTkoneksi Anda sendiri dan mendapatkan wawasan ...
sr_
3

Lihatlah socat: http://www.dest-unreach.org/socat/doc/README

Fabian Zeindl
sumber
Terima kasih, +1. Tampak seperti alat yang SANGAT canggih dan rumit. Mencoba echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN, tapi punya kesalahan ini: 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden. Sekarang, hanya untuk melihat apakah saya memahami alat ini dengan benar, saya selanjutnya mencoba penggunaan dasar, non-proxy:, echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDINtetapi tidak mendapat tanggapan kembali! Jadi, jelas, saya kehilangan sesuatu di sini dalam penggunaan socat. Akan menghargai jika Anda bisa menunjukkan kesalahan saya.
Harry
Oke, saya bisa meminta pemanggilan versi non-proxy berfungsi dengan menggunakan STDIO(atau, -) STDIN. Tetapi versi proksi masih memberi saya kesalahan yang sama.
Harry
1
Pembaruan lain: Saya mencoba echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128dan berhasil. Apakah Anda mengonfirmasi jika ini adalah cara saya seharusnya menggunakan socat(bukan PROXY:...spesifikasi alamat)?
Harry
1
Hai, saya sendiri belum pernah menggunakannya, tetapi saya pikir itu benar. Socat membuka koneksi TCP sederhana ke http-proxy dan squid mem-parsing http-GET dan melakukan sisanya. Apakah itu berfungsi untuk https btw.? Dan akhirnya tautan lain: technostuff.blogspot.com/2008/10/…
Fabian Zeindl
Tidak, saya belum mencoba https. Saya juga akan mengkhawatirkan https. Terima kasih.
Harry