No código de clientes do Telegram
, foi
adicionada a capacidade de disfarçar como HTTPS (TLS + HTTP / 2.0).

Para usar esse recurso, eles adicionaram um novo prefixo secreto -
"ee" . Além disso, eles adicionaram a capacidade de codificar um segredo no endereço do servidor proxy como base64, além de hexadecimal.
Antes de aprofundar nos detalhes, vamos tentar descobrir como o suporte aos servidores proxy no Telegram se desenvolveu.
Antecedentes
- O Telegram inicialmente suportava proxies do SOCKS. Isso ajudou a ignorar o bloqueio do servidor IP, mas o protocolo era perceptível no tráfego e a senha foi transmitida em texto não criptografado.
- Há cerca de um ano, eles lançaram um proxy oficial trabalhando no novo protocolo MTProto. Diferentemente do SOCKS, a senha no MTProto não foi transmitida em texto não criptografado. No protocolo, eles se livraram de qualquer cabeçalho de serviço pelo qual alguém pudesse entender que era realmente ele. Também adicionamos a capacidade de exibir anúncios para usuários de servidores proxy
- Descobriu-se que os proxies executando o protocolo MTProto podem ser detectados pelo comprimento dos pacotes. Quando uma conexão é estabelecida, o cliente e o servidor proxy trocam pacotes de um determinado tamanho e durante a operação - pacotes do mesmo tamanho módulo 4. Esse recurso começou a ser usado por grandes fornecedores para bloquear o messenger. Os desenvolvedores de telegramas reagiram modificando o protocolo adicionando um número de bytes aleatórios a cada pacote. Desde que a alteração quebrou a compatibilidade, tive que suplementar o formato secreto com o prefixo especial “dd”, o que significa usar um protocolo modificado:
tg://proxy?server=178.62.232.110&port=3256&secret=dd00000000000000000000000000000000
- Ao estudar os recursos de bloqueio de servidores proxy na China e no Irã, os supervisores usam ataques de repetição para detecção. Em implementações alternativas de servidores proxy em Python, Erlang e Go, a proteção parcial contra esse tipo de ataque apareceu. Para isso, os servidores proxy armazenam dados transmitidos no estágio inicial do estabelecimento de uma conexão e não permitem a reconexão com os mesmos dados. A abordagem tem um problema com proxies grandes, como memória requer uma grande quantidade de RAM
- Na China e no Irã, as seguintes táticas são usadas: se o protocolo for desconhecido, apenas no caso, a velocidade de seu trabalho será severamente reduzida. Na prática, isso significa a possibilidade de usar o Telegram apenas para enviar mensagens de texto, sem fotos e vídeos. E na China eles sabiam como fazer isso há muito tempo, mas no Irã eles aprenderam relativamente recentemente. A Rússia ainda não aprendeu, mas a lei já foi aprovada . Uma tentativa dos desenvolvedores de messenger de mascarar o tráfego sob algum protocolo popular nesse contexto parece natural.
O que mudou?
No protocolo entre o cliente Telegram e o servidor proxy, foi adicionada outra camada de encapsulamento sobre TCP. Em vez de enviar dados por TCP, os dados são agrupados nas seguintes entradas TLS:

No início do trabalho, a fase de emulação TLS-handshake foi adicionada. O pacote do cliente para o servidor proxy tem a seguinte estrutura:

Quase todos os campos não fazem sentido para os clientes do Telegram e são necessários apenas para fingir ser TLS. A função mais importante é realizada pelo campo
Aleatório , onde o
HMAC resulta do segredo compartilhado e os dados no pacote são colocados, o que permite ao cliente provar que conhece o segredo. Além disso, o cliente confunde os últimos 4 bytes do campo Aleatório com seu horário no formato unixtime, o que permite ao servidor proxy determinar quando o pacote foi gerado. Isso é útil para proteger contra ataques de repetição. Se o pacote foi gerado há muito tempo ou no futuro, o servidor proxy pode descartá-lo imediatamente.
Quando um cliente se conecta, o servidor proxy verifica o HMAC transmitido. Se corresponder ao calculado, o proxy responderá com um pacote com a seguinte estrutura:

O campo
Random também não é aleatório, mas é o resultado do HMAC do segredo compartilhado e dos dados no pacote e, ao calcular o HMAC, o valor aleatório enviado pelo cliente é atribuído antes dos dados do próprio pacote. Ao transmitir os dados em si, a primeira mensagem é ignorada pelo cliente, o que lhe permite enviar dados de comprimento aleatório, para complicar ainda mais a detecção.
Onde tentar?
Para demonstração, o
servidor proxy em Python foi modificado e aumentado, ao qual você pode se conectar ao cliente de desktop Telegram mais recente e assistir ao tráfego transmitido usando o Wireshark:
tg://proxy?server=178.62.232.110&port=3256&secret=7gAAAAAAAAAAAAAAAAAAAABnb29nbGUuY29t
Além disso, o suporte à máscara TLS foi adicionado
ao servidor proxy Erlang . Muito provavelmente, em um futuro próximo, essa funcionalidade será adicionada a outras implementações de servidores proxy.