Come posso telnet alla porta HTTP 80?


16

Dopo aver cercato in google ho scoperto che possiamo telnetweb-server alla sua porta http e utilizzare GETper recuperare una pagina html.

Ad esempio:

$ telnet web-server-name 80

Ma non riesco a capire come sia possibile?

Ho pensato che se la porta 80 è per server http, allora la porta 80 ascolterà solo le httprichieste. Ma come posso telnetraggiungere un HTTPporto?

Non sono telnete HTTPdue protocolli diversi?


2
Per scherzare nella 'rete, il comando netcat ( nc(1)) è molto più flessibile. Può connettersi ai servizi crittografati SSL / TLS e può anche essere utilizzato come server e persino inoltrare dati.
vonbrand,

Risposte:


25

Congratulazioni, hai appena approfondito il concetto di livelli di rete rendendoti conto che porte e protocolli non sono direttamente collegati tra loro. Come altri stanno dicendo, telnet può essere utilizzato per connettersi a qualsiasi porta TCP. Tuttavia, per capire perché questo è possibile, è necessario comprendere un po 'i livelli di rete. Se hai mai sentito parlare del modello OSI 7 layer, questo è ciò che ti consente di utilizzare telnet per collegarti a un'altra porta. Sebbene su Internet, si occupano solo di 4 livelli e si chiama Internet Protocol Suite. Senza livelli di rete, ogni programma non dovrebbe solo comprendere il proprio protocollo, ma dovrebbe definire il proprio schema di indirizzamento IP e il sistema di porte, il che significa che ogni router dovrebbe capire come instradare questi schemi e diversi protocolli sarebbero molto più difficile da imparare e diagnosticare. Per dirla semplicemente, Internet non funzionerebbe altrettanto bene senza livelli.

Quello che ti interessa sono il livello di trasporto e il livello dell'applicazione. A livello di trasporto abbiamo protocolli Internet come TCP e UDP con numeri di porta che vanno da 1 a 65535 su ciascuno. A livello di applicazione abbiamo protocolli come HTTP, SMTP e DNS. Di solito ogni documento di standard Internet che definisce un protocollo specifica una porta TCP o UDP predefinita che il protocollo dovrebbe usare per impostazione predefinita. Come la porta TCP 80 per HTTP, la porta TCP 25 per SMTP, la porta UDP 53 per DNS e la porta TCP 23 per Telnet. Il programma telnet in realtà parla del protocollo TELNET, che è un protocollo standard, ma per lo più antico per gli standard attuali. Poiché le sue sequenze di protocollo sono costituite da caratteri a 8 bit, raramente si vede il protocollo stesso ed è per lo più trasparente se confrontato con altri protocolli più moderni come HTTP e SMTP che usano parole umane visibili in ASCII come GET, POST, HELO, LOGIN, eccetera.

Poiché il suo protocollo non è generalmente visibile, telnet ha creato uno strumento decente per la connessione ad altre porte TCP e per consentire all'utente di digitare i protocolli manualmente. Alcuni amministratori di rete utilizzano questa tecnica per diagnosticare problemi con i server. Tuttavia, poiché il programma Telnet ha ancora il proprio protocollo e talvolta può inviare bit di dati aggiuntivi, è comunque possibile riscontrare problemi con questa tecnica. Quando usi telnet, stai davvero "stabilendo una connessione" sia a livello di applicazione che a livello di trasporto. Accade semplicemente che altri protocolli a livello di applicazione possano funzionare correttamente per la maggior parte della diagnostica e non interferiranno con il protocollo Telnet. Esiste un programma migliore per farlo tramite nc (Net Cat. Prende il nome da una versione basata su rete del comando cat).

$ nc www.stackexchange.com 80

Il programma nc non parla alcun protocollo del livello applicazione e quando si effettua una connessione con esso si "effettua una connessione" solo a livello Internet (indirizzo IP) e livello di trasporto (TCP o UDP). Ciò significa che controlli quale protocollo di livello applicazione viene utilizzato. Quasi tutto è un gioco equo, anche i protocolli binari. Questo ti consente anche di fare cose utili come trasferire file senza che siano danneggiati e ascoltare sulle porte il traffico in entrata:

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

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

E poi movie.mp4 viene trasferito sulla rete senza alcun protocollo a livello di applicazione (come FTP). Il protocollo dell'applicazione è in realtà un tuo amico che ti dice che sono pronti per eseguire il tuo comando.

nc può anche gestire pacchetti UDP e socket di dominio UNIX. Anche usarlo per ascoltare può essere interessante.

nc -l 12345

Ora nel tuo browser web visita http: // localhost: 12345 / e nella tua sessione nc dovresti vedere la GET / HTTP/1.1richiesta del browser . A questo punto puoi digitare qualcosa e premere Ctrl-De dovrebbe apparire nel tuo browser in testo normale (Se vuoi che HTML venga mostrato, devi rispedirlo con la risposta corretta del protocollo HTTP seguita da codice HTML).

A volte, i programmi che parlano nativamente un protocollo come HTTP possono connettersi ad altre porte che sono pensate per un protocollo diverso. In genere non è più possibile farlo in un browser GUI perché hanno impedito loro di connettersi ad alcune porte, ma se si utilizza un programma come curl per connettersi alla porta 25 (SMTP per l'invio di posta) probabilmente vedrai un paio di errori relativi alla violazione del protocollo.

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

Ciò accade perché normalmente curl parla del protocollo HTTP, quindi dopo aver stabilito un handshake TCP, inizia a inviare dati in questo modo:

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

Ma ciò che il server SMTP si aspetta è SMTP, che è più simile a questo:

HELO myhomecomputername.local

A quel punto il server rinvia la sua linea di identificazione:

250 yourispsmtpserverhost.com

Quindi vedi che non c'è nulla che impedisce all'arricciatura di stabilire una connessione del livello di trasporto con il server SMTP, semplicemente non riesce a parlare il protocollo. Ma puoi pronunciare tu stesso il protocollo con un programma come telnet o più preferibilmente nc.


curlserve un -vargomento per mostrare un output dettagliato in OS X.
Hamid Rohani,

6

telnet è uno strumento che può connettersi a qualsiasi porta tcp.

Per impostazione predefinita, si connette alla porta telnet (23), ma si può dire che si connette alla porta http (80) o smtp (25) o qualsiasi altra cosa.

Tuttavia, devi sapere come "parlare" il protocollo che il server remoto sta ascoltando su quella porta.

Ad esempio, se si desidera ottenere le intestazioni di un sito Web (nomi di dominio ecc. Modificati per proteggere i colpevoli):

$ 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 HEADlinea è ciò che ho digitato nella connessione. Si noti che il protocollo http richiede di inviare una riga vuota per indicare la fine di HEAD o GET o qualsiasi altra richiesta. Questa è la riga vuota immediatamente dopo la richiesta HEAD.


3

La negoziazione iniziale per entrambi i protocolli utilizza comandi di testo, quindi è possibile connettersi e iniziare a immettere i comandi. Questo è vero per altri vecchi protocolli come SMTP, e telnet è stata a lungo utilizzata per risolvere i problemi di connessione ai rispettivi servizi.

Per esempio

I protocolli sono indipendenti dalla porta su cui comunicano. Quasi tutte le implementazioni possono essere configurate per l'ascolto su qualsiasi porta.

Alcuni protocolli (come HTTPS) non utilizzano i comandi di testo per la negoziazione. Tuttavia, è possibile (in genere) connettersi alla porta su cui il server è in ascolto, ma non fare nulla di utile.


3

Alcune delle tue conoscenze sono corrette e altre no. La porta 80 è generalmente riservata a HTTP, ma questa è solo una convenzione; qualsiasi programma può ascoltare su qualsiasi porta aperta sul sistema. Se c'è un server web in ascolto sulla porta 80 sul sistema a cui ti stai connettendo, devi usare HTTP per comunicare con esso.

telnetnon è affatto un protocollo, è un programma che ti consente di inviare testo non elaborato a qualsiasi host su qualsiasi porta. L'host remoto non ha idea di quale programma si sta connettendo ad esso; tutto ciò che può vedere sono i pacchetti che gli vengono inviati. Qualsiasi programma che invia pacchetti conformi al protocollo previsto dall'host remoto funzionerà, pertanto è possibile utilizzare telnetper comunicare su qualsiasi protocollo basato su testo.

Hai inviato qualcosa sulla falsariga di GET /path/to/a/file HTTP/1.1, che è un comando HTTP 1.1 valido e ha lo stesso aspetto di una richiesta che verrebbe inviata da un browser web, quindi funziona bene.


1
telnet è un protocollo RFC 854 . È solo che i telnetclient comuni non tentano di utilizzare il telnetprotocollo tranne quando si connettono a tcp/21. Dalla pagina man: "Durante la connessione a porte diverse dalla porta telnet, telnet non tenta di negoziare il protocollo telnet. Ciò consente di connettersi a servizi che non supportano il protocollo telnet senza creare confusione. La negoziazione del protocollo può essere forzata da posizionando un trattino prima del numero di porta. "
user4556274
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.