Làm cách nào tôi có thể telnet đến cổng HTTP 80?


16

Sau khi tìm kiếm trong google, tôi phát hiện ra rằng chúng ta có thể telnettruy cập máy chủ web vào cổng http của nó và sử dụng GETđể truy xuất trang html.

Ví dụ:

$ telnet web-server-name 80

Nhưng tôi không thể hiểu làm thế nào là điều này có thể?

Tôi nghĩ rằng nếu cổng 80 dành cho máy chủ http, thì cổng 80 sẽ chỉ lắng nghe httpyêu cầu. Nhưng làm thế nào tôi có thể telnetđến một HTTPcổng?

Không telnetHTTPhai giao thức khác nhau?


2
Để đánh lừa trong 'net, lệnh netcat ( nc(1)) linh hoạt hơn nhiều. Nó có thể kết nối với các dịch vụ được mã hóa SSL / TLS, và cũng được sử dụng như một máy chủ và thậm chí chuyển tiếp dữ liệu xung quanh.
vonbrand

Câu trả lời:


25

Xin chúc mừng, bạn vừa đi sâu vào khái niệm các lớp mạng bằng cách nhận ra rằng các cổng và giao thức không được kết nối trực tiếp với nhau. Như những người khác đang nói, telnet có thể được sử dụng để kết nối với bất kỳ cổng TCP nào. Tuy nhiên để hiểu tại sao điều này là có thể, bạn cần hiểu một chút về các lớp mạng. Nếu bạn đã từng nghe về mô hình lớp OSI 7 thì đây là thứ cho phép bạn sử dụng telnet để kết nối với một cổng khác. Mặc dù trên Internet, họ chỉ quan tâm đến 4 lớp và được gọi là Bộ giao thức Internet. Không có các lớp kết nối mạng, mỗi chương trình không chỉ cần hiểu giao thức riêng mà còn phải xác định sơ đồ địa chỉ IP và hệ thống cổng riêng, điều đó có nghĩa là mỗi bộ định tuyến sẽ cần hiểu cách định tuyến các sơ đồ này và các giao thức khác nhau sẽ nhiều khó học và chẩn đoán hơn. Nói một cách đơn giản, Internet sẽ không hoạt động gần như không có lớp.

Những gì bạn quan tâm là lớp vận chuyển và lớp ứng dụng. Ở tầng giao vận, chúng ta có các giao thức Internet như TCP và UDP với số cổng từ 1 đến 65535 trên mỗi giao thức. Ở lớp ứng dụng, chúng ta có các giao thức như HTTP, SMTP và DNS. Thông thường mỗi tài liệu tiêu chuẩn Internet xác định giao thức chỉ định một cổng TCP hoặc UDP mặc định mà giao thức nên sử dụng theo mặc định. Chẳng hạn như cổng TCP 80 cho HTTP, cổng TCP 25 cho SMTP, cổng UDP 53 cho DNS và cổng TCP 23 cho Telnet. Chương trình telnet thực sự nói về giao thức TELNET, đây là một giao thức chuẩn, nhưng chủ yếu là một cổ xưa theo tiêu chuẩn hiện hành. Bởi vì các chuỗi giao thức của nó được tạo từ các ký tự 8 bit, bạn hiếm khi thấy giao thức và hầu như trong suốt khi so sánh với các giao thức hiện đại khác như HTTP và SMTP sử dụng các từ hiển thị của con người trong ASCII như GET, POST, HELO, LOGIN, Vân vân.

Do giao thức của nó thường không hiển thị, telnet được tạo cho một công cụ hợp lý để kết nối với các cổng TCP khác và cho phép người dùng nhập các giao thức theo cách thủ công. Một số quản trị viên mạng sử dụng kỹ thuật này để chẩn đoán sự cố với máy chủ. Tuy nhiên vì chương trình telnet vẫn có giao thức riêng và đôi khi có thể gửi thêm bit dữ liệu, bạn vẫn có thể gặp sự cố với kỹ thuật này. Khi bạn sử dụng telnet, bạn thực sự đang "tạo kết nối" ở lớp ứng dụng cũng như lớp vận chuyển. Nó chỉ xảy ra rằng các giao thức lớp ứng dụng khác có thể hoạt động tốt thông qua nó đối với hầu hết các chẩn đoán và sẽ không can thiệp vào giao thức telnet. Có một chương trình tốt hơn để thực hiện điều này thông qua được gọi là nc (Net Cat. Nó được đặt tên từ một phiên bản dựa trên mạng của lệnh cat).

$ nc www.stackexchange.com 80

Chương trình nc không nói bất kỳ giao thức lớp ứng dụng nào và khi bạn thực hiện kết nối với nó, bạn chỉ "tạo kết nối" ở lớp Internet (địa chỉ IP) và lớp Giao thông (TCP hoặc UDP). Điều đó có nghĩa là bạn kiểm soát giao thức lớp ứng dụng nào được sử dụng. Hầu như bất cứ điều gì là trò chơi công bằng, thậm chí các giao thức nhị phân. Điều này cũng cho phép bạn thực hiện những việc hữu ích như truyền tệp mà không bị hỏng và lắng nghe trên các cổng cho lưu lượng truy cập đến:

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

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

Và sau đó movie.mp4 được chuyển qua mạng mà không sử dụng giao thức lớp ứng dụng (chẳng hạn như FTP). Giao thức ứng dụng thực sự là bạn của bạn nói với bạn rằng họ đã sẵn sàng để bạn chạy lệnh của bạn.

nc cũng có thể xử lý các gói UDP và ổ cắm tên miền UNIX. Sử dụng nó để nghe cũng có thể thú vị.

nc -l 12345

Bây giờ trong trình duyệt web của bạn, hãy truy cập http: // localhost: 12345 / và trong phiên nc của bạn, bạn sẽ thấy GET / HTTP/1.1yêu cầu của trình duyệt . Tại thời điểm này, bạn có thể nhập nội dung nào đó và nhấn Ctrl-Dvà nó sẽ hiển thị trong trình duyệt của bạn ở dạng văn bản thuần túy (Nếu bạn muốn HTML hiển thị, bạn phải gửi lại phản hồi giao thức HTTP phù hợp theo mã HTML).

Đôi khi, các chương trình vốn nói một giao thức như HTTP có thể kết nối với các cổng khác dành cho một giao thức khác. Bạn thường không thể làm điều này trong trình duyệt GUI nữa vì họ đã hạn chế chúng kết nối với một số cổng, nhưng nếu bạn sử dụng chương trình như curl để kết nối với cổng 25 (SMTP để gửi thư), bạn có thể sẽ thấy một vài lỗi về phá vỡ giao thức.

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

Điều này xảy ra vì curl thường nói giao thức HTTP, vì vậy sau khi thiết lập bắt tay TCP, nó bắt đầu gửi dữ liệu như sau:

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

Nhưng những gì máy chủ SMTP đang mong đợi là SMTP, giống như thế này:

HELO myhomecomputername.local

Tại điểm đó, máy chủ sẽ gửi lại dòng nhận dạng của nó:

250 yourispsmtpserverhost.com

Vì vậy, bạn thấy rằng không có gì ngăn cản việc thiết lập kết nối lớp vận chuyển với máy chủ SMTP, nó chỉ không thể nói giao thức. Nhưng bạn có thể tự nói giao thức với một chương trình như telnet hoặc tốt hơn là nc.


curlcần một -vđối số để hiển thị đầu ra dài dòng trong OS X.
Hamid Rohani

6

telnet là một công cụ có thể kết nối với bất kỳ cổng tcp nào.

Theo mặc định, nó kết nối với cổng telnet (23), nhưng bạn có thể yêu cầu nó kết nối với cổng http (80) hoặc cổng smtp (25) hoặc bất cứ điều gì thay thế.

Tuy nhiên, bạn cần biết cách "nói" giao thức mà máy chủ từ xa đang lắng nghe trên cổng đó.

Ví dụ: nếu bạn muốn nhận các tiêu đề của một trang web (tên miền, v.v. đã thay đổi để bảo vệ người có tội):

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

Các HEADdòng là những gì tôi đã gõ vào kết nối. Lưu ý rằng giao thức http yêu cầu bạn gửi một dòng trống để cho biết sự kết thúc của CHÍNH hoặc NHẬN hoặc bất kỳ yêu cầu nào. Đó là dòng trống ngay sau yêu cầu CHÍNH.


3

Đàm phán ban đầu cho cả hai giao thức sử dụng các lệnh văn bản, vì vậy bạn có thể kết nối và bắt đầu nhập lệnh. Điều này đúng với các giao thức khác như SMTP và telnet từ lâu đã được sử dụng để khắc phục sự cố kết nối với các dịch vụ tương ứng.

Ví dụ

Các giao thức độc lập với cổng mà chúng giao tiếp. Hầu như tất cả các triển khai có thể được cấu hình để nghe trên bất kỳ cổng nào.

Một số giao thức (như HTTPS) không sử dụng lệnh văn bản để đàm phán. Tuy nhiên, bạn có thể (thường) kết nối với cổng mà máy chủ lắng nghe, nhưng không có gì hữu ích.


3

Một số hiểu biết của bạn là chính xác và một số thì không. Cổng 80 thường được dành riêng cho HTTP, nhưng đó chỉ là quy ước; bất kỳ chương trình nào cũng có thể nghe trên bất kỳ cổng mở nào trên hệ thống. Nếu có máy chủ web lắng nghe trên cổng 80 trên hệ thống bạn đang kết nối, bạn cần sử dụng HTTP để liên lạc với nó.

telnethoàn toàn không phải là một giao thức, đó là một chương trình cho phép bạn gửi văn bản thô đến bất kỳ máy chủ nào trên bất kỳ cổng nào. Máy chủ từ xa không biết chương trình nào đang kết nối với nó; tất cả những gì nó có thể thấy là các gói được gửi đến nó. Bất kỳ chương trình nào gửi các gói tuân thủ giao thức mà máy chủ từ xa đang mong đợi sẽ hoạt động, vì vậy bạn có thể sử dụng telnetđể giao tiếp qua bất kỳ giao thức dựa trên văn bản nào.

Bạn đã gửi một cái gì đó dọc theo dòng GET /path/to/a/file HTTP/1.1, đó là một lệnh HTTP 1.1 hợp lệ và trông giống như một yêu cầu sẽ được gửi bởi trình duyệt web, vì vậy nó hoạt động tốt.


1
telnet một giao thức RFC 854 . Chỉ là các telnetmáy khách thông thường không cố gắng sử dụng telnetgiao thức trừ khi kết nối với tcp/21. Từ trang man: "Khi kết nối với các cổng không phải là cổng telnet, telnet không thử đàm phán giao thức telnet. Điều này giúp kết nối với các dịch vụ không hỗ trợ giao thức telnet mà không gây ra sự lộn xộn. đặt dấu gạch ngang trước số cổng. "
user4556274
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.