Exim4 avec plaintext authentification, et le base64

Le base64 n’est rien d’autre qu’un moyen « compact » pour transmettre des données. Dans le cas de SMTP, et plus précisément avec exim4, il est utilisé pour l’authentification en plaintext (public_name = PLAIN) mais également pour l’authentification login (public_name = LOGIN). J’ai lu quelques articles qui parlaient de tests afin d’encoder sois-même en base64 dans le but de tester le serveur smtp par telnet, mais souvent avec des erreurs. Voyons de suite quelques outils et quelques erreurs à éviter.

Je ne m’étalerais pas sur le sujet des commandes SMTP par telnet dans cet article, simplement le minimum pour tester l’authentification. Voici en bleu les commandes que j’ai moi même tapé. Il faudra se baser sur cet exemple pour tester les mots de passe. Je me contenterai de rappeler cela par la ligne « AUTH PLAIN <ici on met le hash base64> ».

feo@localhost:~$ telnet logd.fr 25
Trying 51.15.0.180...
Connected to logd.fr.
Escape character is '^]'.
220 {reverse_dns_serveur} ESMTP Exim 4.84_2 Fri, 23 Jun 2017 03:38:46 +0200
EHLO logd.fr
250-{reverse_dns_serveur} Hello {reverse_dns_ip_client} [ip.du.client.ici]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250-AUTH PLAIN
250 HELP
AUTH PLAIN <ici on met le hash base64>
501 Invalid base64 data

 

Présentation de gen-auth, l’outil de référence

Premier outil à présenter, issu du packet sasl2-bin, le programme gen-auth. Ecrit en perl, il permet de vous assister pour tout un tas d’authentication / encoding / decoding / tâche d’encryption. D’un simple outil spécifique à SMTP, il est devenu plus complet au fil du temps. C’est un outil de référence qui vous permettra, sans vous tromper, d’avoir ce que vous voulez sans erreur.
Types d’authentification : PLAIN, LOGIN, CRAM-MD5, CRAM-SHA1, NTLM, HTTP-BASIC, APOP, ENCODE, DECODE, MD5/MD5-HEX, MD5-BASE64, ENCRYPT, SALTENCRYPT, ROT13, ATBASH. Comme vous pouvez le constater, la liste est plutôt longue. Il contient quelques exemples, plutôt parlant pour présenter son utilisation :

generate a PLAIN AUTH string for user 'tim', password 'tanstaaftanstaaf'
 > gen-auth plain tim tanstaaftanstaaf
 Auth String: AHRpbQB0YW5zdGFhZnRhbnN0YWFm

generate a CRAM-MD5 string for user 'tim', password 'tanstaaftanstaaf', challenge
 '<1896.697170952@postoffice.reston.mci.net>', using prompt to hide password
 > gen-auth cram-md5
 username: tim
 password:
 challenge: PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+
 dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw

Inutile d’en dire plus. Si je vous présente cet outil, c’est afin d’avoir une valeur sure, une valeur de référence pour le hash généré. Cet outil ne se trompera pas (vu que les standards ne changent pas tous les 4 matins).

 

Parlons un peu de plaintext et de base64

Le mécanisme de plaintext authentification, si l’on en croit la RFC 2595, normalement la chaîne de caractères que l’on envoit devrait ressembler à ça : authorization-identity\0authentication-identity\0password
Mais comme ils sont gentils, si jamais l’authorization-identity est identique à l’authentication-identity, on peut juste présenter les données ainsi : \0authentication-identity\0password    (le \0 est un null character)

Alors là je me dis ok ça roule, on va encode vite fait une chaine en base64 via l’outil du même nom : base 64

feo@localhost:~$ echo -e "\0feo\0$92COPlolfu" | base64
AGZlbwJDT1Bsb2xmdQo=

AUTH PLAIN AGZlbwJDT1Bsb2xmdQo=

Et en même temps dans les logs d’exim que vois-je après avoir tenté de me log via telnet ?

2017-06-22 21:52:12 plain_server authenticator failed for <remote host> (logd.fr) [14.14.14.14]: 535 Incorrect authentication data (set_id=feo\002COPlolfu\n)

D’une part je vois que exim4 à pris toute la chaine pour mon login, mais en plus de ça je vois que le signe $ à fait de la merde, et je vois également un retour à la ligne symbolisé par \n. Forcément, j’avais mis des guillemets doubles sans échapper le dollar, et j’ai oublié le -n du echo pour le retour à la ligne. Ne surtout pas oublier le -e qui permet l’interprétation des \0.
Je recommence donc à hasher ma chaîne de caractères :

feo@localhost:~$ echo -n -e "\0feo\0\$92COPlolfu" | base64
AGZlbwAkOTJDT1Bsb2xmdQ==

AUTH PLAIN AGZlbwAkOTJDT1Bsb2xmdQ==

Et là ça va de suite beaucoup mieux :

AUTH PLAIN AGZlbwAkOTJDT1Bsb2xmdQ==
235 Authentication succeeded

 

Astuces en ce qui concerne base64

Je me suis heurté à un petit problème durant mes tests, bien qu’il existe de nombreux outils pour générer un hash en base64, tous ces outils semblaient « mange » les caractères null ( \0 ). Et pour moi c’était potentiellement une cause d’erreur. Car quand je ne pouvais pas me log, et que la chaîne une fois décodée ressemblait à ça : feo$92COPlolfu j’étais en droit de me dire « WTF ils sont où mes null char ? »

J’ai donc généré la chaîne avec gen-auth, puis j’ai tenté de décoder la chaîne :
(Pour encoder avec ces outils, il vous suffit de retirer le -d ou dans le cas de Perl remplacer decode_base64 par encode_base64)

feo@localhost:~$ python -m base64 -d <<< AGZlbwAkOTJDT1Bsb2xmdQ==
feo@localhost:~$ openssl enc -base64 -d <<< AGZlbwAkOTJDT1Bsb2xmdQ==
feo@localhost:~$ echo -n 'AGZlbwAkOTJDT1Bsb2xmdQ==' | base64 -d
feo@localhost:~$ perl -MMIME::Base64 -ne 'printf "%s\n",decode_base64($_)' <<< AGZlbwAkOTJDT1Bsb2xmdQ==

Puis j’ai eu une idée : tenter de faire apparaître les caractères invisibles si il y en avait, j’ai trouvé deux façon de procéder : la première en utilisant la commande « less » qui interprète les caractères invisibles. L’autre en utilisant la commande « od« , qui affiche le contenu de ce qu’on lui donne, en octal (mais il gère également le Décimal, et l’Hexadécimal).

Alors que less va donner ceci :

feo@localhost:~$ echo 'AGZlbwAkOTJDT1Bsb2xmdQ==' | base64 -d | less

^@feo^@$92COPlolfu
(END)

od -c va être beaucoup plus parlant :

feo@localhost:~$ echo -n 'AGZlbwAkOTJDT1Bsb2xmdQ==' | base64 -d | od -c
0000000 \0 f e o \0 $ 9 2 C O P l o l f u
0000020

 

En espérant que mes mésaventures serviront à d’autres, il est 5h18 du matin et je n’ai encore pas vu le temps passer alors que je réalisais mes tests et que mettais tout ça en forme dans cette petite documentation… @ bientôt dans le futur !

 

Lu 116 fois

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *