Telegramm lernte, sich als HTTPS zu tarnen

Im Telegramm-Client-Code wurde die Möglichkeit hinzugefügt , sich als HTTPS (TLS + HTTP / 2.0) zu tarnen .



Um diese Funktion zu nutzen, haben sie ein neues geheimes Präfix hinzugefügt - "ee" . Darüber hinaus wurde die Möglichkeit hinzugefügt, zusätzlich zu hex ein Geheimnis in der Proxy-Server-Adresse als base64 zu codieren.

Bevor wir uns mit den Details befassen, versuchen wir herauszufinden, wie sich die Unterstützung von Proxyservern in Telegram entwickelt hat.

Hintergrund


  1. Das Telegramm unterstützte zunächst SOCKS-Proxys. Dies half dabei, die Blockierung des IP-Servers zu umgehen, aber das Protokoll war im Datenverkehr erkennbar, und das Kennwort wurde im Klartext übertragen.
  2. Vor etwa einem Jahr veröffentlichten sie einen offiziellen Proxy, der am neuen MTProto-Protokoll arbeitet. Im Gegensatz zu SOCKS wurde das Passwort in MTProto nicht im Klartext übertragen. Im Protokoll wurden alle Service-Header entfernt, anhand derer man verstehen konnte, dass er es wirklich war. Wir haben auch die Möglichkeit hinzugefügt, Anzeigen für Proxy-Server-Benutzer anzuzeigen
  3. Es stellte sich heraus, dass Proxys, auf denen das MTProto-Protokoll ausgeführt wird, anhand der Länge der Pakete erkannt werden können. Wenn eine Verbindung hergestellt wird, tauschen der Client und der Proxyserver Pakete einer bestimmten Länge und während des Betriebs Pakete derselben Länge modulo 4 aus. Diese Funktion wurde von großen Anbietern verwendet, um den Messenger zu blockieren. Die Telegrammentwickler reagierten, indem sie das Protokoll änderten, indem sie jedem Paket eine Anzahl zufälliger Bytes hinzufügten. Da die Änderung die Kompatibilität beeinträchtigte, musste ich das geheime Format durch das spezielle Präfix „dd“ ergänzen, was bedeutet, dass ein modifiziertes Protokoll verwendet wurde:
    tg://proxy?server=178.62.232.110&port=3256&secret=dd00000000000000000000000000000000
  4. Bei der Untersuchung der Funktionen der Proxy-Server-Blockierung in China und im Iran stellte sich heraus, dass Supervisor Wiederholungsangriffe zur Erkennung verwenden. Bei alternativen Implementierungen von Proxyservern in Python, Erlang und Go ist ein teilweiser Schutz gegen diese Art von Angriff aufgetreten. Zu diesem Zweck speichern Proxyserver Daten, die in der Anfangsphase des Verbindungsaufbaus übertragen wurden, und erlauben keine erneute Verbindung mit denselben Daten. Der Ansatz hat ein Problem mit großen Proxys, wie Speicher benötigt viel RAM
  5. In China und im Iran werden folgende Taktiken angewendet: Wenn das Protokoll unbekannt ist, wird für alle Fälle die Geschwindigkeit seiner Arbeit erheblich verringert. In der Praxis bedeutet dies die Möglichkeit, Telegramm nur zum Senden von Textnachrichten ohne Bilder und Videos zu verwenden. Und in China wussten sie lange, wie man das macht, aber im Iran haben sie erst vor relativ kurzer Zeit gelernt. Russland hat noch nicht gelernt, aber das Gesetz wurde bereits verabschiedet . Ein Versuch von Messenger-Entwicklern, den Datenverkehr unter einem gängigen Protokoll vor diesem Hintergrund zu maskieren, erscheint natürlich.

Was hat sich geändert?


Im Protokoll zwischen dem Telegrammclient und dem Proxyserver wurde eine weitere Kapselungsebene über TCP hinzugefügt. Anstatt Daten über TCP zu senden, werden die Daten in die folgenden TLS-Einträge eingeschlossen:



Zu Beginn der Arbeit wurde die TLS-Handshake-Emulationsphase hinzugefügt. Das Paket vom Client zum Proxyserver hat die folgende Struktur:



Fast alle Felder sind für Telegramm-Clients nicht sinnvoll und werden nur benötigt, um sich als TLS auszugeben. Die wichtigste Funktion wird vom Zufallsfeld ausgeführt , in dem die HMAC aus dem gemeinsamen Geheimnis resultiert und die Daten im Paket abgelegt werden, wodurch der Client nachweisen kann, dass er das Geheimnis kennt. Außerdem verarbeitet der Client die letzten 4 Bytes des Zufallsfelds mit seiner Zeit im Unixtime-Format, sodass der Proxyserver bestimmen kann, wann das Paket generiert wurde. Dies ist nützlich, um sich vor Wiederholungsangriffen zu schützen. Wenn das Paket vor langer Zeit oder in der Zukunft generiert wurde, kann der Proxyserver es sofort verwerfen.

Wenn ein Client eine Verbindung herstellt, überprüft der Proxyserver den übertragenen HMAC. Wenn es mit dem berechneten übereinstimmt, antwortet der Proxy mit einem Paket mit der folgenden Struktur:



Das darin enthaltene Zufallsfeld ist ebenfalls nicht zufällig, sondern das Ergebnis der HMAC des gemeinsam genutzten Geheimnisses und der Daten im Paket. Bei der Berechnung der HMAC wird der vom Client gesendete Zufallswert vor den Daten des Pakets selbst zugewiesen. Bei der Übertragung der Daten selbst wird die erste Nachricht vom Client ignoriert, sodass Sie ihm Daten mit zufälliger Länge senden können, um die Erkennung weiter zu erschweren.

Wo kann man es versuchen?


Zur Demonstration wurde der Proxyserver in Python geändert und angehoben, mit dem Sie eine Verbindung zum neuesten Telegramm-Desktop-Client herstellen und den übertragenen Datenverkehr mit Wireshark überwachen können:

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

Außerdem wurde dem Erlang-Proxyserver TLS-Maskierungsunterstützung hinzugefügt. Höchstwahrscheinlich wird diese Funktionalität in naher Zukunft anderen Implementierungen von Proxyservern hinzugefügt.

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


All Articles