Compartilhando um link vindo pelo @joaovitormaia

https://blog.babelo.xyz/posts/cross-site-subdomain-leak/


O artigo demonstra um ataque chamado XSS-Leak que vaza subdomínios e redirecionamentos de outros sites em navegadores baseados no Chromium. Ele explora uma característica do gerenciamento de conexões do Chrome: quando duas requisições de mesma prioridade competem pelo último socket disponível, o navegador executa primeiro a que tiver o host lexicograficamente menor (ex: a.com antes de `b.com`).

O exploit funciona da seguinte forma:
1. O atacante usa um script para ocupar 255 dos 256 sockets de conexão do navegador, deixando apenas um livre. Isso é feito com a função exhaust_sockets().
2. A página da vítima é acionada para fazer uma requisição a um subdomínio secreto que se deseja vazar (ex: `http://<flag_secreto>.alvo.com`).
3. Imediatamente, o atacante faz uma requisição de teste para um subdomínio que ele controla e está tentando adivinhar (ex: `http://<palpite>.atacante.com`).
4. As duas requisições (da vítima e do atacante) competem pelo último socket livre.
5. Ao medir o tempo de resposta da sua própria requisição, o atacante descobre qual foi executada primeiro. Se a requisição do atacante foi rápida, significa que seu subdomínio <palpite> é lexicograficamente menor que o <flag_secreto>.
6. Esse processo é repetido em uma busca binária, caractere por caractere, até vazar o subdomínio completo.

O código central do ataque realiza essa comparação:


async function test(leak, w, threshold){
    // ... setup ...
    // Aciona a requisição da vítima para o subdomínio secreto
    w.location = `${TARGET}#b`;
    await sleep(100);
    
    // Testa um caractere (`mid`) para o subdomínio
    let mid = charset[midIndex];
    let promise1 = fetch_leak(leak + mid, threshold); // Requisição do atacante
    
    await sleep(100);
    res_blocker_controller.abort(); // Libera um socket para a competição começar
    
    // Verifica qual requisição terminou primeiro para ajustar a busca binária
    let is_lower = !(await promise1);
    // ...
}


Usando essa técnica, o autor demonstrou vazar o flag flag{gj2e4syr1ght?} em 70 segundos. O mesmo método é aplicado para descobrir o destino de um redirecionamento, permitindo identificar se um usuário é admin ou user com base no subdomínio para o qual ele é redirecionado após o login.
 
 
Back to Top