Техпідтримка вразливостей CMS

файлу

1С-Бітрікс - одна з найпопулярніших систем CMS. Включає багато цікавих рішень, починаючи від сайту візитки, закінчуючи високонавантаженими системами. Ми часто зустрічаємо під час пентестів даний продукт і відзначаємо, що більшість проблем безпеки, що виявляються, можна побачити в самописних модулях, а не в самому ядрі Бітрікса. Одного разу, аналізуючи захищеність однієї системи, побудованої на основі коробкового рішення, ми задетектували ряд цікавих вразливостей. Шкода, але про все розповідати не можна, а от про віддалене виконання коду та підвищення привілеїв на сервері вже можна.

До речі, розробники RCE виправляти відмовилися.

Шкідливий кіт

Якщо ви знайомі з інтеграцією Бітрікса та 1С Бухгалтерією, то, напевно, зустрічали скрипт під назвою “1c_bx_import.php”. Якщо коротко: це налагоджувальний скрипт для діагностики, докладніше з його можливостями можна ознайомитись за посиланням від розробників. Крім низки специфічних дій, він реалізує можливість завантажувати та завантажувати файли на сервер, розпаковувати архіви, видаляти довільні файли.

Давайте подивимося, як у скрипті реалізована аутентифікація:

Скоріш за все, спочатку замислювалося, що якщо в URI параметр "mode" дорівнює "query" або "exchange", то користувачеві віддається форма логіну, і робота скрипта завершується. Проте, якщо придивитися уважно, можна помітити, що у логічні оператори вкралася помилка. Вийшло зовсім навпаки:автентифікація буде запитана тільки якщо “mode” не дорівнює «query» або «exchange»!

Якщо не буде виконано обидві умови, виконання скрипту закінчиться. Давайте подивимося ще раз уважно:

Якщо користувач не адміністратор, і якщо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:

Замість символу зірочки скрипти системи підставляють ім'я сервера в кластері.

Утиліта sudo шукає входження підрядки в рядок, а не поділяє аргументи, як це було б у разі системних команд класу execv. Символ зірочки у рядку вище дозволяє вставити довільну кількість символів, які будуть поділені на окремі аргументи. Тому підвищити свої привілеї можна легко однією командою:

Для самого sudo аргументи виглядають так:

І це відповідає написаному розробниками правилу sudoers. З цією вразливістю розробники погодилися, і зараз вона вже виправлена.

Що ми отримуємо у результаті? Вразливості досить прості та не вимагають специфічних умов для експлуатації.

Перерахуємо наші дії при пошуку можливостей для отримання контролю над сайтом, що тестується: