HTB Forgot. Отравляем Web Cache для получения админки сайта
the Matrix • Cyber News
Наша цель — захват машины Forgot с площадки Hack The Box. Уровень сложности — средний.
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts:
И запускаем сканирование портов.
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Nmap нашел нам два открытых порта: 22 — служба OpenSSH 8.2p1 и 80 — веб‑сервер Werkzeug 2.1.2, запущенный из Python 3. Переходим на сайт, где нас сразу встречает форма авторизации.

С помощью Burp Suite построим карту сайта, для чего в контекстном меню Burp History выбираем Engagement tools → Discover content.

Ничего нового и полезного для продвижения не находим. Просмотрим комментарии в исходном коде страниц, может быть, получится узнать что‑то интересное. Чтобы удобно отобразить все комментарии с сайта, в Burp переходим к контекстному меню и выбираем Engagement tools → Find comments.

В итоге находим пользователя. Попробуем запросить смену пароля для него.

Так как была отправлена ссылка для сброса пароля, пользователь реален.
По HTTP-заголовкам ответа определяем, что на сервере работает Varnish. Это ускоритель HTTP, разработанный для динамических веб‑сайтов с большим количеством контента и API. Пробуем в HTTP-заголовке Host запроса указать свой адрес, активируем листенер и ловим входящий запрос.


Во входящем запросе присутствует токен для сброса пароля. Идем на указанную страницу, где нам сразу предлагают указать новый пароль.

Меняем пароль, авторизуемся и осматриваемся на сайте.

Нам доступны страницы Tickets и Escalate. На первой мы видим проблемы и их статус, на второй есть форма связи с администратором. Отметим для себя проблему с учетными данными для доступа по SSH.


Есть еще страница, но ссылка на нее неактивна. Хоть ее и можно найти в исходном коде страницы, доступ все равно запрещен. Нужны права администратора.

У нас есть связь с администратором через форму заявок. Я потестировал ее на наличие уязвимостей XSS, но ничего не обнаружил. А вот благодаря карте сайта можно найти страницы, а вернее каталог, где можно отравить кеш. Так, на всех страницах, кроме тех, что в каталоге /static, счетчик все время обнуляется. А вот в каталоге /static он растет до значения 240 (четыре минуты), после чего уже обнуляется.


Кеширование заключается в сохранении копии ресурса, чтобы вернуть ее в ответ на дальнейшие запросы. Запрос на ресурс, уже имеющийся в веб‑кеше, перехватывается, и вместо того, чтобы обращаться к серверу, загружается копия из кеша. Таким образом снижается нагрузка на сервер, которому не приходится самому обслуживать всех клиентов, и повышается производительность.
Подробнее о механизмах кеширования сайтов ты можешь прочитать, например, в статье «Веб‑кеширование на примере покупки молока в магазине» на «Хабрахабре».
Отравление веб‑кеша — это атака, при которой атакующий использует поведение веб‑сервера и кеша таким образом, чтобы в кеше другим пользователям доставлялся опасный HTTP-ответ. То есть без взаимодействия с другими пользователями уязвимость проэксплуатировать не получится.
Первым делом стоит проверить, выполняется ли кеширование для несуществующих страниц.


Счетчик (заголовок Age) растет, значит, для несуществующих страниц в каталоге /static происходит кеширование. Теперь нам нужно найти ключ кеша — какое‑то значение в HTTP-запросе, при изменении которого счетчик кеша будет обнуляться. В данном случае ключом оказалось значение заголовка Host.


При этом обрати внимание, что в первом запросе кешированный ответ содержит наш куки!
Собираем все воедино. Мы можем отправить админу сообщение, содержащее ссылку, и он на нее перейдет. При этом есть каталог, кеширующий ответ сервера, причем ответ может вернуть куки пользователя. Поэтому отправим администратору ссылку на любой несуществующий файл в каталоге /static, спустя время обратимся к нему же и проверим заголовок Set-Cookie.


И нам вернули куки, предположительно админа. Вставляем идентификатор сессии в хранилище браузера и переходим к административной странице /admin_tickets.


Видим тикет, где упоминаются учетные данные для SSH. Если их просто скопировать, то авторизоваться не получится. Причина в том, что на странице некоторые символы отображаются в верхнем регистре. Мы с этим сталкивались при отправке сообщений админу: введенный текст автоматически переводился в верхний регистр. Поэтому переходим к исходному коду сайта и копируем учетные данные оттуда.

Подключаемся по SSH и забираем первый флаг.

Теперь нам необходимо собрать информацию о системе. Я буду использовать для этого скрипты PEASS.
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загрузим на хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, поэтому отберем только значимую:



Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.
Скрипт оказался большим, поэтому я скопировал его на локальную машину и открыл в VS Code. Первым делом пробегаемся по коду и копируем важные данные, к примеру учетку для подключения к базе данных.

Затем видим подсчет каких‑то значений (спасибо комментариям), проверку итогового значения, рассчитанного на основе шести представленных, и выполнение функции preprocess_input_exprs_arg_string.

Среди импортов находим модуль tensorflow, к которому относится функция.

Разбираясь с найденной функцией, я нашел статью, где рассказано о выполнении кода через eval внутри preprocess_input_exprs_arg_string, если ее второй аргумент safe=False.

Таким образом, из таблицы escalate извлекаются данные, которые передаются в функции вида loaded_model*.predict(), а затем в функцию preprocess_input_exprs_arg_string, где произойдет их выполнение как кода. Давай подключимся к базе данных и запишем в таблицу escalate такую нагрузку:
Она установит SUID для файла командной оболочки /bin/bash.
А теперь запустим скрипт c sudo и проверим права на файл /bin/bash.

Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.
Оболочка /bin/bash теперь будет запускаться от имени пользователя root.

Машина захвачена!
Источник
Наши проекты:
- Кибер новости: the Matrix • Cyber News
- Хакинг: /me Hacker
👁 Пробить человека? Легко через нашего бота: Мистер Пробиватор