ฉันสามารถ telnet ไปยังพอร์ต HTTP 80 ได้อย่างไร


16

หลังจากค้นหาใน google ฉันพบว่าเราสามารถtelnetไปยังเว็บเซิร์ฟเวอร์ไปยังพอร์ต http ของมันและใช้GETเพื่อดึงหน้า html

ตัวอย่างเช่น:

$ telnet web-server-name 80

แต่ฉันไม่สามารถเข้าใจว่าเป็นไปได้อย่างไร

ฉันคิดว่าถ้าพอร์ต 80 สำหรับเซิร์ฟเวอร์ http พอร์ต 80 จะรับฟังhttpคำขอเท่านั้น แต่ฉันจะtelnetไปยังHTTPพอร์ตได้อย่างไร

ไม่ได้telnetและHTTPสองโปรโตคอลที่แตกต่างกันอย่างไร


2
สำหรับการหลอกลวงรอบ ๆ ใน 'net คำสั่งnetcat ( nc(1)) นั้นยืดหยุ่นกว่ามาก มันสามารถเชื่อมต่อกับบริการที่เข้ารหัส SSL / TLS และยังสามารถใช้เป็นเซิร์ฟเวอร์และแม้กระทั่งการถ่ายทอดข้อมูลรอบ ๆ
vonbrand

คำตอบ:


25

ขอแสดงความยินดีคุณเพิ่งเจาะลึกถึงแนวคิดของเลเยอร์เครือข่ายโดยตระหนักว่าพอร์ตและโปรโตคอลไม่ได้เชื่อมต่อกันโดยตรง ตามที่คนอื่นพูด telnet สามารถใช้เพื่อเชื่อมต่อกับพอร์ต TCP ใด ๆ อย่างไรก็ตามเพื่อให้เข้าใจว่าทำไมจึงเป็นไปได้คุณจำเป็นต้องเข้าใจเกี่ยวกับเลเยอร์เครือข่าย หากคุณเคยได้ยินรุ่นชั้น OSI 7นี่คือสิ่งที่ช่วยให้คุณใช้ telnet เพื่อเชื่อมต่อกับพอร์ตอื่น แม้ว่าบนอินเทอร์เน็ตพวกเขาจะเกี่ยวข้องกับ 4 เลเยอร์เท่านั้นและเรียกว่าInternet Protocol Suite. หากไม่มีเลเยอร์เครือข่ายแต่ละโปรแกรมจะไม่เพียง แต่ต้องเข้าใจโปรโตคอลของตัวเอง แต่จะต้องกำหนดรูปแบบที่อยู่ IP และระบบพอร์ตของตัวเองซึ่งหมายความว่าเราเตอร์แต่ละคนจะต้องเข้าใจวิธีการกำหนดเส้นทางแผนการเหล่านี้และโปรโตคอลที่แตกต่างกัน เรียนรู้และวินิจฉัยได้ยากขึ้น ในการกล่าวง่ายๆก็คืออินเทอร์เน็ตจะทำงานได้ไม่ดีหากไม่มีเลเยอร์

สิ่งที่คุณกังวลคือเลเยอร์การขนส่งและเลเยอร์แอปพลิเคชัน ที่ transport layer เรามีโปรโตคอลอินเทอร์เน็ตเช่น TCP และ UDP พร้อมหมายเลขพอร์ตตั้งแต่ 1 ถึง 65535 ในแต่ละพอร์ต ที่ชั้นแอปพลิเคชันเรามีโปรโตคอลเช่น HTTP, SMTP และ DNS โดยปกติแล้วแต่ละเอกสารมาตรฐานอินเทอร์เน็ตที่กำหนดโปรโตคอลจะระบุพอร์ต TCP หรือ UDP เริ่มต้นที่โปรโตคอลควรใช้เป็นค่าเริ่มต้น เช่นพอร์ต TCP 80 สำหรับ HTTP, พอร์ต TCP 25 สำหรับ SMTP, พอร์ต UDP 53 สำหรับ DNS และพอร์ต TCP 23 สำหรับ Telnet โปรแกรม telnet พูดถึงโปรโตคอล TELNET ซึ่งเป็นโปรโตคอลมาตรฐานแต่ส่วนใหญ่โบราณนั้นเป็นไปตามมาตรฐานปัจจุบัน เนื่องจากลำดับโปรโตคอลของมันทำจากอักขระ 8 บิตคุณไม่ค่อยเห็นโปรโตคอลเองและส่วนใหญ่จะโปร่งใสเมื่อเปรียบเทียบกับโปรโตคอลอื่น ๆ ที่ทันสมัยกว่าเช่น HTTP และ SMTP ที่ใช้คำที่มนุษย์มองเห็นใน ASCII เช่น GET, POST, HELO, LOGIN, เป็นต้น

เนื่องจากโพรโทคอลไม่สามารถมองเห็นได้โดยทั่วไป telnet สร้างขึ้นเพื่อเป็นเครื่องมือที่เหมาะสมสำหรับการเชื่อมต่อกับพอร์ต TCP อื่นและอนุญาตให้ผู้ใช้พิมพ์โปรโตคอลด้วยตนเอง ผู้ดูแลระบบเครือข่ายบางรายใช้เทคนิคนี้เพื่อวินิจฉัยปัญหากับเซิร์ฟเวอร์ อย่างไรก็ตามเนื่องจากโปรแกรม telnet ยังคงมีโปรโตคอลของตัวเองและอาจส่งบิตเพิ่มเติมของข้อมูลบางครั้งคุณยังสามารถประสบปัญหากับเทคนิคนี้ เมื่อคุณใช้ telnet คุณจะ "ทำการเชื่อมต่อ" ที่ชั้นแอปพลิเคชันเช่นเดียวกับชั้นการขนส่ง มันเกิดขึ้นที่โปรโตคอลเลเยอร์แอปพลิเคชันอื่น ๆ อาจทำงานผ่านการวินิจฉัยส่วนใหญ่และจะไม่ยุ่งเกี่ยวกับโปรโตคอล telnet มีโปรแกรมที่ดีกว่าสำหรับการทำสิ่งนี้ผ่านการเรียก nc (Net Cat มันได้รับชื่อจากการเป็นคำสั่ง cat ตามเวอร์ชันเครือข่าย)

$ nc www.stackexchange.com 80

โปรแกรม nc ไม่ได้พูดถึงโพรโทคอลเลเยอร์ใด ๆ ของแอปพลิเคชันและเมื่อคุณทำการเชื่อมต่อกับมันคุณจะ "ทำการเชื่อมต่อ" ที่อินเทอร์เน็ตเลเยอร์ (ที่อยู่ IP) และขนส่งเลเยอร์ (TCP หรือ UDP) เท่านั้น หมายความว่าคุณควบคุมสิ่งที่ชั้นโปรโตคอลใช้ เกือบทุกอย่างเป็นเกมที่ยุติธรรมแม้แต่โพรโทคอลไบนารี นอกจากนี้ยังช่วยให้คุณทำสิ่งที่มีประโยชน์เช่นถ่ายโอนไฟล์โดยที่ไม่ได้รับความเสียหายและฟังพอร์ตสำหรับทราฟฟิกขาเข้า:

nc -l 9000 < movie.mp4  (Your friend runs this)

nc friends.computer.hostname 9000 > movie.mp4  (you run this)

และจากนั้น movie.mp4 จะถูกถ่ายโอนผ่านเครือข่ายโดยไม่ต้องใช้โพรโทคอลเลเยอร์ (เช่น FTP) เลย โปรโตคอลแอปพลิเคชันเป็นเพื่อนของคุณจริง ๆ แล้วบอกคุณว่าพวกเขาพร้อมให้คุณรันคำสั่งของคุณแล้ว

nc สามารถจัดการแพ็คเก็ต UDP และซ็อกเก็ต UNIX โดเมนได้ การใช้ฟังเพื่อฟังก็น่าสนใจเช่นกัน

nc -l 12345

ตอนนี้ในเว็บเบราว์เซอร์ของคุณไปที่http: // localhost: 12345 /และในเซสชัน nc ของคุณคุณควรเห็นGET / HTTP/1.1คำขอของเบราว์เซอร์ ณ จุดนี้คุณสามารถพิมพ์บางสิ่งในและกดCtrl-Dและควรปรากฏขึ้นในเบราว์เซอร์ของคุณในข้อความธรรมดา (ถ้าคุณต้องการให้ HTML ปรากฏขึ้นคุณต้องส่งกลับการตอบสนองโปรโตคอล HTTP ที่เหมาะสมตามด้วยรหัส HTML)

บางครั้งโปรแกรมที่ใช้โปรโตคอลเดียวเช่น HTTP สามารถเชื่อมต่อกับพอร์ตอื่นที่มีความหมายสำหรับโปรโตคอลอื่นได้ โดยทั่วไปแล้วคุณไม่สามารถทำได้ในเบราว์เซอร์ GUI อีกต่อไปเพราะพวกเขาถูก จำกัด ไม่ให้เชื่อมต่อกับบางพอร์ต แต่ถ้าคุณใช้โปรแกรมเช่น curl เพื่อเชื่อมต่อกับพอร์ต 25 (SMTP สำหรับส่งจดหมาย) คุณอาจเห็น ข้อผิดพลาดเกี่ยวกับการทำลายโปรโตคอล

$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.

สิ่งนี้เกิดขึ้นเพราะ curl พูดโพรโทคอล HTTP ตามปกติดังนั้นหลังจากสร้างแฮนด์เชค TCP แล้วมันเริ่มส่งข้อมูลดังนี้:

GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl

แต่สิ่งที่เซิร์ฟเวอร์ SMTP คาดหวังคือ SMTP ซึ่งมีลักษณะดังนี้:

HELO myhomecomputername.local

ณ จุดนี้เซิร์ฟเวอร์จะส่งคืนบรรทัดการระบุ:

250 yourispsmtpserverhost.com

ดังนั้นคุณจะเห็นว่าไม่มีอะไรที่ป้องกันไม่ให้ curl สร้างการเชื่อมต่อเลเยอร์การขนส่งกับเซิร์ฟเวอร์ SMTP มันไม่สามารถพูดโปรโตคอลได้ แต่คุณสามารถพูดโพรโทคอลตัวเองด้วยโปรแกรมเช่น telnet หรือมากกว่า nc


curlต้องการ-vอาร์กิวเมนต์เพื่อแสดงเอาต์พุต verbose ใน OS X
Hamid Rohani

6

telnet เป็นเครื่องมือที่สามารถเชื่อมต่อกับพอร์ต TCP ใด ๆ

โดยค่าเริ่มต้นมันเชื่อมต่อกับพอร์ต telnet (23) แต่คุณสามารถบอกให้เชื่อมต่อกับพอร์ต http (80) หรือพอร์ต smtp (25) หรืออะไรก็ตามแทน

คุณต้องรู้วิธี "พูด" โปรโตคอลที่เซิร์ฟเวอร์ระยะไกลกำลังฟังบนพอร์ตนั้น

ตัวอย่างเช่นหากคุณต้องการให้ส่วนหัวของเว็บไซต์ (เปลี่ยนชื่อโดเมน ฯลฯ เพื่อป้องกันความผิด):

$ telnet www.example.com 80
Trying xxx.xxx.xxx.xxx...
Connected to www.example.com.
Escape character is '^]'.
HEAD http://www.example.com/ HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 30 Oct 2015 09:28:58 GMT
Server: Apache/2.4.17 (Debian)
Last-Modified: Sun, 14 Nov 2010 06:30:26 GMT
ETag: "843-494fd75830480"
Accept-Ranges: bytes
Content-Length: 2115
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

Connection closed by foreign host.

HEADบรรทัดคือสิ่งที่ฉันพิมพ์ลงในการเชื่อมต่อ โปรดทราบว่าโปรโตคอล http ต้องการให้คุณส่งบรรทัดว่างเพื่อระบุจุดสิ้นสุดของ HEAD หรือ GET หรือคำขอใด ๆ นั่นคือบรรทัดว่างทันทีหลังจากคำขอ HEAD


3

การเจรจาเริ่มต้นสำหรับโปรโตคอลทั้งสองใช้คำสั่งข้อความเพื่อให้คุณสามารถเชื่อมต่อและเริ่มป้อนคำสั่ง นี่เป็นความจริงของโปรโตคอลเก่าอื่น ๆเช่น SMTP และ telnet ถูกใช้งานมานานเพื่อแก้ไขปัญหาการเชื่อมต่อกับบริการที่เกี่ยวข้อง

ตัวอย่างเช่น

โปรโตคอลไม่ขึ้นอยู่กับพอร์ตที่ใช้สื่อสาร การใช้งานเกือบทั้งหมดสามารถกำหนดค่าให้ฟังบนพอร์ตใด ๆ

โปรโตคอลบางตัว (เช่น HTTPS) ไม่ใช้คำสั่งข้อความสำหรับการเจรจา อย่างไรก็ตามคุณสามารถ (ปกติ) เชื่อมต่อกับพอร์ตที่เซิร์ฟเวอร์ฟัง แต่ไม่มีประโยชน์อะไร


3

ความเข้าใจบางอย่างของคุณถูกต้องและบางอย่างก็ไม่เป็นเช่นนั้น โดยทั่วไปพอร์ต 80 ถูกสงวนไว้สำหรับ HTTP แต่นั่นเป็นเพียงการประชุม โปรแกรมใด ๆ สามารถฟังพอร์ตใด ๆ ที่เปิดอยู่บนระบบ หากมีเว็บเซิร์ฟเวอร์กำลังฟังพอร์ต 80 บนระบบที่คุณกำลังเชื่อมต่อคุณจำเป็นต้องใช้ HTTP เพื่อสื่อสารกับมัน

telnetไม่ใช่โปรโตคอลเลยเป็นโปรแกรมที่ช่วยให้คุณส่งข้อความดิบไปยังโฮสต์ใด ๆ บนพอร์ตใด ๆ รีโมตโฮสต์ไม่รู้ว่าโปรแกรมกำลังเชื่อมต่อกับอะไร ทั้งหมดที่สามารถเห็นได้คือแพ็คเก็ตที่ถูกส่งไป โปรแกรมใด ๆ ที่ส่งแพ็คเก็ตที่สอดคล้องกับโปรโตคอลที่โฮสต์ระยะไกลคาดว่าจะทำงานดังนั้นคุณสามารถใช้telnetเพื่อสื่อสารผ่านโปรโตคอลข้อความใด ๆ

คุณส่งบางอย่างตามบรรทัดGET /path/to/a/file HTTP/1.1ซึ่งเป็นคำสั่ง HTTP 1.1 ที่ถูกต้องและดูเหมือนกับคำขอที่จะถูกส่งโดยเว็บเบราว์เซอร์เพื่อให้ทำงานได้ดี


1
telnet เป็นโปรโตคอลRFC 854 มันเป็นแค่ที่พบบ่อยtelnetลูกค้าไม่ได้พยายามที่จะใช้โปรโตคอลยกเว้นเมื่อการเชื่อมต่อกับtelnet tcp/21จากหน้า man: "เมื่อเชื่อมต่อกับพอร์ตอื่นที่ไม่ใช่พอร์ต telnet, telnet จะไม่พยายามเจรจาโปรโตคอล telnet ซึ่งทำให้สามารถเชื่อมต่อกับบริการที่ไม่รองรับโปรโตคอล telnet โดยไม่ทำให้เกิดปัญหาการเจรจาโปรโตคอลสามารถบังคับได้โดย วางเครื่องหมายขีดกลางหน้าหมายเลขพอร์ต "
user4556274
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.