HTB Bookworm. Эксплуатируем сложную XSS с байпасом CSP

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

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

В этом рай­тапе я покажу, как мож­но исполь­зовать уяз­вимость в механиз­ме кон­тро­ля заг­рузки фай­лов для обхо­да Content Security Policy и экс­плу­ата­ции слож­ной XSS. Най­ден­ная затем LFI поможет получить важ­ные дан­ные для дос­тупа к хос­ту, а для повыше­ния при­виле­гий исполь­зуем SQL-инъ­екцию через PostScript.

На­ша цель — зах­ват рута на машине Bookworm с пло­щад­ки Hack The Box. Уро­вень ее слож­ности — «безум­ный».

warning

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

 

Разведка

 

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

До­бав­ляем IP-адрес машины в /etc/hosts:

10.10.11.215 bookworm.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 8.2p1;
  • 80 — веб‑сер­вер Nginx 1.18.0.

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

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

Точка входа

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

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

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

Стра­ница про­филя поль­зовате­ля

Сам сайт пред­став­ляет собой магазин книг, поэто­му добавим файл в кор­зину, а затем прос­мотрим ее.

Стра­ница товара

Кор­зина поль­зовате­ля

В кор­зине у нас есть воз­можность изме­нить запись, а это зна­чит, что тут может быть уяз­вимость как XXS, так и SSTI.

 

Точка опоры

 

XSS

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

<img src="http://10.10.14.118/test_xss">

Фор­ма изме­нения

Пос­ле отправ­ки наг­рузки смот­рим логи веб‑сер­вера и видим там зап­рос.

Ре­зуль­тат изме­нения записи

Ло­ги веб‑сер­вера

На­ходим зап­рос в Burp History и обра­щаем вни­мание на заголо­вок CSP.

Зап­рос в Burp History

Content Security Policy — это механизм обес­печения безопас­ности, с помощью которо­го мож­но защищать­ся от XSS-атак. CSP опи­сыва­ет безопас­ные источни­ки для заг­рузки ресур­сов и уста­нав­лива­ет пра­вила исполь­зования встро­енных скрип­тов. Заг­рузка с ресур­сов, не вхо­дящих в белый спи­сок, бло­киру­ется. В дан­ном слу­чае будут исполнять­ся скрип­ты толь­ко с тес­тиру­емо­го сер­вера, а зна­чит, наг­рузку со сво­его сер­вера мы не выпол­ним.

Так­же пос­ле меня какой‑то поль­зователь добавил товар себе в кор­зину.

Спи­сок товаров

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

Ис­ходный код стра­ницы

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

Из­менен­ный зап­рос в Burp Repeater

Ло­ги сер­вера

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

 

File Upload

Пе­рей­дем к заг­рузке ава­тар­ки. Боль­ше все­го нас инте­ресу­ет дан­ный зап­рос в Burp History.

Зап­рос в Burp History

При попыт­ке заг­рузить шелл получа­ем ошиб­ку, сооб­щающую о том, что мы можем заг­рузить толь­ко фай­лы JPEG и PNG.

Ошиб­ка заг­рузки фай­ла

При новой заг­рузке фай­ла перех­ватыва­ем зап­рос в Burp Proxy и изме­няем содер­жимое фай­ла на прос­тую стро­ку‑инди­катор test_file_upload. Но получа­ем уже дру­гую ошиб­ку.

Зап­рос на заг­рузку фай­ла

Ошиб­ка сер­вера

Раз ошиб­ка изме­нилась, зна­чит, содер­жимое фай­ла не про­веря­ется. Тог­да надо попытать­ся изме­нить рас­ширение фай­ла. Пер­вым делом про­буем исполь­зовать двой­ное рас­ширение, раз­делен­ное null-сим­волом (%00). При про­вер­ке фай­ла будет учи­тывать­ся вто­рое рас­ширение, а при заг­рузке его отсе­чет из‑за null-сим­вола, и файл сох­ранит­ся с пер­вым рас­ширени­ем.

Зап­рос на заг­рузку фай­ла

Зап­рос заг­ружен­ного фай­ла

Пос­ле редирек­та видим обра­щение к нашему фай­лу и отоб­ражение его содер­жимого. Дос­туп к фай­лу тоже не про­веря­ется.

curl http://bookworm.htb/static/img/uploads/14

Зап­рос содер­жимого заг­ружен­ного фай­ла 

CSP Bypass XSS

Итак, мы можем заг­рузить на сер­вер файл с тек­сто­вым содер­жимым. Давай поп­робу­ем добавить код на JavaScript, дела­ющий прос­той зап­рос на наш сер­вер.

fetch("http://10.10.14.118/csp_bypass");

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

Ответить

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