¿Cómo puedo hacer telnet al puerto HTTP 80?


16

Después de buscar en google descubrí que podemos telnetusar el servidor web en su puerto http y usarlo GETpara recuperar una página html.

Por ej .:

$ telnet web-server-name 80

Pero no puedo entender cómo es esto posible.

Pensé que si el puerto 80 es para el servidor http, entonces el puerto 80 solo escuchará las httpsolicitudes. Pero ¿cómo he podido telneta unaHTTP puerto?

¿No telnety HTTPdos protocolos diferentes?


2
Para perder el tiempo en 'net, el comando netcat ( nc(1)) es mucho más flexible. Se puede conectar a servicios cifrados SSL / TLS y también se puede utilizar como servidor e incluso transmitir datos.
vonbrand

Respuestas:


25

Felicitaciones, acaba de profundizar en el concepto de capas de red al darse cuenta de que los puertos y protocolos no están directamente conectados entre sí. Como dicen otros, telnet se puede usar para conectarse a cualquier puerto TCP. Sin embargo, para comprender por qué esto es posible, debe comprender un poco acerca de las capas de red. Si alguna vez has oído hablar del modelo de capa OSI 7, esto es lo que te permite usar telnet para conectarte a otro puerto. Aunque en Internet, solo se refieren a 4 de las capas y se llama Internet Protocol Suite . Sin capas de red, cada programa no solo necesitaría comprender su propio protocolo, sino que también tendría que definir su propio esquema de direccionamiento IP y sistema de puertos, lo que significa que cada enrutador necesitaría comprender cómo enrutar estos esquemas y diferentes protocolos serían mucho más difícil de aprender y diagnosticar. En pocas palabras, Internet no funcionaría tan bien sin capas.

Lo que le preocupa es la capa de transporte y la capa de aplicación. En la capa de transporte tenemos protocolos de Internet como TCP y UDP con números de puerto que van del 1 al 65535 en cada uno. En la capa de aplicación tenemos protocolos como HTTP, SMTP y DNS. Por lo general, cada documento de estándares de Internet que define un protocolo especifica un puerto TCP o UDP predeterminado que el protocolo debe usar de manera predeterminada. Como el puerto TCP 80 para HTTP, el puerto TCP 25 para SMTP, el puerto UDP 53 para DNS y el puerto TCP 23 para Telnet. El programa telnet en realidad habla el protocolo TELNET, que es un protocolo estándar, pero principalmente uno antiguo según los estándares actuales. Debido a que sus secuencias de protocolo están hechas de caracteres de 8 bits, rara vez se ve el protocolo en sí y es mayormente transparente en comparación con otros protocolos más modernos como HTTP y SMTP que usan palabras visibles en humanos en ASCII como GET, POST, HELO, LOGIN, etc.

Debido a que su protocolo no es generalmente visible, Telnet fue una herramienta decente para conectarse a otros puertos TCP y permitir al usuario escribir protocolos manualmente. Algunos administradores de red utilizan esta técnica para diagnosticar problemas con los servidores. Sin embargo, debido a que el programa telnet todavía tiene su propio protocolo y puede enviar bits de datos adicionales a veces, aún puede experimentar problemas con esta técnica. Cuando usa telnet, realmente está "haciendo una conexión" en la capa de aplicación y en la capa de transporte. Simplemente sucede que otros protocolos de capa de aplicación pueden funcionar bien para la mayoría de los diagnósticos y no interferirán con el protocolo telnet. Hay un mejor programa para hacerlo llamado nc (Net Cat. Recibe su nombre de ser una versión basada en la red del comando cat).

$ nc www.stackexchange.com 80

El programa nc no habla ningún protocolo de capa de aplicación y cuando realiza una conexión con él está "haciendo una conexión" solo en la capa de Internet (dirección IP) y la capa de transporte (TCP o UDP). Lo que eso significa es que usted controla qué protocolo de capa de aplicación se utiliza. Casi todo es juego limpio, incluso protocolos binarios. Esto también le permite hacer cosas útiles como transferir archivos sin que estén dañados y escuchar en los puertos el tráfico entrante:

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

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

Y luego movie.mp4 se transfiere a través de la red sin ningún protocolo de capa de aplicación (como FTP). El protocolo de aplicación es en realidad tu amigo diciéndote que están listos para que ejecutes tu comando.

nc también puede manejar paquetes UDP y sockets de dominio UNIX. Usarlo para escuchar también puede ser interesante.

nc -l 12345

Ahora en su navegador web visite http: // localhost: 12345 / y en su sesión nc debería ver la GET / HTTP/1.1solicitud del navegador . En este punto, puede escribir algo y presionar Ctrl-Dy debería aparecer en su navegador en texto sin formato (si desea que se muestre HTML, debe enviarlo de vuelta con la respuesta de protocolo HTTP adecuada seguido del código HTML).

A veces, los programas que hablan de forma nativa un protocolo como HTTP pueden conectarse a otros puertos que están destinados a un protocolo diferente. Por lo general, ya no puede hacer esto en un navegador GUI porque les ha impedido conectarse a algunos puertos, pero si usa un programa como curl para conectarse al puerto 25 (SMTP para enviar correo) probablemente verá un par de errores sobre romper el protocolo.

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

Esto sucede porque curl normalmente habla el protocolo HTTP, por lo que después de establecer un protocolo de enlace TCP, comienza a enviar datos de esta manera:

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

Pero lo que el servidor SMTP espera es SMTP, que es más como esto:

HELO myhomecomputername.local

En ese momento el servidor devuelve su línea de identificación:

250 yourispsmtpserverhost.com

Entonces, verá que no hay nada que impida que curl establezca una conexión de capa de transporte con el servidor SMTP, simplemente no puede hablar el protocolo. Pero puede hablar el protocolo usted mismo con un programa como telnet o más preferiblemente nc.


curlnecesita un -vargumento para mostrar resultados detallados en OS X.
Hamid Rohani

6

telnet es una herramienta que puede conectarse a cualquier puerto tcp.

Por defecto, se conecta al puerto telnet (23), pero puede indicarle que se conecte al puerto http (80) o al puerto smtp (25) o lo que sea.

Sin embargo, debe saber cómo "hablar" el protocolo que el servidor remoto está escuchando en ese puerto.

Por ejemplo, si desea obtener los encabezados de un sitio web (nombres de dominio, etc., modificados para proteger al culpable):

$ 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 HEADlínea es lo que escribí en la conexión. Tenga en cuenta que el protocolo http requiere que envíe una línea en blanco para indicar el final de su HEAD o GET o cualquier solicitud. Esa es la línea en blanco inmediatamente después de la solicitud HEAD.


3

La negociación inicial para ambos protocolos utiliza comandos de texto, por lo que puede conectarse y comenzar a ingresar comandos. Esto es cierto para otros protocolos antiguos como SMTP, y telnet se ha utilizado durante mucho tiempo para solucionar problemas de conexiones a los servicios respectivos.

Por ejemplo

Los protocolos son independientes del puerto en el que se comunican. Casi todas las implementaciones se pueden configurar para escuchar en cualquier puerto.

Algunos protocolos (como HTTPS) no utilizan comandos de texto para la negociación. Sin embargo, puede (generalmente) conectarse a la puerto en el que escucha el servidor, pero no hacer nada útil.


3

Parte de su comprensión es correcta y otra no. El puerto 80 generalmente está reservado para HTTP, pero eso es solo una convención; cualquier programa puede escuchar en cualquier puerto abierto del sistema. Si hay un servidor web escuchando en el puerto 80 en el sistema al que se está conectando, debe usar HTTP para comunicarse con él.

telnetno es un protocolo en absoluto, es un programa que le permite enviar texto sin formato a cualquier host en cualquier puerto. El host remoto no tiene idea de qué programa se está conectando a él; todo lo que puede ver son los paquetes que se le envían. Cualquier programa que envíe paquetes que cumplan con el protocolo que el host remoto espera funcionará, por lo que puede usartelnet para comunicarse a través de cualquier protocolo basado en texto.

Envió algo en la línea de GET /path/to/a/file HTTP/1.1, que es un comando HTTP 1.1 válido y tiene el mismo aspecto que una solicitud que sería enviada por un navegador web, por lo que funciona bien.


1
telnet es un protocolo RFC 854 . Es solo que los telnetclientes comunes no intentan usar el telnetprotocolo, excepto cuando se conectan tcp/21. Desde la página de manual: "Al conectarse a puertos que no sean el puerto telnet, telnet no intenta negociaciones de protocolo telnet. Esto permite conectarse a servicios que no admiten el protocolo telnet sin hacer un desastre. La negociación del protocolo puede ser forzada por colocando un guión antes del número de puerto ".
user4556274
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.