mémo telnet…

Quelques exemple de session telnet pour tester divers protocoles texte (HTTP, SMTP, …).

Si l’on veut tester les versions sécurisées de ces protocoles, il suffit d’utiliser la commande s_client de OpenSSL à la place de telnet:

openssl s_client -connect serveur:port

HTTP

Précision:

  • HEAD permet de ne récupérer que les entêtes de la réponse d’une requête HTTP
  • GET est la commande classique pour récupérer un contenu

HEAD ou GET en HTTP 1.0:

$ telnet serveur 80
Trying serveur
Connected to serveur
Escape character id '^]'.
HEAD [http://vhost]/uri HTTP/1.0

HTTP/1.0 200 OK
Server: nom du soft utilisé
Date: la date
Content-Type: xxxx
Content-Length: xxxx
Last-Modified: une autre date
Connection: close
Accept-Ranges: bytes

Si on remplace HEAD par GET, on aura tout le contenu pointé par l’URL de servi.

Si on ne spécifie pas le vhost sur lequel on tape, l’URI sera servie par le vhost par défaut du serveur HTTP.

HEAD ou GET (simple) en HTTP 1.1:

$ telnet serveur 80
Trying serveur
Connected to serveur
Escape character id '^]'.
HEAD /uri HTTP/1.1
Host: vhost

HTTP/1.1 200 OK
Server: nom du soft utilisé
Date: la date
Content-Type: xxxx
Content-Length: xxxx
Last-Modified: une autre date
Connection: keep-alive
Keep-Alive: timeout=xx
Accept-Ranges: bytes

Comme en HTTP 1.0, si on remplace HEAD par GET, on prend tout dans la figure.

GET + Range (HTTP/1.1):

Le but ici est de ne demander qu’un morceau du fichier. C’est pas mal utilisé par les lecteurs de vidéos (typiquement, les iPhone/iPad ne font jamais un gros GET, mais une succession de GET+Range), ou pour les gestionnaires/accélérateurs de download et la gestion de la reprise des download.

$ telnet serveur 80
Trying serveur
Connected to serveur
Escape character id '^]'.
GET /uri HTTP/1.1
Host: vhost
Range: bytes=start-stop

HTTP/1.1 206 Partial Content
Server: nom du soft utilisé
Date: la date
Content-Type: xxxx
Content-Length: stop-start+1
Last-Modified: une autre date
Connection: keep-alive
Keep-Alive: timeout=xx
Content-Range: bytes start-stop/taille_totale

[des chose par forcément très lisibles :)]

SMTP

Envoi depuis le mx de example.com vers une adresse en example.com

$ telnet mx.example.com 25
Trying x.y.z.t...
Connected to mx.example.com.
Escape character id '^]'.
220 example.com ESMTP
HELO some.place.net
250 mx.example.com
MAIL FROM: tester@dummy.org
250 2.1.0 Ok
RCPT TO: tested@example.com
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Date: la date
Subject: un sujet
From: Tester <tester@dummy.org>
To: Tested <tested@example.com>

message
.
250 2.0.0 Ok: queued as EBF2527FF9
QUIT
221 2.0.0 Bye

Il peut arriver qu’après le «RCPT TO» on se fasse jeter avec ce genre de message:

450 4.2.0 <tester@dummy.org>: Sender address rejected: Your email has been greylisted and will be delivered soon...

C’est un mécanisme pour limiter le SPAM, il suffit en général d’attendre 5 minutes avant de recommencer.

Tester si un serveur est un relai ouvert:

$ telnet mx.example.com 25
Trying x.y.z.t...
Connected to mx.example.com.
Escape character id '^]'.
220 example.com ESMTP
HELO some.place.net
250 mx.example.com
MAIL FROM: kevin@hotmail.fr
250 2.1.0 Ok
RCPT TO: kevina@live.com

Si le serveur est bien configuré, on aura cette réponse:

554 5.7.1 <kevina@live.com>: Relay access denied

Sinon, on aura ce qu’on a déjà vu avant.

Envoi de mail + authentification

On reste dans un cas simple, l’authentification en «clair».

On a tout de même besoin de deux choses: le nom d’utilisateur et le mot de passe encodés en base64 (voir la fonction base64.b64encode(‘string’) de python, par exemple).

Après le «AUTH LOGIN», on rentre le nom d’utilisateur puis le mot de passe. Si tout se passe bien, on obtient comme réponse un «Authentification successful».

$ telnet mx.example.com 25
Trying x.y.z.t...
Connected to mx.example.com.
Escape character id '^]'.
220 example.com ESMTP
HELO some.place.net
250 mx.example.com
AUTH LOGIN
334 VXNlcm5hbWU6
dGVzdGVyQGR1bW15Lm9yZw==
334 UGFzc3dvcmQ6
cDRzc3cwcmQ=
235 2.7.0 Authentication successful
MAIL FROM: tester@dummy.org
250 2.1.0 Ok
RCPT TO: tested@example.com
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Date: la date
Subject: un sujet
From: Tester <tester@dummy.org>
To: Tested <tested@example.com>

message
.
250 2.0.0 Ok: queued as BB1D127FF9
QUIT
221 2.0.0 Bye

IMAP

Une session IMAP, par défaut tout passe en clair.

$ telnet serveur 143
Trying serveur
Connected to serveur
Escape character id '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN] XXXX ready.
a login Utilisateur FauxMDP
a NO [AUTHENTICATIONFAILED] Authentication failed.
$ telnet serveur 143
Trying serveur
Connected to serveur
Escape character id '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN] XXXX ready.
a login Utilisateur MotDePasse
a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS] Logged in
a list "" "*"
* LIST (\HasNoChildren) "." "Drafts"
* LIST (\HasNoChildren) "." "Sent"
* LIST (\HasNoChildren) "." "Spam"
* LIST (\HasNoChildren) "." "Trash"
* LIST (\HasNoChildren) "." "INBOX"
a OK List completed.
a examine INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk Junk $Forwarded $label1 $label2 $label3 $label4 $label5)
* OK [PERMANENTFLAGS ()] Read-only mailbox.
* 928 EXISTS
* 0 RECENT
* OK [UNSEEN 928] First unseen.
* OK [UIDVALIDITY 1256471328] UIDs valid
* OK [UIDNEXT 3383] Predicted next UID
* OK [HIGHESTMODSEQ 6421] Highest
a OK [READ-ONLY] Select completed.
a fetch 1 body[]
[... entêtes du mail #1 ...]

[... corps du mail #1 ...]
a OK Fetch completed.
a logout
* BYE Logging out
a OK Logout completed.

POP

À savoir: l’argument de la commande PASS est le mot de passe en clair.

$ telnet serveur 110
Trying serveur
Connected to serveur
Escape character id '^]'.
+OK ready
USER toto
+OK
PASS fauxMdpDeToto
-ERR Authentification failed.
QUIT
+OK Logging out.
$telnet serveur 110
Trying serveur
Connected to serveur
Escape character id '^]'.
+OK ready
USER toto
+OK
PASS mdpDeToto
+OK Logged in.
LIST
+OK X messages:
1 tailleMsg1
...
X tailleMsgX
.
TOP Y
[... Entêtes du mail #Y ...]
.
TOP Y Z
[... Entêtes du mail #Y ...]

[... Z premières lignes de #Y ...]
.
QUIT
+OK Logging out.