在Telegram客户端代码中
,添加了伪装为HTTPS(TLS + HTTP / 2.0)的
功能 。

为了使用此功能,他们添加了一个新的秘密前缀-
“ ee” 。 此外,除了十六进制外,他们还添加了将代理服务器地址中的机密编码为base64的功能。
在深入研究细节之前,让我们尝试弄清楚Telegram对代理服务器的支持是如何开发的。
背景知识
- 电报最初支持SOCKS代理。 这有助于绕开IP服务器的阻止,但是协议在流量中很明显,并且密码以明文形式传输。
- 大约一年前,他们发布了有关新MTProto协议的官方代理。 与SOCKS不同,MTProto中的密码不是以明文形式传输的。 在该协议中,他们摆脱了任何服务标头,通过这些标头,人们可以理解它确实是他。 我们还增加了向代理服务器用户展示广告的功能
- 事实证明,可以通过数据包的长度来检测运行MTProto协议的代理。 建立连接后,客户端和代理服务器交换一定长度的数据包,并且在操作过程中-相同长度的数据以模4为模。大型提供商开始使用此功能来阻止Messenger。 电报开发人员的反应是通过向每个数据包添加一些随机字节来修改协议。 由于更改破坏了兼容性,因此我不得不在机密格式上添加特殊的“ dd”前缀,这意味着使用经过修改的协议:
tg://proxy?server=178.62.232.110&port=3256&secret=dd00000000000000000000000000000000
- 在研究中国和伊朗的代理服务器阻止功能时,事实证明,主管使用重播攻击进行检测。 在Python,Erlang和Go中代理服务器的替代实现中,已经出现了针对这种攻击的部分保护措施。 为此,代理服务器存储在建立连接的初始阶段传输的数据,并且不允许与相同数据重新连接。 该方法存在大量代理问题,因为 内存需要大量RAM
- 在中国和伊朗,使用以下策略:如果协议未知,则以防万一,其工作速度会大大降低。 实际上,这意味着可以将Telegram仅用于发送文本消息,而没有图片和视频。 在中国,他们很长一段时间都知道该怎么做,但是在伊朗,他们是最近才学到的。 俄罗斯尚未了解,但是法律已经通过 。 Messenger开发人员尝试在这种背景下掩盖某些流行协议下的流量看起来很自然。
有什么变化?
在电报客户端和代理服务器之间的协议中,添加了基于TCP的另一层封装。 数据包装在以下TLS条目中,而不是通过TCP发送数据:

在工作开始时,添加了TLS握手仿真阶段。 从客户端到代理服务器的软件包具有以下结构:

几乎所有字段对于Telegram客户端都没有意义,仅需要假装为TLS。 最重要的功能是由
随机字段承载的,在该字段中,来自共享机密的
HMAC结果将被放置在数据包中,这使客户端可以证明自己知道机密。 同样,客户端以unixtime格式混淆随机字段的最后4个字节及其时间,这使代理服务器可以确定何时生成数据包。 这对于防止重放攻击很有用。 如果数据包是在很早之前或将来生成的,则代理服务器可以立即将其丢弃。
当客户端连接时,代理服务器检查传输的HMAC。 如果匹配计算出的值,则代理将使用以下结构的数据包进行响应:

其中的“
随机”字段也不是
随机字段,而是共享密钥的HMAC和数据包中数据的结果,在计算HMAC时,将在数据包本身的数据之前分配客户端发送的随机值。 传输数据本身时,客户端会忽略第一条消息,这使您可以向他发送随机长度的数据,从而使检测更加复杂。
在哪里尝试?
为了演示,对
Python中的
代理服务器进行了修改和改进,您可以将其连接到最新的Telegram桌面客户端,并使用Wireshark监视传输的流量:
tg://proxy?server=178.62.232.110&port=3256&secret=7gAAAAAAAAAAAAAAAAAAAABnb29nbGUuY29t
此外,TLS屏蔽支持已添加
到Erlang代理服务器 。 在不久的将来,很有可能将此功能添加到代理服务器的其他实现中。