Comment est-ce que je peux telnet au port HTTP 80?


16

Après avoir recherché dans google, j'ai découvert que nous pouvons telnetfaire un serveur web sur son port http et l'utiliser GETpour récupérer une page html.

Par exemple:

$ telnet web-server-name 80

Mais je ne peux pas comprendre comment est-ce possible?

Je pensais que si le port 80 est pour le serveur http, le port 80 n'écoutera que les httpdemandes. Mais comment puis-je accéder telnetà un HTTPport?

N'est-ce pas telnetet HTTPdeux protocoles différents?


2
Pour batifoler dans le 'net, la commande netcat ( nc(1)) est beaucoup plus flexible. Il peut se connecter aux services chiffrés SSL / TLS, et peut également être utilisé comme serveur et même relayer des données.
vonbrand

Réponses:


25

Félicitations, vous venez de vous plonger dans le concept des couches réseau en réalisant que les ports et les protocoles ne sont pas directement connectés les uns aux autres. Comme d'autres le disent, telnet peut être utilisé pour se connecter à n'importe quel port TCP. Cependant, pour comprendre pourquoi cela est possible, vous devez comprendre un peu les couches réseau. Si vous avez déjà entendu parler du modèle de couche OSI 7, c'est ce qui vous permet d'utiliser telnet pour vous connecter à un autre port. Bien que sur Internet, ils ne se préoccupent que de 4 des couches et c'est ce qu'on appelle Internet Protocol Suite. Sans couches de mise en réseau, chaque programme aurait non seulement besoin de comprendre son propre protocole, mais devrait également définir son propre schéma d'adressage IP et son système de port, ce qui signifie que chaque routeur devrait comprendre comment acheminer ces schémas et différents protocoles serait beaucoup plus plus difficile à apprendre et à diagnostiquer. Pour le dire simplement, Internet ne fonctionnerait pas aussi bien sans couches.

Ce qui vous intéresse, c'est la couche transport et la couche application. Au niveau de la couche transport, nous avons des protocoles Internet comme TCP et UDP avec des numéros de port allant de 1 à 65535 sur chacun. Au niveau de l'application, nous avons des protocoles tels que HTTP, SMTP et DNS. Habituellement, chaque document de normes Internet qui définit un protocole spécifie un port TCP ou UDP par défaut que le protocole doit utiliser par défaut. Tels que le port TCP 80 pour HTTP, le port TCP 25 pour SMTP, le port UDP 53 pour DNS et le port TCP 23 pour Telnet. Le programme telnet parle en fait le protocole TELNET, qui est un protocole standard, mais surtout un ancien selon les normes actuelles. Étant donné que ses séquences de protocoles sont constituées de caractères 8 bits, vous voyez rarement le protocole lui-même et sa plupart transparent lorsque comparé à d'autres protocoles plus modernes comme HTTP et SMTP qui utilisent des mots visibles humains en ASCII tels que GET, POST, HELO, LOGIN, etc.

Parce que son protocole n'est généralement pas visible, telnet est un outil décent pour se connecter à d'autres ports TCP et permettre à l'utilisateur de saisir manuellement des protocoles. Certains administrateurs réseau utilisent cette technique afin de diagnostiquer les problèmes avec les serveurs. Cependant, comme le programme telnet possède toujours son propre protocole et peut parfois envoyer des bits supplémentaires de données, vous pouvez toujours rencontrer des problèmes avec cette technique. Lorsque vous utilisez telnet, vous "établissez réellement une connexion" au niveau de la couche application et de la couche transport. Il se trouve que d'autres protocoles de couche application peuvent fonctionner correctement pour la plupart des diagnostics et n'interfèrent pas avec le protocole telnet. Il existe un meilleur programme pour ce faire appelé nc (Net Cat. Il tire son nom d'une version réseau de la commande cat).

$ nc www.stackexchange.com 80

Le programme nc ne parle aucun protocole de couche application et lorsque vous vous connectez avec lui, vous "établissez une connexion" uniquement au niveau de la couche Internet (adresse IP) et de la couche Transport (TCP ou UDP). Cela signifie que vous contrôlez le protocole de couche application utilisé. Presque tout est du jeu équitable, même des protocoles binaires. Cela vous permet également de faire des choses utiles comme transférer des fichiers sans les corrompre et d'écouter sur les ports le trafic entrant:

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

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

Et puis movie.mp4 est transféré sur le réseau sans aucun protocole de couche application (tel que FTP). Le protocole d'application est en fait votre ami qui vous dit qu'il est prêt à exécuter votre commande.

nc peut également gérer les paquets UDP et les sockets de domaine UNIX. L'utiliser pour écouter peut également être intéressant.

nc -l 12345

Maintenant, dans votre navigateur Web, visitez http: // localhost: 12345 / et dans votre session nc, vous devriez voir la GET / HTTP/1.1demande du navigateur . À ce stade, vous pouvez taper quelque chose et appuyer sur Ctrl-Det cela devrait apparaître dans votre navigateur en texte brut (si vous voulez que HTML apparaisse, vous devez lui renvoyer la réponse de protocole HTTP appropriée suivie du code HTML).

Parfois, les programmes qui parlent nativement un protocole comme HTTP peuvent se connecter à d'autres ports destinés à un protocole différent. Vous ne pouvez généralement plus le faire dans un navigateur GUI car ils les ont empêchés de se connecter à certains ports, mais si vous utilisez un programme comme curl pour vous connecter au port 25 (SMTP pour l'envoi de courrier), vous verrez probablement quelques des erreurs de rupture de protocole.

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

Cela se produit car curl parle normalement le protocole HTTP, donc après avoir établi une négociation TCP, il commence à envoyer des données comme ceci:

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

Mais ce que le serveur SMTP attend, c'est SMTP, qui ressemble plus à ceci:

HELO myhomecomputername.local

À quel moment le serveur renvoie sa ligne d'identification:

250 yourispsmtpserverhost.com

Donc, vous voyez qu'il n'y a rien qui empêche curl d'établir une connexion de couche transport avec le serveur SMTP, il ne peut tout simplement pas parler du protocole. Mais vous pouvez parler le protocole vous-même avec un programme comme telnet ou plus préférablement nc.


curla besoin d'un -vargument pour afficher une sortie détaillée dans OS X.
Hamid Rohani

6

telnet est un outil qui peut se connecter à n'importe quel port TCP.

Par défaut, il se connecte au port telnet (23), mais vous pouvez lui dire de se connecter au port http (80) ou au port smtp (25) ou autre chose à la place.

Cependant, vous devez savoir comment "parler" le protocole que le serveur distant écoute sur ce port.

Par exemple, si vous souhaitez obtenir les en-têtes d'un site Web (les noms de domaine, etc. ont été modifiés pour protéger les coupables):

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

La HEADligne est ce que j'ai tapé dans la connexion. Notez que le protocole http vous oblige à envoyer une ligne vierge pour indiquer la fin de votre HEAD ou GET ou autre requête. C'est la ligne vierge immédiatement après la demande HEAD.


3

La négociation initiale pour les deux protocoles utilise des commandes de texte, vous pouvez donc vous connecter et commencer à entrer des commandes. Cela est vrai pour d'autres anciens protocoles tels que SMTP, et telnet a longtemps été utilisé pour dépanner les connexions aux services respectifs.

Par exemple

Les protocoles sont indépendants du port sur lequel ils communiquent. Presque toutes les implémentations peuvent être configurées pour écouter sur n'importe quel port.

Certains protocoles (tels que HTTPS) n'utilisent pas de commandes de texte pour la négociation. Vous pouvez cependant (généralement) vous connecter au port sur lequel le serveur écoute, mais ne faites rien d'utile.


3

Une partie de votre compréhension est correcte et d'autres non. Le port 80 est généralement réservé pour HTTP, mais ce n'est qu'une convention; n'importe quel programme peut écouter sur n'importe quel port ouvert du système. S'il y a un serveur Web à l'écoute sur le port 80 du système auquel vous vous connectez, vous devez utiliser HTTP pour communiquer avec lui.

telnetn'est pas du tout un protocole, c'est un programme qui vous permet d'envoyer du texte brut à n'importe quel hôte sur n'importe quel port. L'hôte distant n'a aucune idée du programme qui s'y connecte; tout ce qu'il peut voir, ce sont les paquets qui lui sont envoyés. Tout programme qui envoie des paquets conformes au protocole attendu par l'hôte distant fonctionnera, vous pouvez donc l'utiliser telnetpour communiquer sur n'importe quel protocole textuel.

Vous avez envoyé quelque chose dans le sens de GET /path/to/a/file HTTP/1.1, qui est une commande HTTP 1.1 valide et ressemble à une demande qui serait envoyée par un navigateur Web, donc cela fonctionne bien.


1
telnet est un protocole RFC 854 . C'est juste si communtelnet clients n'essaient pas d'utiliser le telnetprotocole sauf lors de la connexion à tcp/21. À partir de la page de manuel: "Lors de la connexion à des ports autres que le port telnet, telnet n'essaie pas de négocier le protocole telnet. Cela permet de se connecter à des services qui ne prennent pas en charge le protocole telnet sans faire de gâchis. La négociation du protocole peut être forcée par en plaçant un tiret devant le numéro de port. "
user4556274
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.