Roubando sua conta do Telegram em 10 segundos

Roubando sua conta do Telegram em 10 segundos. Digamos que você me entregou seu telefone, qual é a pior coisa que eu poderia fazer em 10 segundos?

  

Outro dia recebi uma mensagem interessante com um link para o cliente web do Telegram . Ao clicar no link, já estava logado. Curioso, saí, enviei uma mensagem para mim mesmo com o mesmo link, cliquei e entrei novamente. Não houve nada de especial no link que me foi enviado, este é apenas o comportamento padrão do Telegram.

Eu queria ver como isso funciona. O primeiro passo foi descobrir como o cliente Telegram estava passando a sessão para o navegador. Ao clicar no link, notei algo piscando na barra de URL por apenas uma fração de segundo:

 

Parece que o Telegram apenas abre uma URL com o token da sua conta anexado a ela. O token é colocado em um fragmento hash e desaparece rapidamente quando o cliente web é carregado e percebe que há um token ali. Embora muito conveniente, esse recurso é bastante preocupante porque pode ser usado para obter acesso rápido à sua conta, mesmo se você usar 2FA e um dispositivo bloqueado (por exemplo, um telefone sem root/desbloqueado ).

Então, de onde vem esse URL e sua sessão? Pesquisei no código do tdesktop 1 várias palavras-chave, como “web.telegram.org” e “tgWebAuthToken”, mas por incrível que pareça não obtive nenhum resultado. Depois de olhar o código e não encontrar nada relacionado a esse recurso por um tempo, decidi construir o aplicativo de verdade e anexar um depurador a ele.

Algumas horas de compilação depois, eu tinha minha própria versão do tdesktop instalada e funcionando. Configurei alguns pontos de interrupção, cliquei em alguns links de teste e percorri o código procurando os bits relevantes. E finalmente cheguei aqui:

É por isso que não consegui encontrar as palavras-chave antes! A lista de domínios com os quais esse truque funciona é enviada a você pelo servidor Telegram e armazenada na configuração na chave url_auth_domains2 . Você pode ver a lista de domínios atualmente fornecidos nos locais acima.

Depois de clicar em um link com um domínio correspondente, seu cliente irá enviá-lo para os servidores do Telegram e se tudo parecer bem, você receberá de volta uma pequena URL temporária com os tokens e tudo anexado. Para quem joga junto em casa, mandamos um messages_requestUrlAuthcom apenas o urlset 3 , e esperamos receber de volta um com o interior urlAuthResultAcceptednovo .url

Tendo descoberto como a coisa funciona e munido de uma lista de domínios, comecei a procurar uma maneira de quebrá-la. Parece que todo o URL inicial é preservado, incluindo o caminho, os parâmetros de consulta e o fragmento de hash, com exceção do esquema que é forçado para https.

Por exemplo:

  • http://web.​telegram.org/torna-sehttps://web.​telegram.org/​#tgWebAuthToken=...
  • https://z.t.me/​ponytorna-sehttps://z.t.me/pony​?tgWebAuth=1​#tgWebAuthToken=...
  • https://k.t.me/​#po=nytorna-sehttps://k.t.me/​?tgWebAuth=1​#po=ny​&tgWebAuthToken=...
(muitos) mais exemplos
URL original URL com token
https://ztme/ https://ztme/?tgWebAuth=1#tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ztme/pony https://ztme/pony?tgWebAuth=1#tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ztme/#pony https://ztme/?tgWebAuth=1#pony?tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ztme/#bon=bon https://ztme/?tgWebAuth=1#bon=bon&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ztme/#?bon https://ztme/?tgWebAuth=1#?bon&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ztme/?#bon https://ztme/?tgWebAuth=1#bon?tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ztme/?bon=bon https://ztme/?bon=bon&tgWebAuth=1#tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ztme/?bon=bon#bon https://ztme/?bon=bon&tgWebAuth=1#bon?tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ztme/#= https://ztme/?tgWebAuth=1#=&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ztme/?tgWebAuth=🐴 https://ztme/?tgWebAuth=1#tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ztme/#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=pôr do sol https://ztme/?tgWebAuth=1#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=sunset&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ztme/?tgWebAuth=🐴#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=pôr do sol https://ztme/?tgWebAuth=1#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=sunset&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ktme/pony https://ktme/pony?tgWebAuth=1#tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ktme/#pony https://ktme/?tgWebAuth=1#pony?tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ktme/#bon=bon https://ktme/?tgWebAuth=1#bon=bon&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ktme/#?bon https://ktme/?tgWebAuth=1#?bon&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ktme/?#bon https://ktme/?tgWebAuth=1#bon?tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ktme/?bon=bon https://ktme/?bon=bon&tgWebAuth=1#tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ktme/?bon=bon#bon https://ktme/?bon=bon&tgWebAuth=1#bon?tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ktme/#= https://ktme/?tgWebAuth=1#=&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ktme/?tgWebAuth=🐴 https://ktme/?tgWebAuth=1#tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ktme/#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=pôr do sol https://ktme/?tgWebAuth=1#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=sunset&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://ktme/?tgWebAuth=🐴#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=pôr do sol https://ktme/?tgWebAuth=1#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=sunset&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://web.telegram.org/pony https://web.telegram.org/pony#tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://web.telegram.org/#pony https://web.telegram.org/#pony?tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://web.telegram.org/#bon=bon https://web.telegram.org/#bon=bon&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://web.telegram.org/#?bon https://web.telegram.org/#?bon&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://web.telegram.org/?#bon https://web.telegram.org/?#bon?tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://web.telegram.org/?bon=bon https://web.telegram.org/?bon=bon#tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://web.telegram.org/?bon=bon#bon https://web.telegram.org/?bon=bon#bon?tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://web.telegram.org/#= https://web.telegram.org/#=&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://web.telegram.org/?tgWebAuth=🐴 https://web.telegram.org/?tgWebAuth=🐴#tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://web.telegram.org/#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=sunset https://web.telegram.org/#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=sunset&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4
https://web.telegram.org/?tgWebAuth=🐴#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=sunset https://web.telegram.org/?tgWebAuth=🐴#tgWebAuthToken=trixie&tgWebAuthUserId=starlight&tgWebAuthDcId=sunset&tgWebAuthToken=…&tgWebAuthUserId=420493337&tgWebAuthDcId=4

Todos os domínios, exceto o web.telegram.org, são construídos para os links diretos t.me. Seguir qualquer um deles sem um caminho apenas o levará à página inicial do telegram.org. Seguir um com um caminho compatível, como ztme/share?url=lyra.horse , abrirá o respectivo cliente com um fragmento de hash, por exemplo:
https://web.telegram.org/a/#?​tgaddr= ​tg%3A%2F%2Fmsg_url%3F​url%3Dlyra.cavalo

Isso geralmente é realizado com um redirecionamento HTTP 301, mas se o tgWebAuthparâmetro estiver definido e o link direto for válido, você poderá executar este javascript divertido:

Fiquei um pouco confuso no início, mas finalmente percebi que tudo isso era apenas um truque simples para lidar com fragmentos de hash de URL. A parte do fragmento de hash da URL nunca é enviada ao servidor, portanto, o servidor não pode saber para onde redirecioná-lo se também quiser adicionar seu próprio fragmento de hash. Neste caso específico, #tgWebAuthToken=...já temos a URL e queremos combiná-la à #?tgaddr=...medida que redirecionamos para o cliente web (então no final obtemos #?tgaddr=...&tgWeb​AuthToken=...).

Durante o resto da noite brinquei com vários clientes web do Telegram. Um fato pouco conhecido é que o cliente web legado do Telegram ainda pode ser acessado até hoje em web.telegram.org/?legacy=1 . Além do mais, a sessão é compartilhada entre os clientes web, portanto, uma exploração no cliente web antigo ainda pode ser útil mesmo se o alvo usar um cliente web moderno.

Não consegui encontrar nada muito interessante em WebK , mas tanto o WebZ quanto o cliente legado forneceram algumas pistas promissoras para mexer com tgaddro URL. No entanto, acabou sendo um beco sem saída para minha pesquisa, pois não consegui descobrir uma maneira de me livrar ou ignorar o “e” comercial na &tgWebAuthToken=...parte do URL. Eu até mexi com o Unicode para ver se isso me permitiria de alguma forma “apagar” o E comercial, mas parece que o UTF-8 foi projetado para suportar isso.

Em seguida, examinei os aplicativos móveis. Tanto os clientes iOS quanto Android suportam a autenticação de link, o que torna toda a situação um pouco mais preocupante, considerando que geralmente é muito mais difícil copiar apenas um token de sessão de um dispositivo móvel. No Android, brinquei com as intenções, mas acabei em outro beco sem saída, pois as intenções para links da web foram bloqueadas desde o Android 12 e exigem verificação de domínio para funcionar. Também mexi nas intenções do protocolo, mas a forma como o aplicativo foi escrito impede que o token seja anexado nesses casos.

Então, nenhuma exploração?

Na minha pesquisa, não consegui encontrar uma exploração remota bem-sucedida. Não receberei recompensa por bugs, mas isso não significa que foi tudo em vão. Combinando todas as pesquisas até agora e adicionando um pouco de cereja no topo, podemos criar um cenário onde podemos roubar a sessão do Telegram de alguém em apenas alguns segundos de acesso físico ao seu dispositivo, não importa se é seu computador, telefone ou tablet .

Começamos enviando “ztme” no aplicativo Telegram e tocando no link. Isso redirecionará o navegador para telegram.org/​#tgWebAuthToken=.... A partir daqui, editamos o domínio no navegador para telegramz.org– um domínio de minha propriedade – e pressionamos/tocamos em Enter. O javascript no meu domínio irá partir daqui, registrando um dos meus próprios dispositivos com o token.

Aqui está uma demonstração minha realizando todo o ataque em menos de 10 segundos em um telefone Android e um laptop:

Telegram web link security research demo from rebane2001 on Vimeo.

Observação: o YouTube removeu meu vídeo por violação das diretrizes da comunidade. Conteúdo educacional como esse é permitido, mas acredito que a equipe de revisão confundiu meu vídeo com um tutorial de hacking (provavelmente devido ao fato de as divisões ao vivo parecerem muito com instruções passo a passo). Eles também recusaram meu apelo. Você pode assistir a um mp4 simples , a um upload do Vimeo ou a esta postagem no Twitter .

Este ataque é incrivelmente fácil de executar, mesmo para um atacante com pouca habilidade. Supondo que algumas forças superiores já tenham configurado um domínio personalizado para você, tudo que você precisa saber é como tocar em um link e adicionar uma letra na barra de URL. Você não precisa de nenhuma ferramenta especializada, não precisa saber nada sobre o alvo, nem precisa de um telefone.

Então, o que o Telegram deve fazer sobre isso?

A mesma coisa que fizeram com os logins com código QR! Se você tentar fazer login em um novo dispositivo digitalizando um código QR de login, ainda precisará inserir sua senha 2FA – e acho que a mesma mitigação poderia ser implementada para esses URLs de clientes da web de login instantâneo.

  1. tdesktop é o cliente de desktop multiplataforma oficial (Telegram Lite no macOS) 
  2. url_auth_domainsé uma lista de domínios usados ​​para fazer login nos clientes da web, mas há outra lista sob a autologin_domainschave, que é usada para aplicativos da web como bugs.telegram.org
  3. Existem também campos peermsg_id, e button_id, mas se definirmos nosso flagcomo f_url(4), nós os ignoraremos.  

Por: lyra’s epic blog

Veja também:

Sobre mindsecblog 2571 Artigos
Blog patrocinado por MindSec Segurança e Tecnologia da Informação Ltda.

Seja o primeiro a comentar

Deixe sua opinião!