
Ferramenta de exploração de vulnerabilidades de desserialização em Java com geradores de payload para múltiplos marshallers (Jackson, XStream, SnakeYAML) e indireção de referência JNDI para execução remota de código.
Se você veio aqui por causa do Log4Shell/CVE-2021-44228, talvez queira ler sobre os vetores de exploração e as versões afetadas do Java Runtime: https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/
Já se passaram mais de dois anos desde que Chris Frohoff e Garbriel Lawrence apresentaram suas pesquisas sobre vulnerabilidades de desserialização de objetos Java, resultando no que pode ser prontamente descrito como a maior onda de bugs de execução remota de código na história do Java.
A pesquisa sobre o assunto indicou que essas vulnerabilidades não são exclusivas de mecanismos tão expressivos quanto a serialização Java ou o XStream, mas algumas poderiam possivelmente ser aplicadas a outros mecanismos também.
Este artigo apresenta uma análise, incluindo detalhes de exploração, de várias bibliotecas Java de marshalling de código aberto que permitem(iam) o unmarshalling de tipos arbitrários fornecidos pelo atacante, e mostra que, não importa como esse processo seja realizado e quais restrições implícitas estejam em vigor, ele é propenso a técnicas de exploração semelhantes.
O artigo completo está em marshalsec.pdf
Todas as informações e códigos são fornecidos exclusivamente para fins educacionais e/ou para testar seus próprios sistemas quanto a essas vulnerabilidades.
Requer Java 8. Compile usando maven mvn clean package -DskipTests. Execute como
java -cp target/marshalsec-[VERSION]-SNAPSHOT-all.jar marshalsec.<Marshaller> [-a] [-v] [-t] [<gadget_type> [<arguments...>]]
onde
Geradores de payload para os seguintes marshallers estão incluídos:
Sem pré-requisitos.
Pré-requisitos:
O serviço a carregar está atualmente fixo (hardcoded) para javax.script.ScriptEngineFactory.
Pré-requisitos:
Pré-requisitos:
java -cp target/marshalsec-[VERSION]-SNAPSHOT-all.jar marshalsec.jndi.(LDAP|RMI)RefServer <codebase>#<class> [<port>]
Existem algumas propriedades de sistema que controlam os argumentos ao executar os testes (através do maven ou ao usar -a)
Os testes são executados com um SecurityManager instalado que verifica a execução de comandos do sistema, bem como código executado a partir de codebases remotos. Para que isso funcione, a classe carregada em uso deve acionar alguma verificação do security manager.
| Marshaller | Impacto do Gadget |
|---|
| BlazeDSAMF(0|3|X) | escalonamento apenas com JDK para serialização Java RCEs em várias bibliotecas de terceiros |
| Hessian|Burlap | RCEs em várias bibliotecas de terceiros |
| Castor | RCE em biblioteca de dependência |
| Jackson | possível RCE apenas com JDK, RCEs em várias bibliotecas de terceiros |
| Java | mais um RCE em biblioteca de terceiros |
| JsonIO | RCE apenas com JDK |
| JYAML | RCE apenas com JDK |
| Kryo | RCEs em bibliotecas de terceiros |
| KryoAltStrategy | RCE apenas com JDK |
| Red5AMF(0|3) | RCE apenas com JDK |
| SnakeYAML | RCEs apenas com JDK |
| XStream | RCEs apenas com JDK |
| YAMLBeans | RCE em biblioteca de terceiros |