Journal d'investigation en ligne et d'information‑hacking
par Jef

Telegram : DNS over Google

Le domain fronting du pauvre

Pour se prémunir du blocage et de la censure, Telegram a mis en œuvre un système de contournement… Assez ébouriffant.

Dans un précédent épisode, nous vous expliquions qu'il allait être difficile pour la messagerie Telegram de contourner le blocage imposé par le sympathique Vladimir Poutine.

C'était aller un peu vite en besogne (personne n'est parfait), car nous avons depuis découvert dans le code source de l'application que des mesures de contournement avait en réalité déjà été mises en place : une sorte de domain fronting du pauvre.

En effet, lorsque, sur le terminal d'un utilisateur, l'application de messagerie ne parvient pas — à cause du blocage — à se connecter aux serveurs de Telegram via les adresses IP préconfigurées, elle émet des requêtes HTTP vers google.com pour récupérer une nouvelle liste d'adresses IP.

En réalité, la véritable destination des requêtes n'est pas google.com, mais dns.google.com ou dns-telegram.appspot.com. google.com ne fait que les relayer. On trouve aussi une seconde « facade » dans le code source de Telegram, en l'occurrence le centre de téléchargement de Microsoft (software-download.microsoft.com), mais contrairement à la première, nous n'avons pas réussi à la faire fonctionner.

Lorsque l'on interroge l'un de ces deux URL, Telegram nous renvoie un charabia, apparemment encodé en base 64. Vous pouvez essayer par vous même sur Appspot ou sur le service dns.google.com.

Une fois les données en base 64 décodées, nous nous retrouvons avec des données chiffrées grâce à la clé privée RSA de Telegram. Nous déchiffrons donc les contenus grâce à la clé publique présente dans le logiciel. Une fois cette opération réalisée, nous obtenons des données chiffrées, cette fois-ci avec du chiffrement symétrique, en l'occurrence AES. La clé de déchiffrement et le vecteur d'initialisation sont également fournies dans le message, nous nous empressons donc de le déchiffrer également.

In fine, nous avons des données encodées au format défini par le protocole MTProto. Ce n'est pas gênant, puisque le schéma est documenté. Après une rapide analyse, on peut voir que ces services nous renvoient bien une liste d'adresses IP. Comme nous sommes des gens serviables, nous avons même bricolé un script qui fait ça tout seul. Ce qui pose quand même quelques questions.

Déchiffrement du payload "DNS" de Telegram - Jef Mathiot
Déchiffrement du payload "DNS" de Telegram - Jef Mathiot

Si un programmeur peut créer en une poignée d'heures sur un coin de table un tel outil, on voit mal comment les services du gouvernement russe en seraient incapables. Si Telegram change les adresses renvoyées, il suffira au régulateur des communications de Poutine d'aligner le blocage sur le nouvel adressage. Tant que Telegram ne fera pas une refonte en profondeur de son protocole de communication, le jeu du chat et de la souris pourra durer éternellement, ou presque.

Exécution du script "Telegram DNS" - Jef Mathiot
Exécution du script "Telegram DNS" - Jef Mathiot

Enfin, on a un peu de mal à comprendre quel intérêt il y a à s'enquiquiner à chiffrer les réponses renvoyées par ces services, puisque tout le matériel cryptographique nécessaire au déchiffrement y est également présent et que, de toute façon, le transfert a lieu en HTTPS. En dehors d'une nouvelle tentative d'offuscation, totalement naïve, c'est pour le moins inutile.

Mise à jour du 18 avril 2018 : Meduza documente une technique complémentaire qui s'appuie sur les systèmes de notifications de Google (Firebase) et Apple (APNS) pour envoyer de nouvelles adresses IP. Nous avons pu vérifier dans le code source qu'un message `DC_UPDATE" peut ête envoyé à certains terminaux pour leur ordonner de changer d'adresse IP.

1 Commentaire
Une info, un document ? Contactez-nous de façon sécurisée