1С-Битрикс — одна их самых популярных систем CMS. Включает в себя много интересных решений, начиная от сайта визитки, заканчивая высоконагруженными системами. Мы часто встречаем во время пентестов данный продукт и отмечаем, что большинство обнаруживаемых проблем безопасности можно увидеть в самописных модулях, а не в самом ядре Битрикса. Однажды, анализируя защищенность одной системы, построенной на основе коробочного решения, мы задетектили ряд любопытных уязвимостей. Жаль, но про все рассказывать нельзя, а вот про удаленное выполнение кода и повышение привилегий на сервере — уже можно.
Кстати, разработчики RCE исправлять отказались.
Вредоносный кот
Если вы знакомы с интеграцией Битрикса и 1С Бухгалтерией, то наверняка встречали скрипт под названием “1c_bx_import.php”. Если коротко: это отладочный скрипт для диагностики, подробнее с его возможностями можно ознакомиться по ссылке от разработчиков. Помимо ряда специфичных действий, он реализует возможность скачивать и загружать файлы на сервер, распаковывать архивы, удалять произвольные файлы.
Ситуация с данным скриптом неоднозначная: со слов разработчиков, он не является официальной частью CMS, однако расположен на ресурсах компании и иногда используется технической поддержкой для решения проблем клиентов. В конечном счете это означает, что его вполне можно встретить на различных ресурсах, порой прямо в корне сайта. Разработчик честно указал, что пользоваться данным изделием следует только на свой страх и риск, но юзеры наверняка считают, что все безопасно и хорошо, ведь в скрипте присутствует аутентификация и авторизация. К сожалению, это не совсем так.
Давайте посмотрим, как в скрипте реализована аутентификация:
if ((@$_REQUEST['mode']!='query' && @$_REQUEST['mode']!='exchange'))
define('NEED_AUTH',true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
Скорее всего, изначально задумывалось, что если в URI параметр “mode” равен “query” или “exchange”, то пользователю отдается форма логина, и работа скрипта завершается. Однако, если присмотреться внимательно, то можно заметить, что в логические операторы вкралась ошибка. Получилось ровным счетом наоборот: аутентификация будет запрошена только если “mode” не равен «query» или «exchange»!
Теперь проверим, что в скрипте с авторизацией. Разработчик предполагал, что скрипт должен выполняться только у администраторов:
if ((!$USER->IsAdmin())&&(@($_GET['mode']!='query')))
{
echo 'Доступ запрещён. Вы не администратор сайта. До свидания.';
localredirect("/404.php");
}
Если не будут выполнены оба условия, выполнение скрипта закончится. Давайте посмотрим еще раз внимательно:
Если пользователь не администратор, и если mode не равен query, то вывести «Доступ запрещен».
Получается, можно не быть администратором, первое условие не будет истинным, в секцию «Доступ запрещен» мы не попадаем, а скрипт успешно продолжит работу. Выходит, что если анонимный пользователь укажет в качестве параметра «mode» значение «query», ему станут доступны все действия внутри скрипта (за выбор типа функции отвечает параметр «action»). Учитывая, что функциональность файла позволяет скачивать файлы с сервера и загружать их в произвольную директорию, публичный доступ к данному скрипту является весьма большой угрозой для безопасности.
Полный список команд, доступных для выполнения:
- createfile — создание файла с текстом “success” по заданному пути
- setsession — добавление произвольной Cookie в текущую сессию пользователя
- createiblocktypeform — создание типа инфоблока
- download — скачивание произвольного файла с сервера
- xmlgetinfo — скачивание произвольного файла с сервера
- deletefile — удаление произвольного файла с сервера
- getfile — получение списка файлов на сервере
- unzip — распаковка архива
- upload — загрузка файла в произвольную директорию
- search — поиск файла на сервере
- show_bxmltree — вывод структуры директории в виде xml-файла
Вот, например, запрос, позволяющий скачать конфигурационный файл, содержащий учетную запись для доступа к базе данных:
А таким запросом злоумышленник может получить листинг файлов на сервере:
Можно, наконец, и произвольный код загрузить:
Про уязвимость мы сообщили как клиенту, так и разработчикам CMS. К сожалению, разработчики Битрикса исправлять ошибку отказались, поскольку данный скрипт не является официальным компонентом CMS, как уже было отмечено выше.
Локальное повышение привилегий
Разработчики 1C-Битрикс Веб-кластера допустили ошибку, которая позволяет получить привилегии суперпользователя (root) на всех серверах кластера, обладая доступом к системному пользователю bitrix на одном из серверов кластера.
В 1C-Битрикс Веб-кластер используется система управления серверами Ansible, аутентификация между серверами осуществляется посредством SSH-ключей. Доступ к файлам ключей есть только у суперпользователя. Для того, чтобы Ansible мог прочитать ключи и выполнять команды на удаленных серверах, применяется утилита sudo, повышающая привилегии до пользователя root.
Установщик кластерной системы добавляет следующую строку в файл конфигурации команды sudo /etc/sudoers:
bitrix ALL=NOPASSWD: /usr/bin/ansible * -m setup
Вместо символа звездочки скрипты системы подставляют имя сервера в кластере.
Утилита sudo ищет вхождения подстроки в строку, а не разделяет аргументы, как это было бы в случае системных команд класса execv. Символ звездочки в строке выше позволяет вставить произвольное количество символов, которые будут разделены на отдельные аргументы. Поэтому повысить свои привилегии можно легко одной командой:
$ sudo /usr/bin/ansible 127.0.0.1 -m shell -a 'whoami; echo -m setup'
127.0.0.1 | success | rc=0 »
root
-m setup
bitrix@test: ~
Для самого sudo аргументы выглядят следующим образом:
["sudo", "/usr/bin/ansible", "127.0.0.1", "-m", "shell", "-a", "whoami; echo -m setup"]
И это соответствует написанному разработчиками правилу sudoers. С данной уязвимостью разработчики согласились, и на текущий момент она уже исправлена.
Вывод
Что мы получаем в итоге? Уязвимости достаточно просты и не требуют специфических условий для эксплуатации.
Перечислим наши действия при поиске возможностей для получения контроля над тестируемым сайтом:
- Определяем хост, запускаем процедуру подбора файлов и директорий (dirbuster).
- Встретился “bx_1c_import.php”. Скачиваем исходники с сайта разработчика для анализа.
- Найдена возможность скачивать произвольные файлы с сервера.
- Первостепенно скачиваем конфигурационный файл для доступа к БД — dbcon.php. Увы, MySQL ждет подключений только с “localhost”. Анализируем исходники дальше.
- Найдена возможность загружать собственный код. Получаем бэкконнект на наш сервер, однако, текущий пользователь, под которым запущен веб-сервер и от имени которого мы работаем, имеет ограниченный набор прав.
- В результате анализа тестируемого хоста становится ясно – это целый кластер. Да и не стали бы делать интеграцию с 1С у сайта-визитки.
- Изучаем возможность взаимодействия с “Ansible”.
- Повышаем привилегии до root уже на всем кластере.
- …
- Ищем новые уязвимости.
Комментарии (25)
Alex77761
11.04.2017 10:05Если Битрикс франкинштейн, то что вы считаете «Современными CMS»?
my_username
11.04.2017 15:52-1Например MODx. Как минимум в плане удобства администрирование контента он уделывает Битрикс, что называется, по всем статьям.
WolfTheGrey
11.04.2017 16:21-2Холивар-холиваром по поводу называть Битрикс CMS или нет. Но заголовок в корне неудачен. Сколько человеко-часов уже потеряно на изучение данной статьи, хотя бы по диагонали и понимание что тут не то, что ожидается?
AlexSerbul
11.04.2017 21:13+2Добрый вечер!
Во-первых. Скрипт, о котором идет речь в публикации ?—?специализированный код. Он был написан техподдержкой «1С-Битрикс» для быстрой диагностики проблем. А точнее?—?вопросов по работе с «1C». Скрипт эмулирует работу «1С» и отправляет диагностические данные в техподдержку. Фактически?—?это утилита. По инструкции скрипт УДАЛЯЕТСЯ после использования.
Во-вторых. Ссылка в публикации вела на пост от 24 октября 2010 года. Скрипт не используется в системе «1С-Битрикс» уже несколько лет.
Команда «1С-Битрикс» благодарит авторов статьи за трудную работу в архивах. К сожалению, текст не имеет отношения к текущей реальности.
Все написанное выше — официальная позиция компании «1С-Битрикс». Спасибо.
TigerClaw
11.04.2017 23:04-1Я конечно понимаю что хейтить битрикс это модно. Но во-первых шанс встретить сейчас на современном сайте данный скрипт практически равен нулю и намного меньше чем других скриптов забытых разработчиками и позволяющих начать планировать атаку на ресурс. Так что правило простое, в продакшене удалять все служебные скрипты. Во-вторых обмен давно уже много раз переделан. Он уже не такой кривой как 7 лет назад, потребность в скрипте в настоящее время отсутствует, более того судя по комментам в актуальной версии битрикса и модуля обмена он не работает.
kotomyava
12.04.2017 10:18+2Не то, что это модно — это просто.
Продукт технически отвратительный, всегда можно найти к чему придраться, зато пиара масса. Только ленивый не пнёт несчастных бракоделов, которые так громко расхваливают своё поделие.
Кто-то просто из желания потролить, а кто-то от того, что читать дифирамбы откровенно слабому продукту уже мочи нет.
По поводу обсуждаемого в статье: вытащить на свет какую-нибудь серьёзную уязвимость, которую можно массово эксплуатировать прямо сейчас, было бы очень не красиво по отношению к пользователям продукта. А показать как бывает не хорошо всё, стоило. Имхо, всё очень правильно сделано автором.
DeLuxis
Надо заголовок изменить на: Техподдержка уязвимостей: Битрикс. Часть 1
Нельзя сравнивать франкинштейна созданного маркетологами с современным CMS.
navistarsys
Соглашусь с Alex77761, Битрикс местами конечно еще то полено, но на данный момент я не вижу ни одного достойного аналога под ИМ. Хотя цена за лицензию кусается неплохо…
kotomyava
Простите, а как же какой-нибудь Magento?
А если нужно попроще, так по мне, даже Opencart куда более годная платформа для магазина чем Битрикс.
edogs
vanxant
Ну, 3/4 и битрикс не отстегивает.
edogs
imho для крупных партнеров у битрикса индивидуальные условия, которые разглашать нельзя, а может даже и отрицать надо:)
Отвечать головой за 3/4 не будем, но при открытых данных о 50% для стандартных партнерах не видим ничего удивительного в 75%или больше на индивидуальных условиях.
Благо это собственно самый сильный продажный инструмент битрикса, из-за которого с защищающими его адептами даже спорить смысла нет, ввиду того что им за это платят, а их оппонентам нет:)
vanxant
Да понятно, пусть даже 70% от 15900 (самая ходовая редакция Стандарт) или 35900 (редакция Малый бизнес, т.е. обычный интернет-магазин), из которых для крупных партнёров как минимум половину заберёт государство в виде прямых и косвенных налогов, — эти безумные суммы, конечно, решают.
Да, есть редакция энтерпрайз с пятизначным ценником, но это действительно единичные внедрения, и там общая стоимость владения сайтом легко за 7 знаков переваливает. В любом случае, это истории про крупный бизнес, который готов платить вендорам за расширенную поддержку mission-critical систем.
vanxant
В наших реалиях ИМ предполагает не только витрину и корзину, но также платежный модуль какого-нибудь «газмясбанка», расчет доставки службой «копытаэкспресс» и да, интеграцию с 1С в конфигурации «Петрович и его велосипедисты». Когда это будет «искаропки» в «других» CMS, причем с поддержкой и обновлениями, а не заброшенный драфт-проект на гитхабе, тогда можно будет о чем-то разговаривать.
И все равно, потом депутаты выпустят очередной закон про какие-нибудь «онлайн-че-то-там» со сроком исполнения «вчера», и начинай сначала.
kotomyava
Этого нет и в битриксе.
Никакой мифической лучшей чем в любой другой CMS связи с 1с там нет.
Платёжные модули для наших банков и агригаторов есть для всех распространённых платформ, а если экзотика и нет готового, это надо дописывать, что для Битрикса, что для чего-то другого и для другого будет с огромной вероятностью дешевле и проще, кстати.
kucheriavij
Из коробки даже битрикс этого не делает. Битрикс из коробки с 1С синхронизируется только если сам 1С из коробки без конфигураций. Платежные системы надо допиливать, да практически все допиливать надо. Модуль каталога в последней реализации наикривейший. Так что смысл существования битрикса я вообще не понимаю
vanxant
Не спорю, что в битриксе много чего нужно допиливать, но вот конкретно для интернет-магазинов допиливать нужно в разы меньше, чем для любой другой известной мне CMS. Как ни крути, а модули под Битрикс есть почти для всего — банков, служб доставки, CRM, бухгалтерского софта и прочая, прочая. И они, в целом, работают. Просто потому, что их не просто для галочки выпустили, а ими пользуются на реальных проектах.
Интересно, чем вам модуль каталога не угодил? Он вполне сносно работает это раз, в том числе наконец-то! нормальные фасетные индексы. И он не завязан на интернет-магазин это два. Т.е. вы вообще можете снести модуль каталога, если он вам так не нравится, и иметь абсолютно рабочий интернет-магазин вокруг своего велосипеда (например, если вы собираете оплату за услуги типа ЖКХ)
kucheriavij
Лично я года 3 уже не прикасаюсь как к битриксу, так и к коробочным системам. И бесконечно рад этому, и сейчас я понимаю что одну и ту же выборку на yii я делаю гораздо быстрее чем на битриксе, при этом код изящней, и работает лучше, хотя года 4 назад я бил себя пяткой в грудь и говорил что лучше чем битрикс ничего нет.
По поводу каталога, коллега с работы буквально несколько дней назад возился с ним, оказывается при ajax добавлении в корзину криво создается json, который на отрез отказывается парситься на ios устройствах
vanxant
Т.е. D7 вы не видели, но выборку делаете гораздо быстрее (кстати и в старом апи, если его таки выучить, а не заниматься stack overflow программированием, любая выборка пишется 15 секунд).
А ещё вам друг сказал, что в Safari/iOS, оказывается, бывают баги.
Ну ок, ок, спасибо что поделились своим объективным и обоснованным мнением.
kotomyava
Конечно, ведь там, небось, нормально под конкретную задачу спроектированная база, нет ничего лишнего в структуре хранения и получаются вполне хорошие и эффективные запросы-то.
seedspro
-= смысл существования битрикса =
а чем(?) вы предложите торговать? конечно со смыслом.