Найти в Дзене
B0rn2beR00T

Решение Chellange HTB (Jinjacare)

Приветствую, друзья! В новой статье разберём таск с площадки HTB под названием Jinjacare. Тут заложен классический SSTI, при помощи которого мы сможем выполнять команды сервера. Приступим к разбору! На этот раз на операционный стол нам попался сайт, где основным функционалом является генерация сертификатов вакцинации COVID-19. Помимо этого здесь есть возможность якобы мониторить ситуацию с вирусом, проверка сертификата по ID, регистрация/вход на web-сайт. Поскольку у нас ещё нет аккаунта, мы можем просто зарегистрироваться, нажав на create account и входим под новой учёткой. После авторизации видим панель управления: Внимательно шаримся по хосту и обнаруживаем следующий функционал: Фича с загрузкой сертификатов заинтересовала меня т.к это явно веб-шаблон. Видим, что тут есть шаблонизатор, генерирующий эти сертификаты. То есть тут возможно есть SSTI-уязвимость. SSTI (Server-Side Template Injection) — это уязвимость, возникающая, когда злоумышленник может внедрять произвольный код в ш
Оглавление

Приветствую, друзья!

-2

В новой статье разберём таск с площадки HTB под названием Jinjacare. Тут заложен классический SSTI, при помощи которого мы сможем выполнять команды сервера. Приступим к разбору!

Сбор информации

На этот раз на операционный стол нам попался сайт, где основным функционалом является генерация сертификатов вакцинации COVID-19. Помимо этого здесь есть возможность якобы мониторить ситуацию с вирусом, проверка сертификата по ID, регистрация/вход на web-сайт.

-3

Поскольку у нас ещё нет аккаунта, мы можем просто зарегистрироваться, нажав на create account и входим под новой учёткой.

-4

После авторизации видим панель управления:

-5

Внимательно шаримся по хосту и обнаруживаем следующий функционал:

  • Панель управления — загрузить сертификат covid
  • Личная информация — используется для обновления пользовательских данных, таких как имя, адрес электронной почты, номер телефона и т. д.
  • История болезни — используется для добавления записи истории болезни
  • Записи о вакцинации — используется для добавления записи о вакцинации.

Фича с загрузкой сертификатов заинтересовала меня т.к это явно веб-шаблон.

-6

Выявление уязвимости

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

SSTI (Server-Side Template Injection) — это уязвимость, возникающая, когда злоумышленник может внедрять произвольный код в шаблоны, обрабатываемые сервером. Это позволяет выполнять команды на сервере, читать файлы, получать доступ к данным и даже полностью захватывать систему.

Проверим уязвима ли тачка к SSTI:

В персональных данных меняем имя на базовый пейлоад {{7*7}}, если умножение выполниться, то уязвимость присутствует.

-7

Вычисление выполнилось и было отражено в сертификате:

-8

Эксплуатация уязвимости

Попробуем пойти дальше и реализовать выполнение кода на сервере при помощи SSTI:

{{ self.__init__.__globals__.__builtins__.__import__('os').popen('ls /').read() }}

Разберём эту команду:

__import__('os') — это встроенная в Python функция. Она импортирует и возвращает модуль с именем os. Модуль os позволяет взаимодействовать с операционной системой, например, запускать команды.
__builtins__ — это ссылка на встроенные функции и модули Python (такие как print, len, __import__ и т.д.). Это огромный набор инструментов, доступный по умолчанию. Чтобы получить доступ к функции __import__, нам нужно найти к ней путь.
__globals__ — это специальный атрибут, который есть у функций. Он содержит словарь всех глобальных переменных, доступных в той области видимости, где эта функция была определена. Это как окружение функции. В этом словаре мы ищем ключ __builtins__.
__init__ — это метод-конструктор, который вызывается при создании нового объекта. У самого этого метода (как и у любой функции в Python) есть атрибут __globals__.
self — в контексте шаблона Jinja2 это ссылка на текущий объект контекста шаблона. Это наша отправная точка для начала "прыжков" по атрибутам.

-9

Команда даст следующий результат:

-10

Теперь прочитаем и сам флаг:

{{ self.__init__.__globals__.__builtins__.__import__('os').popen('cat /flag.txt').read() }}

-11

После скачивания сертификата на этот раз там будет лежать заветный флаг.

-12

Победа!

-13

Выводы

SSTI — это когда злоумышленник заставляет сервер выполнить свою команду вместо того, чтобы просто написать текст. Это происходит, если в поле для ввода (имя, комментарий, поиск) можно вставить не просто имя, а специальный код, который сервер ошибочно воспримет как команду.

Для разработчиков: Самое главное — НИКОГДА не использовать данные от пользователя как часть шаблона. Данные можно только подставлять в уже готовый, безопасный шаблон.

Для пользователей: Ничего делать не нужно. Это проблема на стороне сайта. Вам остается только надеяться, что разработчики того сервиса, которым вы пользуетесь, не накосячили.

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

Спасибо за внимание! Не забывайте оценивать моё творчество лайком. Всех благ!