da1ight
54 minutos atrás
Vote ou Perder: Análise de Phishing que Tenta Roubar Contas do Telegram
Média
13 min
2.9K
Segurança da Informação
*Caso
Isenção de responsabilidade: tudo abaixo é um caso real, os domínios e IPs não são fictícios. Não acesse esses sites a partir do seu navegador principal e, especialmente, com o Telegram logado.
- Ponto de entrada: mensagem às 5 da manhã
Uma notificação acorda você - 5:03. Mensagem no Telegram de um bom conhecido:
Olá UserName, posso pedir sua ajuda?
Uma criança de meus parentes - Maria Yankova - está participando de uma competição de desenhos infantis.
O prêmio é a oportunidade de obter uma bolsa de estudos.
Se você encontrar alguns minutos, por favor, vote em Yankova Masha
Aqui 👉
http://risk.fun-fix.shop/deti/lot
Obrigado! Passe para seus amigos 💓
Às cinco da manhã, de um conhecido. A própria mensagem é lida de forma vívida e humana, mas o olhar já se prende aos detalhes:
domínio
risk.fun-fix.shop
- bem, mais ou menos;
HTTP, não HTTPS, em 2026;
o final "passe para seus amigos" com um coração - isso é
autopropagação
: o autor do esquema quer que você adicione legitimidade ao link entre seus contatos;
às cinco da manhã, clicar em um link desconhecido do seu dispositivo principal - não é nada agradável.
Eu escrevo para o remetente em resposta - para tentar esclarecer o que é isso.
O remetente não responde: nem imediatamente, nem em uma hora, nem por outro canal. A imagem padrão - a conta aparentemente não é mais dele, e o invasor sentado lá não está interessado em explicar-se para contatos suspeitos.
Tudo bem, então vamos descobrir por nós mesmos.
- Primeiro curl, e surpresa - 403
Não é muito bom entrar em um site HTTP desconhecido às cinco da manhã a partir de um navegador, então a primeira ferramenta é o curl:
curl -vvv
http://risk.fun-fix.shop/deti/lot
\
-H “User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0”
Em resposta -
HTTP 403
e um conjunto interessante de cabeçalhos:
-
Tentando 94.26.35.126:80...
-
Conectado a
risk.fun-fix.shop
(94.26.35.126) porta 80
GET /deti/lot HTTP/1.1
..
< HTTP/1.1 403 Proibido
< Servidor: nginx
< Access-Control-Allow-Origin: *
< Set-Cookie: 7c7891ef8afa36f19f67ab826580b16a=YTo0OntpOjA7aTowO2k6MTtpOjE7aToyO2E6NTp7aTowO2k6MDtpOjE7aTowO2k6MjtpOjA7aTozO2k6MTtpOjQ7aTowO31pOjM7aToxNzc4MTU3MjI2O30%3D; expires=Thu, 07 May 2026 12:33:46 GMT; Max-Age=86400; path=/; HttpOnly; SameSite=None
403 + cookie com expires=+24h - isso não é "servidor caiu", isso é
cloaker / TDS
(Sistema de Distribuição de Tráfego) intencionalmente esconde o conteúdo de visitantes não direcionados. URL-decode -> base64-decode do valor do cookie dá PHP-serialize():
a:4:{i:0;i:0;i:1;i:1;i:2;a:5:{i:0;i:0;i:1;i:0;i:2;i:0;i:3;i:1;i:4;i:0;}i:3;i:1778157226;}
O que está neste array:
[0] = 0 // contador de visitas / flag de estado
[1] = 1 // flag "visto"
[2] = [0,0,0,1,0] // array de 5 flags de verificação (UA, Referer, JS, geo,...)
[3] = 1 778 157 226 // unix-timestamp, ~ +24h a partir do atual, expiração
O nome do cookie é um hash semelhante a md5, o formato é PHP-serialize(). Este é um filtro PHP escrito à mão ou pronto (tipo Keitaro/BlackTDS-like) que:
em cada entrada coloca um cookie com "suas próprias marcas de seleção";
com base nessas marcas de seleção, decide: entregar 200 + redirecionamento para a página de combate ou 403.
O fato de que os cookies são emitidos
mesmo em 403
, é normal: eles querem marcar a visita para que, em visitas subsequentes com a mesma combinação de IP+UA, nada útil seja exibido.
Por que meu curl recebeu 403, é claro: do ponto de vista do cloaker, ele se parece com um "veado do zoológico" - não há Accept-Language, não há Referer, Accept: /
, e o UA - Firefox 58 no Linux x86_64 em 2026.
Se você fingir ser um usuário móvel do Telegram, a página já é entregue normalmente:
curl -vvv '
http://risk.fun-fix.shop/deti/lot
' \
-H 'User-Agent: Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36' \
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8' \
-H 'Accept-Language: ru-RU,ru;q=0.9,en;q=0.8' \
-H 'Accept-Encoding: gzip, deflate' \
-H 'Referer: https://t.me/' \
-H 'Upgrade-Insecure-Requests: 1' \
-compressed -L
Agora o servidor está feliz e diz para onde ele realmente quer nos enviar.
- Redirecionamento de duas etapas
O bait-domain
não mostra nenhuma votação por si só
. Se o cloaker passou - um redirecionamento é emitido para um domínio turco:
GET /deti/lot HTTP/1.1
Host:
risk.fun-fix.shop
HTTP/1.1 302 Encontrado
Localização:
https://dobro-vesna.com.tr/help-vision/20
Esta é uma arquitetura típica de "bait + domínio de trabalho":
bait
risk.fun-fix.shop
é queimado por filtros de spam rapidamente, eles o mantêm com um provedor;
domínio de combate Telegram Web
dobro-vesna.com.tr
vive com outro, é uma pena perdê-lo.
E é exatamente por isso que eles têm
IPs e hospedagens diferentes
- vamos analisar isso na seção sobre infraestrutura.
Em
https://dobro-vesna.com.tr/help-vision/20
encontramos uma "página de votação para um desenho infantil" lindamente estilizada.
Um monte de classes de ruído, blocos ocultos com texto irrelevante, declarações CSS conflitantes - tudo para que os scanners automáticos não se prendam às palavras-chave. O botão "VOTAR" é apenas um gatilho para a próxima transição:
<button
class=“dxtyavbk_vBRxZ dxtyavbk_AUTu dxtyavbk_yHtcLzZN dxtyavbk_ZLlb”
dxtyavbk_RQTfTfrV dxtyavbk_woqw dxtyavbk_zMVXRa dxtyavbk_ttNr’
data-columns=“dxtyavbk_LZfiWut”>
VOTAR
Clicou - fomos para /help-vision/D5oRKcN. E aqui as coisas ficam interessantes.
- Clone do Telegram Web
Em /help-vision/D5oRKcN, encontramos uma cópia pixel a pixel do Telegram Web com a tela de login por número. Design, fontes, animação do logotipo - tudo como o original.
Se você inserir qualquer número (mesmo um inexistente) - a página começa a carregar um grande pacote JS ofuscado e registrar um service worker.
E aqui não é mais "um formulário falso com POST em /steal.php". Isso é
um fork do Telegram Web real
(cliente tweb/webK-like), colado na infraestrutura dos invasores. Há evidências suficientes no código.
3.1. Nomes de cache - um para um
O Telegram Web usa um conjunto característico de nomes de Cache Storage. Em DevTools → Application → Cache Storage e, paralelamente, no código do service worker:
const CACHES = [
'cache_assets',
'cache_documents',
'cache_stream_chunks'
];
cache_stream_chunks - esta é uma coisa de nicho: é assim que o cache para o carregamento progressivo de chunks de mídia é chamado no Telegram Web. Esse nome não aparece aleatoriamente em outro projeto.
3.2. O mesmo protocolo MessageChannel entre a página e o SW
No tweb original, a página se comunica com o service worker via postMessage com tipos estritamente definidos: requestFilePart, pushClick, pushPing, notificationsClear e assim por diante. No pacote em
dobro-vesna.com.tr
- exatamente o mesmo protocolo, apenas os nomes das funções internas são minificados:
self.addEventListener(“message”, e => {
const o =
e.data
;
switch (o.type) {
case “requestFilePart”:
Qi(
o.id
, o.dcId, o.location, o.offset, o.limit);
break;
case “pushClick”:
cr(o);
break;
case “pushPing”:
mr(o);
break;
case “notificationsClear”:
gr();
break;
}
});
Compare com a forma como isso é feito no cliente real (simplificado):
self.addEventListener('message', event => {
const { type, payload, id } = event.data;
if (type === 'requestFilePart') {
requestFilePart(id, payload.dcId, payload.location, payload.offset, payload.limit);
} else if (type === 'pushClick') {
onPushClick(payload);
}
});
A assinatura requestFilePart(id, dcId, location, offset, limit) é literalmente um "contrato" público entre a página e o SW em tweb. A coincidência nas posições e semântica dos argumentos não é "inspirada", é o mesmo código.
3.3. Streaming progressivo via /progressive/{dcId}/...
No cliente original, o fetch-handler do SW aprende os URLs "seus" pelo prefixo /progressive/, analisa deles dcId e location, vai atrás dos chunks. No pacote dos invasores - a mesma técnica:
self.addEventListener(“fetch”, e => {
const u = new URL(e.request.url);
if (u.pathname.startsWith(“/progressive/”)) {
e.respondWith(vr(e));
return;
}
//... outras ramificações...
});
async function vr(e) {
const [,, dcId, fileId,...rest] = new URL(e.request.url).pathname.split(“/”);
// em seguida - uma chamada para Qi() / br() com os mesmos dcId/location/offset/limit
}
Esta é uma cópia direta da arquitetura de streaming de mídia do Telegram Web.
3.4. As mesmas dependências WebAssembly
No pacote, os módulos são inicializados com as assinaturas do decodificador opus e do manipulador de formas de onda de voz - exatamente o que o tweb usa (opusDecoder, rlottie, libwebp). Um site de phishing aleatório não precisa desses módulos; eles são necessários para um cliente que realmente pode reproduzir voz e adesivos.
3.5. O que isso dá ao invasor
O principal significado de toda essa confusão não é "desenhar um formulário bonito", mas proxy
o fluxo MTProto real
: a interface realmente funciona: você recebe um código real do Telegram (porque o invasor o solicitou com um cliente real, que é ele mesmo);
você insere o código e a senha 2FA - o invasor recebe
uma sessão válida
, não uma string "+7...";
depois de fazer login com sucesso, o navegador se comporta "como de costume", a vítima não vê nada suspeito - e o invasor já está em sua conta em seu dispositivo; a primeira coisa que ele faz com uma conta roubada às 5 da manhã, horário local do contato, é enviar a mesma mensagem sobre a competição infantil para a lista de contatos.
O círculo está fechado.
- Onde a infraestrutura vive
Em seguida - arqueologia whois comum. Temos
duas hospedagens diferentes
, porque o bait e o domínio de combate têm IPs diferentes.
4.1. Bait-domain
risk.fun-fix.shop
$ dig +short A
risk.fun-fix.shop
94.26.35.126
O mesmo PHP-cloaker da seção 1 está aqui. De acordo com o whois, o bloco de IP se parece com isso:
inetnum: 94.26.35.0/24 (SUB-ALLOCATED PA, country CH)
route: 94.26.35.0/24 origin AS51852
created: 2026-01-19 (sub-alocação emitida há 4 meses)
org: SINO WORLDWIDE TRADING LIMITED (HK, shell-company)
mnt-by: lir-bg-telco-1-MNT
mnt-ref: MNT-NETERRA, bg-sofcompany-1-mnt, mnt-bg-eurocrypt-1
abuse-c: ACRO62035-RIPE
Em outras palavras: formalmente uma faixa suíça, emitida para uma shell-company de Hong Kong, atendida por LIRs búlgaros e maintainers relacionados à Neterra. Tudo isso foi feito no final de 2025 - início de 2026, claramente para a campanha atual. Este é um perfil típico de uma sub-rede alugada no estilo bulletproof, onde o "hoster" muda como luvas.
O abuse-email real é obtido por uma solicitação separada:
whois -h whois.ripe.net ACRO62035-RIPE
- e use-o como o endereço primário da reclamação sobre o bait-IP.
4.2. Domínio de combate
dobro-vesna.com.tr
$ dig +short A
dobro-vesna.com.tr
178.16.54.9
Whois por domínio (.tr, registro TRABIS):
Domain Name:
dobro-vesna.com.tr
Status: Ativo
Registrar: ATAK DOMAİN BİLGİ TEKNOLOJİLERİ A.Ş. (TR)
Nameservers:
julio.ns.cloudflare.com
kayleigh.ns.cloudflare.com
Criado: 2025-11-16
Expira: 2026-11-15
Registrante: Oculto mediante solicitação do usuário
Whois por IP:
inetnum: 178.16.54.0 - 178.16.54.255
netname: OMEGATECH
country: NL
org: Omegatech LTD (Seychelles)
abuse-c: abuse@omegatech.sc
route: 178.16.54.0/24 AS202412
O detalhe mais interessante é
a ausência de um proxy cloudflare antes da origem
. Os NS do domínio pertencem ao Cloudflare ( julio.ns.cloudflare.com , kayleigh.ns.cloudflare.com ), mas a entrada A retorna
o IP direto da Omegatech
- 178.16.54.9. Se o tráfego passasse pelo proxy CF, o endereço dos intervalos do Cloudflare (como 104.16/12 ou 172.64/13) retornaria, e não o cliente. Ou seja, o Cloudflare aqui é apenas hospedagem DNS, sem a nuvem laranja, e
a origem real não está escondida
.
Para nós, isso é conveniente: você pode reclamar diretamente ao hoster, sem se deparar com o padrão "somos apenas CDN, entre em contato com a origem".
4.3. Mapa final da infraestrutura
Resumido por destinatários de reclamações:
domínio bait:
risk.fun-fix.shop
, IP 94.26.35.126, AS51852, shell-company SINO WORLDWIDE TRADING (HK), serviço - LIR búlgaro / Neterra, domínio de combate:
dobro-vesna.com.tr
- registro .tr (TRABIS), registrador ATAK Domain, NS Cloudflare,
origem de combate: 178.16.54.9, Omegatech LTD (Seychelles), netname OMEGATECH, AS202412.
- Como analisar essas coisas por conta própria
O conjunto mínimo para auto-depuração de qualquer "votação" semelhante:
Primeiro curl, não um navegador.
Se você recebeu 403 + cookie - não feche, analise o cookie. Muito frequentemente, no formato php_serialize / JSON / base64, há uma estrutura pronta "o que o cloaker verificou"; já a partir disso, você pode ver o que está acontecendo.
Um perfil de navegador separado ou VM.
Nenhuma sessão salva do Telegram, bancos e e-mail. Dentro - UA móvel e Accept-Language: ru-RU.
DevTools → Application → Service Workers.
Se um SW estiver registrado na página - grave o URL inteiro, este já é um artefato de infraestrutura.
Application → Cache Storage.
Nomes como cache_assets, cache_documents, cache_stream_chunks são um sinal quase 100% de um fork do Telegram Web. Dentro - URLs reais de ativos e APIs.
Network → Fetch/XHR + WS, ative "Mostrar solicitações do Service Worker".
Insira um número falso, veja para onde a primeira solicitação vai. Um canal WS para algo como wss://
dig + whois
por ambos os domínios e IP. Se A não retornar um intervalo do Cloudflare - a origem está aberta, vá diretamente para o hoster. Se o bloco de IP foi sub-alocado recentemente e está em uma mistura de HK-shell + BG/LV-maintainers - este já é um red-flag independente.
Parece que leva alguns minutos - e você tem um perfil completo do invasor: infra bait, infra de combate, IP, hosters, registrador, registro, provedor de NS.
- Para onde enviei as reclamações
Para que tudo isso não permaneça "bem, eu olhei e fechei", é útil tirar metodicamente a sujeira da cabana para todas as instâncias que têm uma alavanca. A prioridade é quem realmente pode desligar a infraestrutura:
Hoster origin (Omegatech) - abuse@omegatech.sc. Neste caso, ele também é o principal destinatário, porque a origem está aberta.
Hoster bait-IP 94.26.35.126 - abuse-mailbox do handle ACRO62035-RIPE (obtemos whois -h whois.ripe.net ACRO62035-RIPE), além dos maintainers búlgaros como destinatários indiretos: MNT-NETERRA (Neterra Communications, BG) - abuse@neterra.net / forma https://www.neterra.net/abuse, lir-bg-telco-1-MNT - abuse-mailbox daquele LIR (por handle), upstream AS51852 - levantar abuso via peeringdb.com/asn/51852.
Na carta, enfatizamos explicitamente o servidor cloaker: citamos Set-Cookie com PHP-serialize e o fato de 403/200 dependendo do UA - esta é uma prova direta de que a orientação de abuso é configurada no lado do servidor, e não "nossa página foi hackeada".
Cloudflare - forma https://abuse.cloudflare.com/phishing e abuse@cloudflare.com. Eles não são CDN aqui, mas apenas hospedagem DNS, mas ainda podem parar de atender o domínio.
Registrador dobro-vesna.com.tr - ATAK Domain, abuse@atakdomain.com (+ info@, destek@). Eu peço clientHold sob as obrigações ICANN/TRABIS.
Registro .tr - TRABIS / BTK: trabis@btk.gov.tr, além de contatos da IANA (onur.gencer@btk.gov.tr, gokhan.usta@btk.gov.tr).
Registrador fun-fix.shop (whois por domínio) - por carta separada com a mesma lógica.
CERT da Turquia (USOM) - bildirim@usom.gov.tr e forma usom.gov.tr/ihbar.
Telegram - @notoscam no próprio mensageiro e abuse@telegram.org.
Listas anti-phishing (para que Chrome/Firefox/Safari comecem a mostrar "Site enganoso"):
Google Safe Browsing - safebrowsing.google.com/safebrowsing/report_phish/
PhishTank - phishtank.org/add_web_phish.php
Netcraft - report.netcraft.com/report
APWG - reportphishing@apwg.org
Modelo de carta com a qual é conveniente bombardear todos de uma vez (resumidamente):
Assunto: Relatório de phishing: dobro-vesna.com.tr (roubo de credenciais do Telegram) - IPs 178.16.54.9 / 94.26.35.126
Domínio bait: http://risk.fun-fix.shop/deti/lot (IP 94.26.35.126, AS51852)
Domínio de phishing: https://dobro-vesna.com.tr/help-vision/20 https://dobro-vesna.com.tr/help-vision/D5oRKcN
Origem de phishing: 178.16.54.9 (NÃO atrás do proxy Cloudflare)
Hospedagem / Titular do IP: Omegatech LTD (RIPE: OMEGATECH, AS202412)
Titular do IP bait: SINO WORLDWIDE TRADING LIMITED (shell HK), sub-alocado 2026-01-19, BG LIR + MNT-NETTERA
Nameservers: julio.ns.cloudflare.com, kayleigh.ns.cloudflare.com
Registrador: ATAK Domain (TR)
Registro: .tr / TRABIS (BTK)
O host bait opera um cloaking/TDS baseado em PHP que redireciona seletivamente visitantes móveis RU-locale que chegam do Telegram para a página de phishing em dobro-vesna.com.tr; solicitações não direcionadas são respondidas com HTTP 403 para evitar a detecção automatizada. A página de phishing personifica o Telegram Web e rouba números de telefone, códigos de login e senhas 2FA executando um service worker do Telegram Web modificado que faz proxy do fluxo de autenticação MTProto através da infraestrutura controlada pelo invasor.
Por favor, suspenda / null-route o host, suspenda o domínio e preserve os logs (acesso HTTP, autenticação, cobrança, registro, método de pagamento) para qualquer solicitação futura de aplicação da lei.
A versão completa da carta com justificativa e evidências - separadamente para cada destinatário.
- O que fazer se você já inseriu dados
Se, em alguma etapa, o código ou a senha 2FA ainda passou:
Telegram → Configurações → Dispositivos → Encerrar todas as outras sessões.
Imediatamente.
Mude a senha da nuvem (2FA) em Privacidade e Segurança.
Verifique as Sessões Ativas novamente em 5 minutos - o invasor pode tentar entrar novamente.
Visualize Mensagens Salvas, chats secretos, bots vinculados, direitos em grupos de administração - especialmente aqueles onde você é um administrador.
Avise os contatos: a mesma "votação" pode já ter saído em seu nome.
- Conclusões breves
O phishing moderno no Telegram não é "insira sua senha", mas
um fork completo do cliente
com proxy MTProto e Service Worker. Isso explica por que tudo parece tão convincente e realmente envia um código para você.
Antes da página de combate, muitas vezes há um
TDS / cloaker separado
em uma hospedagem de terceiros, que filtra o tráfego e esconde o phishing de scanners. O próprio fato de sua presença é uma prova independente de más intenções, e isso precisa ser incluído nas cartas de abuso.
Para essas campanhas agora
blocos /24 frescos são alugados de bulletproof-LIRs
(shell HK, serviço BG), emitidos 1-3 meses antes do lançamento. Se no whois o bloco de IP for mais jovem que 6 meses e estiver em uma mistura búlgara/letã/hong kong de maintainers - este já é um red-flag independente, mesmo antes da análise do conteúdo.
O ponto de entrada é um
contato confiável
e não uma mala direta suspeita. Portanto, a única heurística confiável é olhar para o domínio e para o próprio cenário ("entre no Telegram para votar"), e não para o remetente.
Qualquer site que peça para inserir um número do Telegram ou um código do Telegram "para votar em alguém / receber um presente / confirmar a participação" é phishing. Não há outras interpretações.
Tecnicamente, esses casos são analisados em 10 minutos curl + DevTools + dig + whois, e isso resulta em um conjunto de destinatários que podem realmente derrubar a infraestrutura.
Se você recebeu essa mensagem - não fique em silêncio. Tente entrar em contato com o remetente por outro canal ("você acabou de enviar um link, sua conta foi roubada"), relate para @notoscam e percorra a lista acima. Quanto mais reclamações paralelas, mais rápido o domínio e a hospedagem dos invasores queimam - e menos vítimas subsequentes.
Cuide de suas sessões. E passe para seus amigos 💓 - mas não o link, mas este artigo.
Tags:
phishing telegram
roubo de conta do telegram
scam telegram
telegram phishing
telegram account takeover
phishing analysis
análise de phishing
phishing
phishing
Hubs:
Segurança da Informação
+14
2
4
2
Karma
@da1ight
Usuário
Inscrever-se
Fluxo Segurança da Informação disponível 24 horas por dia, 7 dias por semana, graças ao apoio dos amigos do Habr
Habr Cursos para todos
PUBLICIDADE
Prática, Hexlet, SkyPro, cursos do autor - reunimos todos e pedimos descontos. Resta escolher!
Ir
Ir para o fluxo de Segurança da Informação
Comentários 4
Melhor do dia
Semelhante
Mostrar o melhor de todos os tempos






