В клиентском коде Telegram добавлен возможность маскироваться под HTTPS (TLS + HTTP/2.0).
Для использования этой возможности добавлен новый секретный префикс — "эээ" .
Кроме того, мы добавили возможность кодировать секрет в адресе прокси-сервера не только в шестнадцатеричном формате, но и в формате Base64. Прежде чем вдаваться в подробности, попробуем разобраться, как развивалась поддержка прокси-серверов в Telegram.
Фон
- Сначала Telegram поддерживал прокси SOCKS. Это помогло обойти IP-блокировку серверов, но протокол был виден в трафике, а пароль передавался открытым текстом.
- Около года назад выпущенный официальный прокси, работающий по новому протоколу MTProto. В отличие от SOCKS, пароль в MTProto не передавался открытым текстом.
В протоколе избавились от любых служебных заголовков, которые давали бы понять, что это действительно он.
Также мы добавили возможность показывать рекламу пользователям прокси-сервера.
- Оказалось, что прокси-серверы, работающие по протоколу MTProto, можно определить по длине пакетов.
При установлении соединения клиент и прокси-сервер обмениваются пакетами определенной длины, а во время работы — пакетами одинаковой длины по модулю 4. Эта возможность появилась использоваться крупные провайдеры заблокировали мессенджер.
Разработчики Telegram отреагировали на это модификацией протокола, добавив в каждый пакет определенное количество случайных байтов.
Поскольку изменение нарушило совместимость, пришлось дополнить секретный формат специальным префиксом «dd», означающим использование модифицированного протокола:
tg://proxyЭserver=178.62.232.110&port=3256&secret=dd00000000000000000000000000000000
- При изучении особенностей блокировки прокси-серверов в Китае и Иране выяснилось, что надзорные органы использовать для обнаружения атак повторного воспроизведения.
Альтернативные реализации прокси-серверов на Python, Erlang и Go теперь предлагают частичную защиту от атак этого типа.
Для этого прокси-серверы запоминают данные, переданные на начальном этапе установления соединения, и не позволяют повторно подключиться с теми же данными.
У этого подхода есть проблема с большими прокси-серверами, поскольку для запоминания требуется большой объем оперативной памяти.
- В Китае и Иране используется следующая тактика: если протокол неизвестен, то на всякий случай скорость его работы сильно снижается.
На практике это означает возможность использовать Telegram только для отправки текстовых сообщений, без картинок и видео.
Причем в Китае это умели делать давно, а вот в Иране научились сравнительно недавно.
В России еще не научились, а закон уже есть принял .
Попытка разработчиков мессенджера замаскировать трафик под какой-то популярный протокол на этом фоне выглядит естественно.
Что изменилось?
В протоколе между клиентом Telegram и прокси-сервером поверх TCP был добавлен еще один уровень инкапсуляции.
Вместо отправки данных по TCP данные заключаются в записи TLS следующим образом:
В начале работы был добавлен этап эмуляции TLS-хендшейка.
Пакет от клиента к прокси-серверу имеет следующую структуру:
Почти все поля не имеют значения для клиентов Telegram и нужны только для того, чтобы притвориться TLS. Поле имеет самую важную функцию Случайный , куда помещается результат HMAC из общего секрета и данных в пакете, что позволяет доказать клиенту, что он знает секрет. Также клиент копирует последние 4 байта поля Random со своим временем в формате unixtime, что позволяет прокси-серверу определить, когда был сгенерирован пакет. Это полезно для защиты от атак повторного воспроизведения.
Если пакет был сгенерирован давно или в будущем, то прокси-сервер может сразу его отбросить.
Когда клиент подключается, прокси-сервер проверяет переданный HMAC. Если оно совпадает с рассчитанным, прокси отвечает пакетом следующей структуры:
Поле Случайный он также не является случайным, а является результатом HMAC из общего секрета и данных в пакете, и при вычислении HMAC случайное значение, отправленное клиентом, назначается перед данными самого пакета.
При передаче самих данных первая отправка игнорируется клиентом, что позволяет отправлять ему данные произвольной длины, что еще больше усложняет обнаружение.
Где попробовать?
Для демонстрации его доработали и подняли прокси-сервер на Python , к которому можно подключиться с помощью последних версий десктопного клиента Telegram и смотреть передаваемый трафик с помощью Wireshark: tg://proxyЭserver=178.62.232.110&port=3256&secret=7gAAAAAAAAAAAAAAAAAAAABnb29nbGUuY29t
Также добавлена поддержка маскировки TLS. прокси-сервер в Эрланге .
Скорее всего, в ближайшем будущем этот функционал будет добавлен и в другие реализации прокси-серверов.
Теги: #Сетевые технологии #открытый код #мессенджеры #tls #Telegram #MTProto #блокировка #протокол #прокси #прокси
-
Цена На Наушники В Индии
19 Oct, 24 -
Получить Доступ К Порнхабу?
19 Oct, 24 -
Два Веб-Дизайнера Ищут Работу
19 Oct, 24 -
Защитите Свой Ipod!
19 Oct, 24 -
Followme — Наш Ответ Чемберлену
19 Oct, 24 -
«Мамба» Продает Музыку
19 Oct, 24 -
И Internet Explorer Может Быть Полезен
19 Oct, 24