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. С данной уязвимостью разработчики согласились, и на текущий момент она уже исправлена.

Вывод


Что мы получаем в итоге? Уязвимости достаточно просты и не требуют специфических условий для эксплуатации.

Перечислим наши действия при поиске возможностей для получения контроля над тестируемым сайтом:

  1. Определяем хост, запускаем процедуру подбора файлов и директорий (dirbuster).
  2. Встретился “bx_1c_import.php”. Скачиваем исходники с сайта разработчика для анализа.
  3. Найдена возможность скачивать произвольные файлы с сервера.
  4. Первостепенно скачиваем конфигурационный файл для доступа к БД — dbcon.php. Увы, MySQL ждет подключений только с “localhost”. Анализируем исходники дальше.
  5. Найдена возможность загружать собственный код. Получаем бэкконнект на наш сервер, однако, текущий пользователь, под которым запущен веб-сервер и от имени которого мы работаем, имеет ограниченный набор прав.
  6. В результате анализа тестируемого хоста становится ясно – это целый кластер. Да и не стали бы делать интеграцию с 1С у сайта-визитки.
  7. Изучаем возможность взаимодействия с “Ansible”.
  8. Повышаем привилегии до root уже на всем кластере.
  9. Ищем новые уязвимости.
Поделиться с друзьями
-->

Комментарии (25)


  1. DeLuxis
    11.04.2017 09:07
    +5

    Надо заголовок изменить на: Техподдержка уязвимостей: Битрикс. Часть 1

    Нельзя сравнивать франкинштейна созданного маркетологами с современным CMS.


    1. navistarsys
      11.04.2017 15:15
      +1

      Соглашусь с Alex77761, Битрикс местами конечно еще то полено, но на данный момент я не вижу ни одного достойного аналога под ИМ. Хотя цена за лицензию кусается неплохо…


      1. kotomyava
        11.04.2017 15:30

        Простите, а как же какой-нибудь Magento?

        А если нужно попроще, так по мне, даже Opencart куда более годная платформа для магазина чем Битрикс.


        1. edogs
          11.04.2017 15:46

          Простите, а как же какой-нибудь Magento?
          Магенто не отстегивает партнерам до 3/4 цены лицензии:)


          1. vanxant
            11.04.2017 15:50

            Ну, 3/4 и битрикс не отстегивает.


            1. edogs
              11.04.2017 19:12

              imho для крупных партнеров у битрикса индивидуальные условия, которые разглашать нельзя, а может даже и отрицать надо:)
              Отвечать головой за 3/4 не будем, но при открытых данных о 50% для стандартных партнерах не видим ничего удивительного в 75%или больше на индивидуальных условиях.
              Благо это собственно самый сильный продажный инструмент битрикса, из-за которого с защищающими его адептами даже спорить смысла нет, ввиду того что им за это платят, а их оппонентам нет:)


              1. vanxant
                12.04.2017 00:08

                Да понятно, пусть даже 70% от 15900 (самая ходовая редакция Стандарт) или 35900 (редакция Малый бизнес, т.е. обычный интернет-магазин), из которых для крупных партнёров как минимум половину заберёт государство в виде прямых и косвенных налогов, — эти безумные суммы, конечно, решают.
                Да, есть редакция энтерпрайз с пятизначным ценником, но это действительно единичные внедрения, и там общая стоимость владения сайтом легко за 7 знаков переваливает. В любом случае, это истории про крупный бизнес, который готов платить вендорам за расширенную поддержку mission-critical систем.


        1. vanxant
          11.04.2017 15:50
          +1

          В наших реалиях ИМ предполагает не только витрину и корзину, но также платежный модуль какого-нибудь «газмясбанка», расчет доставки службой «копытаэкспресс» и да, интеграцию с 1С в конфигурации «Петрович и его велосипедисты». Когда это будет «искаропки» в «других» CMS, причем с поддержкой и обновлениями, а не заброшенный драфт-проект на гитхабе, тогда можно будет о чем-то разговаривать.
          И все равно, потом депутаты выпустят очередной закон про какие-нибудь «онлайн-че-то-там» со сроком исполнения «вчера», и начинай сначала.


          1. kotomyava
            11.04.2017 17:05

            Этого нет и в битриксе.
            Никакой мифической лучшей чем в любой другой CMS связи с 1с там нет.
            Платёжные модули для наших банков и агригаторов есть для всех распространённых платформ, а если экзотика и нет готового, это надо дописывать, что для Битрикса, что для чего-то другого и для другого будет с огромной вероятностью дешевле и проще, кстати.


          1. kucheriavij
            11.04.2017 17:06

            Из коробки даже битрикс этого не делает. Битрикс из коробки с 1С синхронизируется только если сам 1С из коробки без конфигураций. Платежные системы надо допиливать, да практически все допиливать надо. Модуль каталога в последней реализации наикривейший. Так что смысл существования битрикса я вообще не понимаю


            1. vanxant
              11.04.2017 18:45

              Не спорю, что в битриксе много чего нужно допиливать, но вот конкретно для интернет-магазинов допиливать нужно в разы меньше, чем для любой другой известной мне CMS. Как ни крути, а модули под Битрикс есть почти для всего — банков, служб доставки, CRM, бухгалтерского софта и прочая, прочая. И они, в целом, работают. Просто потому, что их не просто для галочки выпустили, а ими пользуются на реальных проектах.
              Интересно, чем вам модуль каталога не угодил? Он вполне сносно работает это раз, в том числе наконец-то! нормальные фасетные индексы. И он не завязан на интернет-магазин это два. Т.е. вы вообще можете снести модуль каталога, если он вам так не нравится, и иметь абсолютно рабочий интернет-магазин вокруг своего велосипеда (например, если вы собираете оплату за услуги типа ЖКХ)


              1. kucheriavij
                11.04.2017 19:02

                Лично я года 3 уже не прикасаюсь как к битриксу, так и к коробочным системам. И бесконечно рад этому, и сейчас я понимаю что одну и ту же выборку на yii я делаю гораздо быстрее чем на битриксе, при этом код изящней, и работает лучше, хотя года 4 назад я бил себя пяткой в грудь и говорил что лучше чем битрикс ничего нет.

                По поводу каталога, коллега с работы буквально несколько дней назад возился с ним, оказывается при ajax добавлении в корзину криво создается json, который на отрез отказывается парситься на ios устройствах


                1. vanxant
                  12.04.2017 00:10

                  Т.е. D7 вы не видели, но выборку делаете гораздо быстрее (кстати и в старом апи, если его таки выучить, а не заниматься stack overflow программированием, любая выборка пишется 15 секунд).
                  А ещё вам друг сказал, что в Safari/iOS, оказывается, бывают баги.
                  Ну ок, ок, спасибо что поделились своим объективным и обоснованным мнением.


                  1. kotomyava
                    12.04.2017 09:58
                    -1

                    Конечно, ведь там, небось, нормально под конкретную задачу спроектированная база, нет ничего лишнего в структуре хранения и получаются вполне хорошие и эффективные запросы-то.


            1. seedspro
              16.04.2017 16:59

              -= смысл существования битрикса =
              а чем(?) вы предложите торговать? конечно со смыслом.


  1. Alex77761
    11.04.2017 10:05

    Если Битрикс франкинштейн, то что вы считаете «Современными CMS»?


    1. my_username
      11.04.2017 15:52
      -1

      Например MODx. Как минимум в плане удобства администрирование контента он уделывает Битрикс, что называется, по всем статьям.


  1. WolfTheGrey
    11.04.2017 16:21
    -2

    Холивар-холиваром по поводу называть Битрикс CMS или нет. Но заголовок в корне неудачен. Сколько человеко-часов уже потеряно на изучение данной статьи, хотя бы по диагонали и понимание что тут не то, что ожидается?


  1. Agel_Nash
    11.04.2017 19:25

    А тем временем, ссылка на сайт разработчиков в статусе 404


    1. NetherNN
      11.04.2017 19:57
      +1

      Ну, это тоже своего рода фикс)



  1. AlexSerbul
    11.04.2017 21:13
    +2

    Добрый вечер!


    Во-первых. Скрипт, о котором идет речь в публикации ?—?специализированный код. Он был написан техподдержкой «1С-Битрикс» для быстрой диагностики проблем. А точнее?—?вопросов по работе с «1C». Скрипт эмулирует работу «1С» и отправляет диагностические данные в техподдержку. Фактически?—?это утилита. По инструкции скрипт УДАЛЯЕТСЯ после использования.


    Во-вторых. Ссылка в публикации вела на пост от 24 октября 2010 года. Скрипт не используется в системе «1С-Битрикс» уже несколько лет.


    Команда «1С-Битрикс» благодарит авторов статьи за трудную работу в архивах. К сожалению, текст не имеет отношения к текущей реальности.


    Все написанное выше — официальная позиция компании «1С-Битрикс». Спасибо.


  1. TigerClaw
    11.04.2017 23:04
    -1

    Я конечно понимаю что хейтить битрикс это модно. Но во-первых шанс встретить сейчас на современном сайте данный скрипт практически равен нулю и намного меньше чем других скриптов забытых разработчиками и позволяющих начать планировать атаку на ресурс. Так что правило простое, в продакшене удалять все служебные скрипты. Во-вторых обмен давно уже много раз переделан. Он уже не такой кривой как 7 лет назад, потребность в скрипте в настоящее время отсутствует, более того судя по комментам в актуальной версии битрикса и модуля обмена он не работает.


    1. kotomyava
      12.04.2017 10:18
      +2

      Не то, что это модно — это просто.
      Продукт технически отвратительный, всегда можно найти к чему придраться, зато пиара масса. Только ленивый не пнёт несчастных бракоделов, которые так громко расхваливают своё поделие.
      Кто-то просто из желания потролить, а кто-то от того, что читать дифирамбы откровенно слабому продукту уже мочи нет.

      По поводу обсуждаемого в статье: вытащить на свет какую-нибудь серьёзную уязвимость, которую можно массово эксплуатировать прямо сейчас, было бы очень не красиво по отношению к пользователям продукта. А показать как бывает не хорошо всё, стоило. Имхо, всё очень правильно сделано автором.


  1. SLAED_CMS
    12.04.2017 14:50
    -3

    Как всё запущено, в системе SLAED CMS проблема с безопасностью была решена изначально, со дня выхода первой версии системы в 2005 года.