Telegram a appris à se déguiser en HTTPS

Dans le code des clients Telegram , la possibilité de se déguiser en HTTPS (TLS + HTTP / 2.0) a été ajoutée .



Pour utiliser cette fonctionnalité, ils ont ajouté un nouveau préfixe secret - «ee» . De plus, ils ont ajouté la possibilité de coder un secret dans l'adresse du serveur proxy en base64, en plus de hex.

Avant de plonger dans les détails, essayons de comprendre comment la prise en charge des serveurs proxy dans Telegram s'est développée.

Contexte


  1. Telegram a initialement pris en charge les proxys SOCKS. Cela a permis de contourner le blocage du serveur IP, mais le protocole était visible dans le trafic et le mot de passe a été transmis en texte clair.
  2. Il y a environ un an, ils ont publié un proxy officiel travaillant sur le nouveau protocole MTProto. Contrairement à SOCKS, le mot de passe dans MTProto n'a pas été transmis en texte clair. Dans le protocole, ils se sont débarrassés de tout en-tête de service par lequel on pouvait comprendre que c'était vraiment lui. Nous avons également ajouté la possibilité d'afficher des annonces aux utilisateurs du serveur proxy
  3. Il s'est avéré que les proxys exécutant le protocole MTProto peuvent être détectés par la longueur des paquets. Lorsqu'une connexion est établie, le client et le serveur proxy échangent des paquets d'une certaine longueur, et pendant le fonctionnement - des paquets de même longueur modulo 4. Cette fonctionnalité a commencé à être utilisée par les grands fournisseurs pour bloquer le messager. Les développeurs de télégrammes ont réagi en modifiant le protocole en ajoutant un certain nombre d'octets aléatoires à chaque paquet. Depuis que le changement a cassé la compatibilité, j'ai dû compléter le format secret avec le préfixe spécial "dd", ce qui signifie utiliser un protocole modifié:
    tg://proxy?server=178.62.232.110&port=3256&secret=dd00000000000000000000000000000000
  4. Lors de l'étude des caractéristiques du blocage de serveurs proxy en Chine et en Iran, il s'est avéré que les superviseurs utilisent des attaques par rejeu pour la détection. Dans les implémentations alternatives des serveurs proxy en Python, Erlang et Go, une protection partielle contre ce type d'attaque est apparue. Pour cela, les serveurs proxy stockent les données transmises au stade initial de l'établissement d'une connexion et ne permettent pas de se reconnecter avec les mêmes données. L'approche a un problème avec les grands proxys, comme la mémoire nécessite une grande quantité de RAM
  5. En Chine et en Iran, les tactiques suivantes sont utilisées: si le protocole est inconnu, alors juste au cas où, la vitesse de son travail est sévèrement réduite. En pratique, cela signifie la possibilité d'utiliser Telegram uniquement pour envoyer des messages texte, sans images ni vidéos. Et en Chine, ils savaient faire cela depuis longtemps, mais en Iran, ils ont appris relativement récemment. La Russie n'a pas encore appris, mais la loi a déjà été adoptée . Une tentative des développeurs de messagers pour masquer le trafic sous un protocole populaire dans ce contexte semble naturelle.

Qu'est-ce qui a changé?


Dans le protocole entre le client Telegram et le serveur proxy, une autre couche d'encapsulation sur TCP a été ajoutée. Au lieu d'envoyer des données via TCP, les données sont encapsulées dans les entrées TLS suivantes:



Au début des travaux, la phase d'émulation TLS-handshake a été ajoutée. Le package du client vers le serveur proxy a la structure suivante:



Presque tous les champs n'ont pas de sens pour les clients Telegram et ne sont nécessaires que pour prétendre être TLS. La fonction la plus importante est portée par le champ Random , où le HMAC résulte du secret partagé et les données dans le paquet sont placées, ce qui permet au client de prouver qu'il connaît le secret. En outre, le client prend en charge les 4 derniers octets du champ aléatoire avec son heure au format unixtime, ce qui permet au serveur proxy de déterminer quand le paquet a été généré. Ceci est utile pour se protéger contre les attaques par rejeu. Si le paquet a été généré il y a longtemps ou à l'avenir, le serveur proxy peut le supprimer immédiatement.

Lorsqu'un client se connecte, le serveur proxy vérifie le HMAC transmis. S'il correspond à celui calculé, le proxy répond avec un paquet avec la structure suivante:



Le champ aléatoire n'est pas non plus aléatoire, mais résulte du HMAC du secret partagé et des données du paquet, et lors du calcul du HMAC, la valeur aléatoire envoyée par le client est affectée avant les données du paquet lui-même. Lors de la transmission des données elles-mêmes, le premier message est ignoré par le client, ce qui vous permet de lui envoyer des données d'une longueur aléatoire, pour compliquer encore la détection.

Où essayer?


Pour le démontrer, le serveur proxy en Python a été modifié et augmenté, auquel vous pouvez vous connecter au dernier client de bureau Telegram et regarder le trafic transmis à l'aide de Wireshark:

 tg://proxy?server=178.62.232.110&port=3256&secret=7gAAAAAAAAAAAAAAAAAAAABnb29nbGUuY29t 

De plus, la prise en charge du masquage TLS a été ajoutée au serveur proxy Erlang . Très probablement, dans un avenir proche, cette fonctionnalité sera ajoutée à d'autres implémentations de serveurs proxy.

Source: https://habr.com/ru/post/fr461171/


All Articles