Як я можу передати телнет на порт 80 HTTP?


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-адреси та систему портів, а це означає, що кожному маршрутизатору потрібно зрозуміти, як маршрутизувати ці схеми, а різних протоколів було б багато важче вивчити і поставити діагноз. Простіше кажучи, Інтернет не працював би так само без шарів.

Що вас турбує, це транспортний шар та шар програми. На транспортному шарі у нас є Інтернет-протоколи, такі як TCP та UDP, з номерами портів від 1 до 65535 на кожному. На рівні додатків у нас є протоколи, такі як HTTP, SMTP та DNS. Зазвичай кожен документ із стандартів Інтернету, який визначає протокол, вказує порт TCP або UDP за замовчуванням, який протокол повинен використовувати за замовчуванням. Такі як TCP-порт 80 для HTTP, порт 25 TCP для SMTP, порт UDP 53 для DNS і порт 23 TCP для 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аргумент, щоб показати багатослівний вихід у ОС X.
Хамід Рохані

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. Зі сторінки чоловіка: "Під час підключення до портів, відмінних від порту telnet, telnet не намагається переговорити протокол telnet. Це дає змогу підключатися до служб, які не підтримують протокол telnet, не вводячи безлад. Переговори протоколу можуть бути вимушені ставлячи тире перед номером порту. "
користувач4556274
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.