Force tcp telegram что это такое
Перейти к содержимому

Force tcp telegram что это такое

  • автор:

Transports

Enables the delivery of encrypted containers together with the external header (hereinafter, Payload) from client to server and back. Multiple transport protocols are defined:

The URI format for connecting to the websocket and HTTP endpoints is the following:

The TCP transport is implemented simply by sending the payloads generated by the chosen MTProto transport over a plain TCP socket on ports 80, 443, 5222 or other (a different port number may be returned by help.getConfig).

Framing is managed by the chosen MTProto transport protocol.

There are no implicit acknowledgments for the TCP transport: all messages must be acknowledged explicitly. Most frequently, acknowledgments are placed in a container with the next query or response if it is transmitted in short order. For example, this is almost always the case for client messages containing RPC queries: the acknowledgment normally arrives with the RPC response.

Websocket

Implementation of the websocket transport is pretty much the same as with TCP: a websocket connection is established to the chosen MTProto server over port 80 using the specified URI format.

Framing of payloads is still managed by the chosen MTProto transport protocol, not by websocket messages: the length of MTProto payloads is defined by the MTProto transport protocol, not by the length of the single websocket messages. This simply means that all data received and sent through websocket messages is to be treated as a single duplex stream of bytes, just like with TCP.

When using the websocket transport, transport obfuscation is required. Transport errors are transmitted the usual way, as with TCP. The close code of websockets will always be 1000 (normal closure), regardless of the actual exit status. In all cases, the description string will be a decimal encoded real error code (which may be forward/back-padded with whitespaces for constant length) and can be safely ignored.

Websocket over HTTPS

To establish a websocket connection over HTTPS, simply use the TLS URI format. The rest is the same as with plain websockets.

Note: when implementing browser clients, websocket transport is recommended instead of HTTP, thanks to its full-duplex stream logic similar to TCP’s; this removes the need for HTTP long polling and eventual delays while relaying RPC replies.

Implemented over HTTP/1.1 (with keepalive) running over the traditional TCP Port 80. HTTPS can also be used.

Message framing is not managed by MTProto transport protocols; it is instead handled by the HTTP protocol itself. Transport errors are also not transmitted the usual way, instead they are simply returned as normal HTTP status codes.

An HTTP connection is attached to a session (or rather, to session + key identifier) specified in the most recent user query received; normally, the session is the same in all queries, but crafty HTTP proxies may corrupt that. A server may not return a message into an HTTP connection unless it belongs to the same session, and unless it is the server’s turn (an HTTP request had been received from the client to which a response has not been sent yet).

The overall arrangement is as follows. The client opens one or more keepalive HTTP or HTTPS connections to the server. If one or more messages need to be sent, they are made into a payload which is followed by a POST request to the URL/api to which the payload is transmitted as data. In addition, Content-Length , Keepalive , and Host are valid HTTP headers.

Having received the query, the server may either wait a little while (if the query requires a response following a short timeout) or immediately return a dummy response (only acknowledging the receipt of the container). In any case, the response may contain any number of messages. The server may at the same time send out any other messages it might be holding for the session.

In addition, there exists a special long poll RPC query (valid for HTTP connections only) which transmits maximum timeout T. If the server has messages for the session, they are returned immediately; otherwise, a wait state is entered until such time as the server has a message for the client or T seconds have elapsed. If no events occur in the span of T seconds, a dummy response is returned (special message).

If a server needs to send a message to a client, it checks for an HTTP connection that belongs to the required session and is in the “answering an HTTP request” state (including long poll) whereupon the message is added to the response container for the connection and sent to the user. In a typical case, there is some additional wait time (50 milliseconds) against the eventuality that the server will soon have more messages for the session.

If no suitable HTTP connection is available, the messages are placed in the current session’s send queue. However, they find their way there anyway until receipt is explicitly confirmed by the client. For all protocols, the client must return an explicit acknowledgment within a reasonable time (it can be added to a container for the following request).

Important: if the acknowledgment fails to arrive on time, the message can be resent (possibly, in a different container). The parties must autonomously be ready for this and must store the identifiers of the most recent messages received (and ignore such duplicates rather than repeat actions). In order not to have the identifiers stored forever, there exist special garbage collection messages that take advantage of message identifier monotonicity.

If the send queue overflows or if messages stay in the queue for over 10 minutes, the server forgets them. This may happen even faster, if the server is running out of buffer space (for example, because of serious network issues resulting in a large number of connections becoming severed).

HTTPS

To establish a connection over HTTPS, simply use the TLS URI format. The rest is the same as with plain HTTP.

URI format

The URI format that must be used when connecting to the plain websocket and HTTP endpoints is the following:

The w flag is added when CORS headers are required in order to connect from a browser.
The s flag enables the websocket API.
The name placeholder in the domain version specifies the DC ID to connect to:

  • pluto => DC 1
  • venus => DC 2
  • aurora => DC 3
  • vesta => DC 4
  • flora => DC 5

-1 can be appended to the DC name to raise the maximum limit of simultaneous requests per hostname.
The _test flag, when connecting to the domain version of the URL, specifies that connection to the test DCs must be made, instead.

TLS URI format

When connecting to the HTTPS and WSS endpoints, only the domain name URI can be used over port 443:

See the URI format for an explanation of the placeholders.

Example implementations: tdlib, MadelineProto (client side), MTProxy (server side).

Force tcp telegram что это

В мессенджере Telegram появилась возможность маскировки трафика под протокол HTTPS. Информация об этом появилась на ресурсе GitHub. Для маскировки под HTTPS разработчики добавили в код клиента префикс секрета «ee». Кроме того, помимо метода кодирования base16 была реализована возможность шифровать секрет в адресе прокси-сервера с помощью base64.

Как было до этого

В мессенджере уже есть прокси, который работает по собственному протоколу Telegram под названием MTProto, его начали применять в 2018 г. Изначально он позволял обнаружить прокси-серверы, результатом чего стали блокировки мессенджера со стороны крупных провайдеров.

Идентификации MTProto мешает отсутствие служебных заголовков, но его выдает длина пакетов. Когда клиент подключается к прокси-серверу, они обмениваются пакетами определенной длины. А в ходе работы мессенджера происходит передача пакетов одинаковой длины. Все это и дает возможность провайдерам засечь трафик Telegram.

psswd600.jpg

В Telegram появилась возможность замаскировать трафик под популярный протокол

Впоследствии протокол был модифицирован разработчиками таким образом, что блокировки стало можно избежать. Его замаскировали путем добавления случайных байтов в каждый пакет. В секрет пришлось добавить префикс dd, чтобы избежать проблем с совместимостью. Но данная модификация станет неэффективной после вступления в силу закона об автономном рунете — уже сейчас MTProto позволяет заблокировать Telegram в Иране и Китая путем атак повторного воспроизведения.

В ответ разработчики добавили частичную защиту от атак повторного воспроизведения в альтернативных вариантах прокси-серверов на Python, Erlang и Go. С этой целью был введен механизм запоминания сервером данных, передающихся в самом начале подключения. Это помогает избежать повторного соединения с такими же данными. Метод проблематично применять для крупных серверов, так как он требует большого расхода оперативной памяти.

Запрет Telegram в России

Напомним, с апреля 2018 г. Telegram находится под блокировкой Роскомнадзора. Запрет мессенджера в России связан с неисполнением требований, которые российское законодательство накладывает на организаторов распространения информации (ОРИ), в частности, с отказом предоставить правоохранителям ключи шифрования переписки пользователей. Согласиться внести Telegram в реестр ОРИ создателя мессенджера Павла Дурова уговорил глава Роскомнадзора Александр Жаров.

В итоге блокировку Telegram удалось оттянуть на год, после чего она все-таки началась. Но Дуров не собирался сдаваться: Telegram стал «перескакивать» с одного IP-адреса на другой, используя обширные возможности зарубежных облачных хостингов. Со своей стороны, корпорации Apple и Google отказались удалять приложение Telegram из своих магазинов мобильных приложений, благодаря чему приложение продолжило иметь возможность обновляться и получать данные о новых IP-адресах.

Роскомнадзор пошел на радикальную меру и стал блокировать подсети (группы IP-адресов), принадлежащие крупным хостинг-провайдерам: Amazon Web Services, Google, Microsoft Azure, Digital Ocean и др. В результате в апреле 2018 г. число заблокированных в России IP-адресов достигало 20 млн. Также Роскомнадзор стал пытаться блокировать VPN-сервисы, использующиеся для обхода блокировки Telegram.

Более года Роскомнадзор пытается заблокировать работу кроссплатформенного мессенджера Telegram на территории России. Пока это не удалось, однако российскими службами отслеживаются и блокируются адреса серверов, используемых Телеграммом.
Чтобы в самый неподходящий момент не остаться без связи, чтобы иметь возможность играть в игры в Telegram, просматривать каналы и вести свой канал, можно обойти блокировку, используя Telegram порты – специальные proxy-адреса, через которые можно беспроблемно подключаться к ресурсам и возможностям мессенджера.

Telegram порты: персональный список

каталог телеграмма каналов, Telegram порты

Командой Телеграмма доработан раздел Proxy-settings, благодаря чему пользователи получили возможность составлять собственный прокси-лист из ряда прокси-адресов, причем, любого типа – как MTProxy, так и SOCKS5.
Добавить в персональный список прокси Telegram порты можно различными способами, среди них проверенные:
• Использовать каталог телеграмма каналов по соответствующему поисковому запросу. Владельцы многих каналов предоставляют рабочие свежие прокси-адреса, чтобы их подписчики всегда могли следить за обновлениями (неплохим вариантом станут каналы, предлагающие игры в Telegram – они очень популярны, а привлечь на канал еще большую аудиторию и поднять его в ТОП поможет сервис раскрутки Втопе). Адрес нужно подключить добавить в коллекцию.
• Адреса MTProxy поможет также добыть телеграмм-бот @BestMTProxyBot. Он в предоставит список из нескольких проверенных адресов.
• С помощью бота @Proxy_Socks5_bot.

Telegram порты подключены – как найти игры в Telegram?

Как найти и выбрать игры в Telegram? Довольно просто. Помогут боты, примеры которых можно найти в интернете или же воспользоваться внутренними поисковыми ресурсами (каталогом ботов) в самом мессенджере. При настроенных прокси, даже, если какой-то адрес будет заблокирован Роскомнадзором, пользователь будет автоматически переподключен к наиболее быстрому серверу. Это позволит с комфортом играть в игры в Telegram, общаться, постить на канал, настраивать автопостинг из других соцсетей и многое другое.

В этой статье мы рассмотрим Telegram в целом, поговорим об используемом протоколе и проведем сравнение с другими аналогичными продуктами.

image

Авторы: Hayk Saribekyan (hayks@mit.edu), Akaki Margvelashvili (margvela@mit.edu)

В этом разделе мы поговорим об истории Telegram и пользовательском интерфейсе. В разделе 2 будет описана архитектура Telegram. В разделе 3 описываются предыдущие проблемы, найденные в Telegram. В разделах 4 и 5 рассматриваются раскрытые уязвимости, связанные с безопасностью в Telegram. В разделе 6 мы рассмотрим текущие проблемы в Telegram и сделаем выводы.

История появления Telegram

Среди других технологических стартапов Telegram занимает особое место, вследствие чего получил повышенное внимание и доверие со стороны пользователей, и мы считаем, что полезно будет затронуть историю появления этого мессенджера.

Благодаря популярности Павла Дурова в России, Telegram быстро завоевал популярность среди русскоязычной аудитории. Кроме того, по факту Telegram предоставляет наиболее удобное средство по сравнению с аналогичными продуктами за счет своей скорости и функциональности.

Telegram – уникальное явление среди технологических стартапов, в том числе благодаря тому, что Павел Дуров является единственным спонсором этого проекта. Кроме того, в Telegram отсутствует реклама, а сам клиент – не только бесплатный, но и с открытым исходным кодом.

У Telegram есть клиенты под все популярные платформы, включая веб-приложения. На Рисунке 1 показана Desktop- и Android-версия. Официальные клиенты идут с открытым исходным кодом, хотя есть и бинарные блобы (то есть исполняемые бинарные файлы без доступных исходных текстов).

Рисунок 1: Официальные клиенты Telegram. Слева: мобильная версия, справа: desktop-клиент. Все официальные клиенты имеют открытый исходный код. Пользовательский интерфейс Telegram довольно быстрый и удобный

У Telegram также есть возможность работать с командной строкой [6], обладающей практически полным функционалом платформы, хотя и не очень удобной для использования. Например, для добавления контакта нужно ввести следующую команду:

tg> add contact <phone number> <name> <lastname>

Во время исследования безопасности Telegram мы часто пользовались командной строкой.

2. Архитектура Telegram

3. Известные и исправленные проблемы

Как все компании с технологическим уклоном, у Telegram были, есть и будут уязвимости, связанные с безопасностью, и нестандартные проблемы, которые имеют косвенное отношение к безопасности. Мы расскажем о некоторых из этих проблем, а в последствии рассмотри более подробно один из таких случаев.

3.1 Проблемы нетехнического характера

На концептуальном уровне у Telegram есть несколько нестандартных решений, которые, как мы полагаем, не должны быть частью протокола безопасности. А конкретно:

3.2 Проблемы, связанные с технической безопасностью

Как показывают предыдущие примеры, во многих случаях пользователи Telegram должны полностью доверять безопасности сервера, что немного иронично, поскольку изначальной целью основателей Telegram было создание продукта, защищенного от слежки. Даже несмотря на то, что многие уязвимости, связанные с безопасностью, были устранены, некоторых найденных проблем не должно было быть изначально.

4. Эксплоит для обнаружения доступности пользователей

Как было упомянуто в предыдущих разделах, Telegram передает информацию о доступности каждому, у кого есть телефонный номер нужного пользователя. Предположим, Ева добавила Алису в список контактов. В этом случае протокол Telegram не оповещает Алису об этом событии. В свою очередь Ева начинает регулярно получать информацию о том, когда Алиса использует Telegram, а Алиса все также не получает никаких оповещений.

Рисунок 2: В командной строке выводится имя пользователя, если тот использует Telegram. В противном случае ничего не выводится

Проблема, связанная с утечкой, легко обнаруживается в командной строке Telegram, как показано на Рисунке 2.

Более того, на Рисунке 3 показано, что Ева может видеть, что Акакий и Хайк выходят в онлайн и уходят в оффлайн. Затем Ева может сопоставить временные интервалы и сделать вывод, что Акакий и Хайк общаются между собой. В следующих разделах будет рассказано, как можно использовать эксплоит для обнаружения того, что два пользователя разговаривают друг с другом.

4.1 Постановка эксперимента

Для отслеживания использования Telegram и коммуникаций мы выбрали 15 активных пользователей среди международных студентов Массачусетского технологического института. Таким образом, мы знали, что студенты общались между собой на ежедневной/еженедельной основе.

Для подключения к пользователям мы использовали командную строку Telegram. Для отслеживания и сбора метаданных был выделен специальный сервер. В итоге было собрано несколько мегабайт необработанных метаданных для последующего анализа.

4.2 Алгоритм корреляции

Мы создали алгоритм корреляции, которые анализирует информацию об использовании Telegram двумя пользователя и выводит последовательность совпадений, где каждое совпадение представляет собой временной интервал с вероятностью того, что пользователи общаются между собой (вероятность всегда не менее 0.5).

Рисунок 3: Ева отслеживает активность Хайк и Акакия и может сказать, когда каждая персона появлялась в онлайне. Обратите внимание на проблему: разница между появлением в онлайне и уходом в оффлайн составляет примерно 5 минут

На базе полученных метаданных на каждого пользователя была создана последовательность временных интервалов активности отсортированных по времени. Алгоритм находит совпадения по двум пользователям, общающихся между собой, на базе последовательностей временных интервалов.

Рисунок 4: Диаграмма, иллюстрирующая основные концепции алгоритма корреляции

Мы ввели коэффициент вероятности (likelihood coefficient), который определяет, насколько вероятно связанный компонент представляет собой коммуникацию между пользователями. Обратите внимание, ребро внутри связанного компонента, принадлежащее активному временному интервалу, которое соединено со многими другими вершинами, рассматривается как менее значимое по сравнению с ребром, концы которого не соединены с другими интервалами. По этой причине, вместо подсчета количества ребер в связанном компоненте, мы определили коэффициент вероятности как половину всех соединенных вершин внутри компонента. Таким образом, очень длинный активный временной интервал, который пересекает множество других интервалов не особо влияет на увеличение коэффициента вероятности.

Как только коэффициент вероятности рассчитан, вычисляем вероятность общения двух пользователей в течение промежутка времени внутри связанного компонента по следующей формуле:

Рисунок 5: Формула расчета вероятности общения двух пользователей

Идея заключается в том, что если коэффициент вероятности равен 0, то и вероятность общения тоже равна нулю. С другой стороны, каждая единица коэффициента вероятности увеличивает вероятность общения на половину. Альфа-множитель определяет степень влияния коэффициента вероятности на итоговую вероятность.

5. Результаты использования эксплоита

После реализации алгоритма, описанного выше, мы проанализировали метаданные, полученные сервером. Поскольку мы использовали Telegram во время работы сервера, то подстроили параметры на базе частоты нашей коммуникации и внесли некоторые коррективы.

Наиболее приемлемые значения: gap_time = 30 секунд, альфа-множитель = 1. При таких значения нам удалось отследить все коммуникации и не обрезать лишнего. Результаты показали, что количество ошибочных совпадений колеблется в районе 15%. Другими словами, иногда, когда два пользователя одновременно используют приложение, алгоритм работает некорректно.

Рисунок 6: Совпадения, найденные алгоритмом корреляции

В этом проекте мы провели исследование мессенджера Telegram. Когда Telegram оформился как самостоятельная компания, то приобрел популярность, благодаря заявлениям создателей, доверием и удачным временем выхода (в то же время произошли утечки с подачи Сноудена). Если верить заявлениям создателей Telegram, можно подумать, что этот мессенджер обладает высоким уровнем безопасности. Однако наше исследование показывает, что у Telegram были серьезные и в тоже время простые проблемы в протоколе (например, модифицированный и уязвимый алгоритм обмена ключами по методу Диффи-Хеллмана), которые может обнаружить любой знающий эксперт по безопасности.
При помощи командной строки мы смогли подключиться к некоторым нашим друзьям, и обнаружить интервалы общения. Мы полагаем, что это серьезная проблема, связанная с утечкой персональной информации, которая может, например, помочь обнаружить, у кого из группы более тесные взаимоотношения.

Из всего вышесказанного можно сделать вывод, что Telegram, как и все другие продукты, имеет уязвимости, о которых пользователи должны знать. Однако, к сожалению, заявления компаний заставляют пользователей верить в то, что переписка защищена от прочтения третьей стороной.

«телеграммаимеет открытыйAPIа такжепротоколбесплатно для всех ». — Домашняя страница Telegram

Тип Язык

Telegram API основан на RPC, поэтому взаимодействие с API включает отправку полезной нагрузки, представляющей вызов функции, и получение результата. Например, чтение содержимого разговора включает вызов messages.getMessage функция с необходимыми параметрами и получения messages.Messages в ответ.

Пример TL-схемы (сначала объявляются типы, за которыми следуют функции с разделителем):

Вызов функции TL и результат с использованием функций и типов из вышеуказанной схемы TL, а также эквивалентное двоичное представление (изофициальная документация):

Слои TL-схемы

Или, похоже, получается, что хотя последний уровень TL-схемы на веб-сайте Telegram — это уровень 23, на момент написания последнего уровня фактически уже был уровень 71. Вы можете найти последнюю версию TL-схемыВотвместо.

Создание приложения Telegram

Кроме того, в тех же инструкциях упоминается, что вы можете использовать образцы учетных данных, которые можно найти в исходных кодах Telegram для тестирования. Для удобства я буду использовать учетные данные, которые я нашел вИсходный код Telegram Desktop на GitHubв примере кода здесь.

Установка Telethon

Мы будем использовать Telethon для связи с Telegram API. Telethon — это клиентская библиотека Python 3 (что означает, что вам придется использовать Python 3) для API Telegram, который будет обрабатывать все специфичные для протокола задачи для нас, поэтому нам нужно только знать, какие типы использовать и какие функции выполнять вызов.

Вы можете установить Telethon с pip :

Использовать pip соответствует вашему интерпретатору Python 3; это может быть pip3 вместо. (Случайно: недавно была выпущена Ubuntu 17.10, и она использует Python 3 в качестве установки Python по умолчанию.)

Создание клиента

Прежде чем вы сможете начать взаимодействовать с Telegram API, вам нужно создать клиентский объект с вашим api_id а также api_hash и подтвердите его с вашим номером телефона. Это похоже на вход в Telegram на новом устройстве; вы можете представить этого клиента как еще одно приложение Telegram

Ниже приведен код для создания и аутентификации объекта клиента, модифицированный из документации Telethon:

Как упоминалось ранее, api_id а также api_hash выше взяты из исходного кода Telegram Desktop. Введите свой номер телефона в phone переменная.

Telethon создаст .session сохраните сведения о сеансе в своем рабочем каталоге, точно так же, как вам не нужно повторно проходить аутентификацию в приложениях Telegram каждый раз, когда вы закрываете и снова открываете их. Имя файла начинается с username переменная. Это зависит от вас, если вы хотите изменить его, если вы хотите работать с несколькими сессиями.

Если предыдущей сессии не было, выполнение этого кода приведет к отправке вам кода авторизации через Telegram. Если вы включили двухэтапное подтверждение в своей учетной записи Telegram, вам также потребуется ввести пароль Telegram. После того, как вы аутентифицировались один раз и .session файл сохранен, вам не придется повторно проходить аутентификацию, пока не истечет время сеанса, даже если вы снова запустите скрипт.

Если клиент был создан и аутентифицирован успешно, объект, представляющий себя, должен быть напечатан на консоли. Это будет похоже на (эллипсы … означает, что какой-то контент был пропущен)

Теперь вы можете использовать этот клиентский объект, чтобы начать делать запросы к Telegram API.

Проверка TL-схемы

Как упоминалось ранее, использование Telegram API включает вызов доступных функций в TL-схеме. В этом случае мы заинтересованы в messages.GetDialogs функция. Мы также должны принять к сведению соответствующие типы в аргументах функции. Вот подмножество TL-схемы, которую мы будем использовать для выполнения этого запроса:

Это не легко читать, но учтите, что messages.getDialogs функция вернет messages.Dialogs , который является абстрактным типом для messages.dialogs или messages.dialogsSlice объект, который оба содержат векторы Dialog , Message , Chat а также User ,

Использование документации Telethon

Документация для GetDialogsRequest указывает тип возвращаемого значения для метода, а также чуть более подробную информацию о параметрах. Кнопка «Копировать импорт в буфер обмена» особенно полезна, когда мы хотим использовать этот объект, как сейчас.

messages.getDialogs функция, а также конструктор для GetDialogsRequest занимает offset_peer аргумент типа InputPeer , В документации для GetDialogsRequest, нажмите через InputPeer ссылка, чтобы увидеть страницу с описанием конструкторов и методов, принимающих и возвращающих этот тип.

Так как мы хотим создать InputPeer объект для использования в качестве аргумента для нашего GetDialogsRequest нас интересуют конструкторы для InputPeer , В этом случае мы будем использовать InputPeerEmpty конструктор. Нажмите еще раз на страницу для InputPeerEmpty и скопируйте его путь импорта, чтобы использовать его. InputPeerEmpty Конструктор не принимает аргументов.

Сделать запрос

Вот наш законченный GetDialogsRequest и как получить его результат, передав его нашему авторизованному клиентскому объекту:

Получение DialogsSlice вместо того Dialogs означает, что не все мои диалоги были возвращены, но count Атрибут говорит мне, сколько диалогов у меня всего. Если у вас меньше определенного количества разговоров, вы можете получить Dialogs вместо объекта, и в этом случае все ваши диалоги были возвращены, а количество диалогов у вас есть только длина векторов.

терминология

Например, если моя история чата была этим скриншотом, я взял изПриложение Telegram в магазине Play:

dialogs будет содержать разговоры на скриншоте: Старые Пираты, Пресс-центр, Моника, Джайна…

chats будет содержать записи для Old Pirates, Press Room и Meme Factory.

(Я еще не работал с секретными чатами через Telegram API, поэтому я не уверен, как они обрабатываются.)

Управление данными ответа

Все соответствующие InputPeer конструкторы принимают то же самое id а также access_hash параметров, но в зависимости от того, является ли разговор индивидуальным чатом, группой или каналом, эти значения находятся в разных местах GetDialogsRequest ответ:

В псевдокоде имеем:

Преобразование в код Python (обратите внимание, что dialogs , chats а также users выше являются членами результата нашего GetDialogsRequest который также называется dialogs ):

Библиотека магии

Telethon имеет несколько вспомогательных функций для упрощения общих операций. На самом деле мы могли бы сделать вышеупомянутое с двумя из этих вспомогательных методов, client.get_dialogs() а также client.get_message_history() вместо:

Однако я чувствовал, что лучше сначала изучать методы API-интерфейса Telegram напрямую, тем более что не существует вспомогательного метода для всего. Тем не менее, есть некоторые вещи, которые намного проще с помощью вспомогательных методов, например, как мы аутентифицировали нашего клиента в начале, или такие действия, как загрузка файлов, которые в противном случае были бы утомительными.

Используя регулярные выражения для анализа истории чата в виде простого текста, я мог создать диаграмму, аналогичную графику хранилища перфокарт GitHub, показывающую, в какое время недели чат был наиболее активным:

Куда и как ходит Telegram?

Начнём с простого. Telegram-клиенты общаются с Telegram-серверами по собственному протоколу MTProto поверх TCP. Для соединения используются несколько адресов, которые не изменялись годами и продолжают являться основными точками подключения. Возьмём для примера один из адресов европейского региона: 149.154.167.40.

Обычно используется порт 443, но никакого отношения к SSL/TLS это не имеет.

На приведённой схеме видно, из чего состоит каждый пакет. Открытые пакеты используются только при первых коммуникациях с целью обменяться ключами, дальше вся связь зашифрована.

Обратите внимание, что даже в зашифрованных пакетах есть постоянные заголовки: первые 8 байт будут одинаковыми в пределах сессии, так как представляют из себя отпечаток авторизационного ключа. К этому моменту мы скоро вернёмся.

Роскомнадзор, мать его

И тут в игру вступает злое государство и его орган, регулирующий интернет, который начинает блокировку Telegram! В нашем случае это Роскомнадзор, который добавляет в выгрузку для провайдеров все подсети Telegram, в том числе ту, в которой находится наш 149.154.167.40. Провайдеры получают выгрузку и закрывают доступ пользователям к указанным адресам.

Команда Telegram, конечно, не оставила нас в беде. Ребята запустили множество серверов у разных хостинг-провайдеров, которые стали принимать пакеты и переадресовывать их на основные Telegram-сервера, попавшие под блокировку.

Откуда же приложение на вашем телефоне/компьютере узнает адреса этих новых серверов? Используются два метода.

Как доставить новые адреса серверов клиентам?

DC_UPDATE

Это первый способ, которым адреса новых серверов доставляются на устройства пользователей. Подходит он только для мобильных клиентов на iOS и Android, потому что использует Apple Push Notification Service и Google Cloud Messaging соответственно. Команда Telegram отправляет вам на устройства push-уведомления, внутри которых содержится список новых адресов. Приложение Telegram считывает их и начинает использовать эти адреса для связи.

  1. Помешать затее можно только заблокировав APNS и GCM полностью, что лишит вас всех уведомлений от всех приложений, даже если вы никогда не пользовались Telegram. На это власти не пойдут (?).
  2. В теории этот способ позволяет отправлять разным группам пользователей разные адреса, что может отсрочить блокировку новых серверов и помочь команде Telegram вычислить шпионов. На практике эта хитрость, насколько я знаю, не используется.
  1. Подходит только для мобильных устройств, так как на десктопных операционных системах нет единого механизма доставки уведомлений.
  2. Может работать нестабильно. Если уведомление по каким-то причинам до вас не дошло, приложение Telegram не узнает о новых адресах. Особенно актуально для iOS, где приложения сильно ограничены в фоновой обработке уведомлений. Именно поэтому на iOS такие push видны пользователю и требуют нажатия для активации.

Роскомнадзор выслеживает новые адреса, приходящие в DC_UPDATE и блокирует их.

Domain fronting

Этот способ доставки адресов не так широко известен, а многие вовсе не понимают, как он работает.

Для начала рекомендую прочитать общее описание. Telegram же просто помещает зашифрованный список в TXT-записи своих сервисных доменов и на платформе Azure. Затем клиенты запрашивают эти данные с адресов dns.google.com и tcdnb.azureedge.net/prodv2/config.txt. Техника domain fronting позволяет сделать так, что провайдерские системы фильтрации и блокировок видят это как запросы к google.com и software-download.microsoft.com.

Плюсы domain fronting:

  1. Для блокировки этого способа придётся заблокировать весь google.com и сервис доставки обновлений Windows. Роскомнадзор на такое пойти не может. Однажды они блокировали google.com, но дали заднюю.
  2. Может работать и работает на любых платформах, включая десктопные.

obfuscated2: Защита от более продвинутого DPI

Что, если регулирующий интернет орган вроде Роскомнадзора станет чуть умнее? Если ещё не забыли, в начале статьи я упомянула, что даже в зашифрованных пакетах Telegram всегда есть постоянные заголовки. При желании провайдер может отслеживать эти заголовки и блокировать соединения на основании содержимого пакета, а не адресов серверов. Тогда все вышеописанные техники защиты станут бесполезными, подумаете вы, и окажетесь правы. Почти правы.

Telegram ещё как минимум в начале 2017 года реализовал защиту от подобных «лишних глаз», заглядывающих в пакеты.

Несмотря на то, что протокол MTProto открыт и описан на официальном сайте Telegram, официальные же клиенты используют дополнительный слой обфускации, нигде не документированный. Товарищ Tomas Susanka уже максимально подробно описал используемый метод обфускации пакетов, поэтому расписывать всё не буду.

Обфуска́ция или запутывание кода — приведение исходного текста или исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции.

Клиент придумывает случайный 32-байтовый ключ и случайный 16-байтовый Initialization Vector, которыми шифрует каждый пакет с помощью AES CTR, а чтобы сервер узнал, как это расшифровать… ключ и IV добавляются в начало пакета перед зашифрованным содержимым.

Вы назовёте это глупостью, ведь какой смысл отправлять зашифрованные пакеты и сразу прикладывать к ним ключ для расшифровки? Конечно, это абсолютно бесполезная защита в логическом смысле, но она имеет большой смысл на практике.

После обфускации все пакеты выглядят как случайный мусор, поэтому для определения, Telegram-трафик это или нет, провайдеру придётся расшифровывать каждый непонятный пакет по методике obfuscated2, прежде чем проводить дальнейшие проверки. Такие действия требуют неоправданное количество вычислительных мощностей, которых у провайдеров попросту нет.

Подключение к Telegram через прокси

Как уже было сказано выше, команда Telegram прикладывает много усилий, чтобы обойти государственные блокировки, но это не всегда работает. Временные сервера быстро блокируются Роскомнадзором и мы снова теряем доступ к мессенджеру.

Дальнейшая борьба с блокировками отдаётся на откуп пользователям. Telegram предоставляет целых два способа подключения через прокси в своих приложениях. Оба способа не предполагают раскрытия ваших переписок и прочих данных держателям прокси-серверов, так как трафик Telegram изначально зашифрован и передаётся через промежуточные звенья в нечитаемом виде.

SOCKS5-прокси

Очень банальный, но действенный способ. Если сможете осилить технический английский, почитайте вот этот RFC-документ.

Клиент Telegram подключается к заданному вами SOCKS5-серверу и уже через него устанавливает соединение с Telegram-серверами. Так как SOCKS5-сервер находится вне страны, которая ввела блокировки, соединения между ним и Telegram устанавливаются успешно.

Простая лазейка будет работать до тех пор, пока сам прокси-сервер не будет отслежен и заблокирован.

  1. Очень быстро и очень просто.
  2. Всем известный протокол, серверные реализации которого существуют под все платформы и ОС.
  1. Протокол очень легко детектируется с помощью DPI, государство может легко в принципе запретить использование SOCKS5 и заблокировать его.
  2. Логин и пароль для авторизации передаются в открытом виде.
  3. Если ваше Telegram-приложение получало с помощью ранее описанных методов IP-адреса временных серверов, то при включении SOCKS5-прокси, приложение будет пытаться подключаться именно туда. Так как владельцы прокси, специализирующихся на Telegram, обычно блокируют соединения со всеми адресами, кроме основных подсетей Telegram, у пользователя могут иногда возникнуть проблемы с подключением.

На данный момент в боте @FCK_RKN_bot из-за ограничений и нестабильности бетаверсии MTPROTO-прокси доступен ТОЛЬКО для пользователей приватных прокси. Как только выйдет официальный релиз от Telegram, они станут доступны всем пользователям, как и SOCKS5-прокси.

Чтобы активировать MTPROTO прокси, нужно нажать в боте на кнопку “Получить прокси” => “Получить MTPROTO прокси” => “Включить” в диалоге настройки прокси.

P.S. MTPROTO на данный момент поддерживает ТОЛЬКО последняя версия Telegram для Android и Mac OS. Для остальных платформ обновление еще не вышло. Мы оповестим, как только оно станет доступно.

Чтобы поделиться с друзьями ботом для обхода блокировки телеграм, отправьте им ссылку https://t-do.ru/FCK_RKN_bot

MTPROTO-прокси

Наконец-то мы подошли к тому, чего вы так долго ждали.

Начнём с того, что любой MTPROTO-прокси — самый что ни на есть реверс-прокси. Это значит, что в отличие от SOCKS5, клиент не просит прокси достучаться до какого-то Telegram-сервера. Клиент общается с MTPROTO-прокси так, будто это уже Telegram-сервер.

Официальной документации по MTPROTO-прокси нет до сих пор, хотя в клиентах функциональность реализована давно. Некоторые умельцы написали свои реализации серверов, изучив исходный код клиентов.

MTPROTO-прокси-сервер просто принимает пакеты от клиента и отправляет Telegram-серверу. Обманула, не так просто. Давайте разберёмся.

Во-первых, клиент общается с MTPROTO-прокси только с обфускацией obfuscated2.

Во-вторых, obfuscated2 здесь используется чуть модифицированный. Перед зашифрованной частью всё так же открыто передаются ключ и IV, только вот шифруется сам пакет не этим ключом, а sha256(key+secret). Secret — это тот самый 16-байтовый параметр, который вы заполняете при подключении к MTPROTO-прокси.

Secret нигде не передаётся в процессе связи. Его использует клиент для шифрования пакета и MTPROTO-прокси-сервер для расшифрования.

MTPROTO-прокси-сервер получает от вас пакет, деобфусцирует его ключом sha256(key+secret), затем снова обфусцирует, но уже используя обычный obfuscated2 без дополнительных параметров.

Таким образом получается, что сторонний человек никак не может деобфусцировать и классифицировать трафик между клиентом и MTPROTO-прокси-сервером.

Добавить комментарий

Ваш адрес email не будет опубликован.