NeutrOSINT – L’outil d’OSINT pour Protonmail

Reading Time: 11 minutes

Dans cet article, on va parler d’un outil que j’ai développé en Python il y a quelques temps de ça et qui permet d’obtenir des informations concernant une adresse email qui a été créée sur Protonmail (mais pas que).

Lien vers le repo Github : https://github.com/Kr0wZ/NeutrOSINT


Objectif de l’outil

Le but premier de l’outil est de prendre en entrée une adresse email quelle qu’elle soit et déterminer si elle existe ou non sur Protonmail sans alerter la cible.

On pourrait croire que cette phrase est fausse puisque si une adresse email ne se termine pas en @protonmail.com or @proton.me alors elle n’est pas liées à Protonmail mais c’est plus complexe que ça, comme on va le voir plus tard dans cet article.


Pourquoi l’avoir créé ?

Dans une galaxie lointaine, très lointaine… il y avait un autre outil du nom de ProtOSINT (lien du projet ici) qui faisait à peu près la même chose que celui-ci.

A chaque fois que quelqu’un faisait une recherche sur Internet concernant de l’OSINT lié à Protonmail, les articles qui ressortaient mentionnaient obligatoirement ProtOSINT.

Mais il y a de ça trois ans (au moment où j’écris cet article), l’outil a cessé d’être mis à jour et un message est apparu sur le README.md du Github :

En effet, à cette époque, Protonmail avait modifié leur API et la manière dont elle intéragissait avec le backend.

Et donc l’outil est devenu inutilisable depuis le 07 novembre 2021 mais est resté une référence en la matière vu que c’était le seul existant à cette époque et encore maintenant, les gens sur les forums et Discord continuent de le recommander alors qu’il ne fonctionne plus.

Mais la fourberie, c’est que peu importe si l’adresse email existe ou pas, l’endpoint de l’API qui était utilisé par cet outil va retourner un résultat qui est TOUJOURS positif. Et donc, si on n’est pas au courant de ce souci, ça fausse totalement les résultats.

En réalité, l’outil fonctionne encore sur certains points :

  • La date de création de l’email (encore faut-il qu’on sache si l’email existe vraiment).
  • Des informations sur la clé publique, le chiffrement utilisé et la date de génération de la clé PGP.

L’outil possède également d’autres modules, comme la génération de différentes adresses email en fonction de mots qu’on lui donne pour ensuite les "brute forcer" et déterminer si elles existent.

Personnellement, je ne trouve cette fonctionnalité pertinente puisque d’autres outils du même genre le font et mieux. Il aurait simplement fallu générer une liste des emails potientielles avec un autre outil et ensuite passer le fichier à ProtOSINT via un paramètre.

Le dernier module proposé par ProtOSINT est le fait de donner une adresse IP et de déterminer si elle fait partie de la range d’IPs attribuée à ProtonVPN.

Encore une fois, l’information sur les ranges est publique et facilement trouvable sur Internet. Donc la pertinence est limitée (sauf si on a vraiment une grosse liste d’IPs et qu’il faut automatiser).

C’est face à tous ces problèmes et petits défauts que j’ai décidé de créer un nouvel outil nommé NeutrOSINT (Proton / Neutron).


Fonctionnalités de NeutrOSINT

Comme brièvement mentionné au début de cet article, le but de l’outil est principalement de déterminer si une adresse email existe.

Il existe deux modes de fonctionnement pour NeutrOSINT :

  • Un mode qu’on peut appeler "léger" qui va simplement aller interroger l’API publique et donc qui ne nécessite aucune authentification à Protonmail. Mais cette approche est limitée lorsqu’on a un grand nombre d’adresses email à tester puisqu’on est rapidement limité par rapport au nombre de requêtes pendant un interval de temps.
  • Un autre mode plus "lourd" et forcément plus long au niveau de l’exécution. On peut également l’utiliser pour une seule adresse email mais c’est peu pertinent parce qu’on aura le même résultat qu’avec l’API mais en plus long.
    Ici le but est de s’authentifier directement avec une adresse email et un mot de passe à un compte Protonmail. Une fois connecté, l’outil va aller renseigner dans le champ des destinataires, la liste des emails qu’on aura spécifié et pour chacune d’entre elles, va nous dire si elle existe ou non.
    Pour effectuer toutes ces actions, j’ai utilisé un module Python nommé selenium qui va permettre d’effectuer les mêmes actions qu’un humain mais de manière programmatique (clics, défiller, écrire dans des champs de texte, etc..)

Au niveau des adresses vérifiées, j’ai parlé dans la partie objectifs de l’outil d’adresses emails qui ne seraient pas en @protonmail.com or @proton.me mais quand même valides et étant liées à Protonmail.

Il s’agit en fait des adresses email type business. La plupart des email providers proposent ceci.
Il s’agit d’alias liées à un autre nom de domaine mais utilisées sur un service en particulier.

C’est mon cas avec le nom de domaine synoslabs.com mais qui est lié à mon compte perso Protonmail. Cela me permet d’avoir plusieurs alias et de tout recevoir dans la même boîte mail.

NeutrOSINT est donc capable, via une adresse email d’un domaine classique sur Internet de définir si c’est une adresse business utilisée sur Protonmail.

Fonctionnement de l’API

La nouvelle API est légèrement plus complexe que l’ancienne.
En effet, dans ProtOSINT, on avait uniquement besoin d’envoyer une requête GET à l’URL suivante : https://api.protonmail.ch/pks/lookup?op=index&search= en mettant l’adresse email recherchée au niveau du paramètre search et on avait notre réponse.

Désormais il faut générer des cookies comme on peut le voir dans la fonction qui commence ligne 342 du fichier neutrosint.py.

On effectue d’abord une requête POST vers https://account.proton.me/api/auth/v4/sessions pour obtenir un token qu’on va de nouveau envoyer à https://account.proton.me/api/core/v4/auth/cookies pour qu’il nous donne le cookie qu’on va pouvoir utiliser dans les prochaines requêtes qu’on fera à l’API (située ici : https://account.proton.me/api/core/v4/users/available) pour déterminer si une adresse email existe.

A savoir que le cookie généré pour l’API n’est valide que 24 heures. Il faut donc en théorie en regénérer un tous les jours pour qu’on puisse continuer d’interroger l’API.
Par souci de simplicité, j’ai opté pour générer un nouveau cookie pour chaque requête. Puisque cette génération est presque instantanée, ça ne rajoute pas de temps d’exécution à l’outil.

L’API est également limitée à 100 requêtes par heure. Si un trop gros nombre de requête est envoyé pendant cette période, il faudra soit attendre la prochaine heure pour être débloqué, soit utiliser un proxy ou VPN afin de bypass la restriction liée à l’IP ou bien utiliser le mode "lourg" avec selenium qui ne va pas directement interroger l’API Protonmail.

Fonctionnement de selenium

Selenium va effectuer les actions suivantes dans l’ordre, comme le ferait un humain pour vérifier qu’une adresse email est valide via l’interface de Protonmail :

  • Connexion au compte Protonmail avec les identifiants fournis dans la commande via les paramètres : https://account.proton.me/fr/mail. Cela se fait grâce à la fonction login ligne 109.

  • Crée un nouveau mail (Nouveau message). Fonction new_email ligne 143.

  • Insére dans le champ À (destinataires) les adresses email à tester.

  • Vérifie si chacune des adresses email existe (cadenas bleu) ou pas (destinataire en orange). Fonction check_emails ligne 230.

Attention cependant, selenium n’est clairement pas une source sûre et des erreurs peuvent interrompre le bon fonctionnement de l’outil. Dans ce cas là, il est recommandé de le relancer pour obtenir les résultats souhaités.


Adresses email business

Pour déterminer si une adresse email avec un nom de domaine personnalisé différent de protonmail.com et proton.me est utilisée en tant qu’adresse business c’est très simple.

Il suffit d’effectuer une résolution DNS sur le nom de domaine de l’adresse email et de regarder l’enregistrement MX correspondant aux serveurs de mail.
Si cet enregistrement contient protonmail dedans, alors c’est une adresse business.

Cette vérification est faite dans le fichier neutrosint.py ligne 230 dans la fonction check_domain.

Si on veut manuellement faire le test alors on utilisera un outil comme dig sous Linux ou nslookup sous Windows (d’autres alternatives existent également) :


Conclusion

NeutrOSINT est loin d’être parfait mais fonctionne correctement (en tout cas pour le moment) et offre des fonctionnalités qui permettent d’automatiser la vérification d’une adresse email Protonmail existente.

Si vous trouvez des bugs ou avez des idées d’améliorations ou de fonctionnalités, n’hésitez pas à m’en faire par directement par email : contact@synoslabs.com.