
Плагин Wireshark для анализа протокола Telegram
Это диссектор для Wireshark, который помогает разобраться в трафике Telegram вокруг вас.
Он разбирает пакеты Telegram, которые видит, в соответствии с протоколом MTProto 2.0.
Чтобы установить этот диссектор:
luarocks (для версии Lua вашего Wireshark)luagcrypt.dll в этом обсужденииluagcrypt.dll/luagcrypt.so в каталог установки Wireshark, например C:\Program Files\Wiresharkmtproto в каталог плагинов Wireshark, например C:\Users\<имя_пользователя>\AppData\Roaming\Wireshark\pluginsПосле установки вы можете просто открыть Wireshark с некоторым трафиком Telegram.
ВАЖНО: Для работы деобфускации вся TCP-сессия должна быть известна с самого начала (согласно спецификациям MTProto), поэтому рекомендуется открывать приложение Telegram после начала записи пакетов.
Чтобы расшифровать трафик, вам понадобится соответствующий ключ авторизации (auth_key).
Последние версии официальных клиентов Telegram используют Perfect Forward Secrecy для облачных чатов, вызывая auth.bindTempAuthKey при запуске и/или регулярно. Это означает, что основные сессии будут использовать временные ключи авторизации (устанавливаемые через DH), а не постоянные.
Для извлечения используемых ключей авторизации на лету предоставлены два сценария frida, которые подключаются к процессам Telegram. Чтобы их использовать, убедитесь, что у вас установлен Frida, и выполните:
hook_windows_auth_key.py для официального приложения Windows (с некоторыми изменениями, вероятно, будет работать и на Linux/Mac)hook_android_auth_key.py для официального приложения AndroidКлючи авторизации и их идентификаторы должны быть выведены сразу после выполнения какой-либо сетевой операции.
Когда у вас есть ключи авторизации, чтобы передать их диссектору, перейдите в Edit → Preferences → Protocols → MTProto и заполните поля ключей.
Вы также можете извлечь постоянный ключ авторизации из файла tgnet.dat (Android — см., например, здесь, здесь, здесь) или из файла key_datas (Desktop — смотрите здесь, здесь). Другие клиенты, вероятно, хранят auth_key иным способом.
Иногда Telegram обновляет версию схемы API в своих клиентах (или, возможно, вы смотрите на трафик от старых клиентов). Когда это происходит, TL-схема этого инструмента может рассинхронизироваться с некоторыми RPC-вызовами, которые вы видите в пакетах, что приведёт к появлению сообщений Incomplete parsing в Wireshark. Вы можете узнать, какой уровень API использует ваше приложение, в его запросе invokeWithLayer.
Чтобы синхронизировать диссектор с правильной схемой API, вам нужно скачать TL-файл слоя из Telegram, преобразовать его в JSON (см. ниже) и сохранить в mtproto/schema/api_tl_schema_layer_X.json, где X — номер вашего слоя.
Вы можете получить обновлённую TL-схему API из api.tl десктопного приложения или поискать больше версий на сайте Telegram.
Чтобы преобразовать файл tl в JSON, выполните, например (убедитесь, что у вас установлен npm):
C:\path\to\MTproto Dissector>
npx @psqq/tl-to-json api_layer_218.tl mtproto/schema/api_tl_schema_layer_218.json default --indent 4
Затем скопируйте новый JSON-файл в mtproto/schema/ в каталоге плагинов Wireshark.
Наконец, в Wireshark перейдите в Edit → Preferences → Protocols → MTPROTO и измените «API level» на уровень, соответствующий вашему трафику.