
Удалённое перечисление classpath в Java через десериализацию
EnumJavaLibs: удалённое перечисление classpath Java через десериализацию.
Обзор
EnumJavaLibs можно использовать для обнаружения того, какие библиотеки загружены (т.е. доступны в classpath) удалённым Java-приложением, если оно поддерживает десериализацию.
-----------------
Serially - v1.1
by Stefan Broeder
-----------------
Usage:
EnumJavaLibs {MODE} [OPTIONS]
MODES:
base64 Write base64 encoded serialized objects to CSV file in current directory
rmi {host} {port} RMI mode. Connect to RMI endpoint and try deserialization.
OPTIONS:
-f {string} Only serialize classes from packages which contain the given string (e.g. org.apache.commons)
-d Debug mode on
Дополнительную информацию об использовании инструмента см. в этой записи блога.
Получение jar-файлов
Требуется локальный репозиторий jar-файлов в ~/.serially/jars. Перед запуском EnumJavaLibs следует выполнить python3-скрипт JavaClassDB для индексации jar-файлов. Один из способов собрать локальный репозиторий — загрузить наиболее популярные Java-библиотеки из Maven Central. Я предоставляю скрипт getPopularJars.py, который можно использовать следующим образом:
./getPopularJars.py 20 | while read x; do wget --quiet -P ~/.serially/jars $x; sleep 5; done
Эта команда соберёт 20 самых популярных jar-файлов с mavenrepository.com.
Если вы используете Maven, другой способ начать наполнение локального репозитория — скопировать jar-файлы, уже имеющиеся в кэше Maven (~/.m2/repository).
RMI
Для тестирования RMI я создал docker-образ, который можно загрузить с [https://cloud.docker.com/repository/docker/summ1t/jmxrmi_vulnerable/general]; он поднимает хост, слушающий RMI на порту 1617. На нём работает Java 8u40, которая уязвима. В classpath загружена библиотека nanohttpd-2.2.0.jar, чтобы продемонстрировать, что EnumJavaLibs способен обнаружить эту библиотеку удалённо (при условии, что вы подготовили локальный репозиторий с этим jar-файлом).