วิธีทำให้ netcat ใช้พร็อกซี HTTP ที่มีอยู่


11

ฉันสามารถเข้าใช้งานเว็บเพจได้ด้วยการกดปุ่มเว็บเซิร์ฟเวอร์ของฉันโดยตรงดังนี้:

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

ตอนนี้ฉันอยากให้ netcat ผ่านพร็อกซี Squid HTTP (ฟังพอร์ต 3128) เหมือนว่าฉันสามารถกำหนดค่าเบราว์เซอร์ Firefox ของฉันผ่านการตั้งค่าพร็อกซีได้และให้มันผ่านพร็อกซี HTTP

ฉันลองสิ่งต่อไปนี้ แต่มันไม่ทำงาน:

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

หมายเหตุ: ฉันใช้ netcat รุ่น RHEL 5.3 ที่มีตัวเลือกต่อไปนี้:

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

ตัดตอนมาจากหน้าคนของ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

ตอนนี้เพราะของฉันไม่ใช่ usecase ของ ssh / SSL ฉันไม่แน่ใจว่าจะใช้ตัวเลือก-x/ -Xอย่างไรหรือแม้ว่าฉันควรจะใช้มันเลย!

หากมีมากกว่าหนึ่งวิธีในการบรรลุเป้าหมายข้างต้น (เช่นการกำหนดเส้นทางทราฟฟิก netcat ผ่านพร็อกซี HTTP) ฉันจะขอบคุณอย่างมากหากคุณสามารถแบ่งปันได้ทั้งหมด

ขอบคุณมากล่วงหน้า

คำตอบ:


14

Netcat ไม่ใช่ไคลเอนต์ HTTP พิเศษ การเชื่อมต่อผ่านพร็อกซีเซิร์ฟเวอร์สำหรับ Netcat หมายถึงการสร้างการเชื่อมต่อ TCP ผ่านเซิร์ฟเวอร์ซึ่งเป็นเหตุผลว่าทำไมจึงคาดว่าพร็อกซี SOCKS หรือ HTTPS ที่มี-xอาร์กิวเมนต์จะถูกระบุโดย-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.

connectระบุวิธีการสร้างการเชื่อมต่อ SSL (HTTPS) ผ่านพร็อกซีเซิร์ฟเวอร์ เนื่องจากพร็อกซีไม่ใช่จุดสิ้นสุดอื่น ๆ และการเชื่อมต่อนั้นถูกเข้ารหัสลับแบบ endpoint-wise การCONNECTร้องขออนุญาตให้คุณทำการเชื่อมต่อแบบจุดต่อจุดผ่านพร็อกซี HTTP (หากได้รับอนุญาต) (ฉันอาจกำลังตรวจสอบรายละเอียดที่นี่ แต่ไม่ใช่จุดสำคัญอย่างไรก็ตามรายละเอียดเกี่ยวกับ "การHTTP CONNECTขุดอุโมงค์" ที่นี่ )

ดังนั้นในการเชื่อมต่อกับเว็บเซิร์ฟเวอร์ของคุณโดยใช้พร็อกซีคุณจะต้องทำสิ่งที่เว็บเบราว์เซอร์จะทำ - พูดคุยกับพร็อกซี :

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

( คำถามนั้นมีความคล้ายคลึงกับคำถามนี้ฉันไม่รู้ว่าproxychainใช้ที่นี่หรือไม่ )

ภาคผนวก เบราว์เซอร์ที่ใช้พร็อกซี HTTP ธรรมดาเช่น Squid (เท่าที่ฉันรู้) ทำในสิ่งที่มากขึ้นหรือน้อยลงตามตัวอย่างที่ Netcat สามารถแสดงให้คุณเห็น: หลังการncโทรฉันกำหนดค่า Firefox ให้ใช้พอร์ต 127.0.0.1 8080 เป็นพร็อกซี่ และพยายามเปิด google นี่คือผลลัพธ์ที่ได้ (ลบด้วยคุกกี้):

$ 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

ด้วยการทำเช่นนี้คุณสามารถใช้ Netcat เพื่อเข้าถึงเซิร์ฟเวอร์ HTTP ผ่านพร็อกซี HTTP ทีนี้จะเกิดอะไรขึ้นถ้าคุณพยายามเข้าถึงเว็บเซิร์ฟเวอร์ HTTPS เบราว์เซอร์ไม่ควรเปิดเผยการรับส่งข้อมูลให้กับทุกคนที่อยู่ตรงกลางดังนั้นจำเป็นต้องมีการเชื่อมต่อโดยตรง และนี่คือที่CONNECTเข้ามาเล่น เมื่อฉันเริ่มต้นอีกครั้งnc -l 8080และพยายามเข้าถึงพูดhttps://google.comด้วยการตั้งค่าพร็อกซี127.0.0.1:80นี่คือสิ่งที่ออกมา:

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

คุณจะเห็นCONNECTคำขอร้องขอเซิร์ฟเวอร์สำหรับการเชื่อมต่อโดยตรงกับgoogle.comพอร์ต443(https) ตอนนี้คำขอนี้ทำอะไร?

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

ผลลัพธ์จากnc -l 8080อินสแตนซ์:

CONNECT google.com:443 HTTP/1.0

ดังนั้นจึงใช้วิธีเดียวกันในการสร้างการเชื่อมต่อโดยตรง อย่างไรก็ตามเนื่องจากสามารถนำไปใช้ประโยชน์ได้เกือบทุกอย่าง (โดยใช้ตัวอย่างcorkscrew) CONNECTการร้องขอมักจะ จำกัด เฉพาะพอร์ตที่ชัดเจนเท่านั้น


@sr_ คุณช่วยอธิบายเพิ่มเติมอีกเล็กน้อยเกี่ยวกับวิธีที่เบราว์เซอร์อาจใช้การเชื่อมต่อ ... TCP ผ่านส่วนเซิร์ฟเวอร์ได้หรือไม่ เช่นเดียวกับ socks4, socks5 และการเชื่อมต่อดูเหมือนว่าจะมีโปรโตคอลสำหรับการมอบฉันทะ HTTP แบบธรรมดาเช่นกัน คุณช่วยยืนยันเรื่องนี้ได้ไหม ขอบคุณมาก.
แฮร์รี่

1
@BruceEdiger ใช่แน่นอน ฉันลบ0.1เพื่อปกปิดความไม่รู้ของฉัน :)
sr_

1
@Harry ฉันเล่นด้วยncและ Firefox ชี้แจงสิ่งเล็ก ๆ น้อย ๆ ?
sr_

@sr_ ฉันพยายามnc squid-proxy 3128ตามมาด้วยGET http://webserver/sample HTTP/1.0, แต่เกิด HTTP / 1.0 403 พระราชวังต้องห้าม (Access ปฏิเสธข้อผิดพลาด)
แฮร์รี่

1
เอ่อขอโทษไม่มีความคิด ไม่ใช่ผู้เชี่ยวชาญที่นี่คุณเห็น:)คุณอาจจะสามารถใช้tcpdumpหรือwiresharkแตะCONNECTการเชื่อมต่อของคุณเองและรับข้อมูลเชิงลึก ...
sr_

3

ขอบคุณ +1 ดูเหมือนเครื่องมือที่ซับซ้อนและซับซ้อนมาก พยายามแต่มีข้อผิดพลาดนี้:echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbiddenตอนนี้เพียงเพื่อดูว่าฉันเข้าใจเครื่องมือนี้ถูกต้องแล้วฉันลองใช้การใช้งานพื้นฐานที่ไม่ใช่พร็อกซี่ต่อไปecho "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDINแต่ไม่ได้รับการตอบกลับ! เห็นได้ชัดว่าฉันขาดอะไรบางอย่างที่นี่ในการใช้งาน socat จะขอบคุณถ้าคุณสามารถชี้ให้เห็นความผิดพลาดของฉัน
แฮร์รี่

ตกลงฉันจะได้รับไม่ใช่พร็อกซี่รุ่นภาวนากับการทำงานโดยใช้STDIO(หรือ-) STDINแทน แต่เวอร์ชันพร็อกซียังคงให้ข้อผิดพลาดเดิมกับฉันอยู่
แฮร์รี่

1
การอัปเดตอื่น:ฉันลองecho "GET http://web-server/sample" | socat - TCP:squid-proxy:3128และใช้งานได้ คุณจะยืนยันหรือไม่ว่านี่เป็นวิธีที่ฉันควรใช้socat(แทนที่จะเป็นPROXY:...ข้อกำหนดที่อยู่) หรือไม่
แฮร์รี่

1
สวัสดีฉันไม่ได้ใช้มันมากนัก แต่ฉันคิดว่ามันถูกต้อง Socat เปิดการเชื่อมต่อ TCP แบบธรรมดาไปยัง http-proxy และ squid แยกวิเคราะห์ http-GET และทำส่วนที่เหลือ ใช้งานได้กับ https btw หรือไม่ และในที่สุดก็มีลิงค์อื่น: technostuff.blogspot.com/2008/10/…
Fabian Zeindl

ไม่ฉันยังไม่ได้ลอง https ฉันจะต้องกังวลเกี่ยวกับ https เช่นกัน ขอบคุณ
แฮร์รี่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.