- PVSM.RU - https://www.pvsm.ru -
В код клиентов Telegram добавили [1] возможность маскировки под HTTPS (TLS + HTTP/2.0).
Для использования этой возможности добавили новый префикс секрета — «ee». Кроме того, добавили возможность кодировать секрет в адресе прокси сервера как base64, в дополнение к hex.
Перед тем, как углубиться в детали, попробуем разобраться как развивалась поддержка прокси-серверов в Telegram.
tg://proxy?server=178.62.232.110&port=3256&secret=dd00000000000000000000000000000000
В протоколе между клиентом Telegram и прокси-сервером добавили ещё один слой инкапсуляции поверх TCP. Вместо посылки данных по TCP, данные оборачиваются в записи TLS следующего вида:
В начале работы добавился этап эмуляции TLS-handshake. Пакет от клиента к прокси-серверу имеет такую структуру:
Почти все поля не имеют для клиентов Telegram смысла и нужны лишь для того чтобы прикидываться TLS. Самая важную функцию несёт поле Random, куда помещается результат HMAC [6] от общего секрета и данных в пакете, что позволяет доказать клиенту что он знает секрет. Так же, клиент ксорит последние 4 байта поля Random со своим временем в формате unixtime, что позволяет прокси-серверу определять когда был сгенерирован пакет. Это полезно для защиты от replay-атак. Если пакет сгенерирован давно или в будущем, то прокси-сервер может его сразу отбросить.
При подключении клиента, прокси сервер проверяет переданный HMAC. Если он совпадает с вычисленным, прокси отвечает пакетом со следующей структурой:
Поле Random в нём так же не является случайным, а является результатом HMAC от общего секрета и данных в пакете, причём при вычислении HMAC, случайное значение, отправленное клиентом приписывается перед данными самого пакета. При передаче самих данных, первая посылка игнорируется клиентом, что позволяет послать ему данные случайной длины, для дополнительного усложнения обнаружения.
Для демонстрации был доработан и поднят прокси-сервер на языке Python [7], к которому можно подключаться десктопным клиентом Telegram последних версий и смотреть передающийся трафик с помощью Wireshark:
tg://proxy?server=178.62.232.110&port=3256&secret=7gAAAAAAAAAAAAAAAAAAAABnb29nbGUuY29t
Так же, поддержка маскировки под TLS была добавлена в прокси-сервер на языке Erlang [8]. Скорее всего, в ближайшее время, данную функциональность добавят и в другие реализации прокси-серверов.
Автор: alexbers
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/326755
Ссылки в тексте:
[1] добавили: https://github.com/telegramdesktop/tdesktop/commit/69b6b487382c12efc43d52f472cab5954ab850e2
[2] выпустили: https://habr.com/ru/post/412755/
[3] использоваться: https://habr.com/ru/news/t/414099/
[4] используют: https://habr.com/ru/post/452144/
[5] приняли: https://habr.com/ru/post/448294/
[6] HMAC: https://ru.wikipedia.org/wiki/HMAC
[7] прокси-сервер на языке Python: https://github.com/alexbers/mtprotoproxy
[8] прокси-сервер на языке Erlang: https://github.com/seriyps/mtproto_proxy/tree/fake-tls
[9] Источник: https://habr.com/ru/post/461171/?utm_campaign=461171&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.