Хакер - HTB Forgot. Отравляем Web Cache для получения админки сайта
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- Продвижение
- Локальное повышение привилегий
В этом райтапе я покажу технику отравления веб‑кеша, которая позволяет получить куки администратора сайта. Доступ к Varnish Cache мы получим через сброс пароля, а для повышения привилегий проэксплуатируем уязвимость в модуле TensorFlow для Python.
Наша цель — захват машины Forgot с площадки Hack The Box. Уровень сложности — средний.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.188 forgot.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -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 (четыре минуты), после чего уже обнуляется.


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


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


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


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


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

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

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь нам необходимо собрать информацию о системе. Я буду использовать для этого скрипты PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загрузим на хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, поэтому отберем только значимую.
- На хосте активен Cron, запускающий скрипт
/home/diego/bot.py.

- В списке открытых портов видим работающие СУБД MySQL (порт 3306) и веб‑сервер (порт 8080).

- В настройках sudoers для пользователя
diegoесть запись. Мы можем запустить скрипт/opt/security/ml_security.pyот имени пользователя root.

Справка: sudoers
Файл /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 такую нагрузку:
r=exec("""\nimport os\nos.system("chmod +s /usr/bin/bash")""")
Она установит SUID для файла командной оболочки /bin/bash.
mysql -D app -udiego -p'dCb#1!x0%gjq'
insert into escalate values ("1","1","1",'r=exec("""import os; os.system("chmod +s /usr/bin/bash")""")');
А теперь запустим скрипт c sudo и проверим права на файл /bin/bash.

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

Машина захвачена!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei