HTB Intentions. Эксплуатируем сложную SQL-инъекцию для дампа базы данных

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

  • Разведка
  • Сканирование портов
  • Точка входа
  • Точка опоры
  • Burp Macro
  • SQL-инъекция
  • Повышение привилегий
  • PHP Imagick RCE
  • Продвижение
  • Локальное повышение привилегий

Се­год­ня нам с тобой пред­сто­ит прой­ти через череду очень слож­ных веб‑уяз­вимос­тей, про­экс­плу­ати­ровав двух­сту­пен­чатую SQL-инъ­екцию и уяз­вимость в модуле PHP Imagick. Для прод­вижения изу­чим Git-репози­торий, а для повыше­ния при­виле­гий напишем читал­ку фай­лов через поль­зователь­ский ска­нер.

А поможет нам в этом тре­ниро­воч­ная машина Intentions с пло­щад­ки Hack The Box слож­ного уров­ня (hard).

warning

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

 

Разведка

 

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

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

10.10.11.220 intentions.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.9p1 и 80 — веб‑сер­вер Nginx 1.18.0. Бру­тить SSH на машинах с HTB не при­нято, а на сай­те нас встре­чает фор­ма авто­риза­ции и регис­тра­ции.

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

Точка входа

Ре­гис­три­руем нового поль­зовате­ля и авто­ризу­емся на сай­те.

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

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

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

Заг­лянув в Burp History (а все дей­ствия я рекомен­дую про­водить через Burp), обна­ружим, что исполь­зует­ся API.

Ис­тория зап­росов

В поле изме­нения жан­ра я поп­робовал вста­вить наг­рузку ' -- - для SQL-инъ­екции и в отве­те получил те же дан­ные, толь­ко без про­белов.

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

От­вет сер­вера

Сто­ит отме­тить, что наг­рузку мы отправ­ляем к API /api/v1/gallery/user/genres, а про­веря­ем изме­нен­ные дан­ные через API /api/v1/auth/user.

 

Точка опоры

 

Burp Macro

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

Спи­сок пра­вил сес­сий

В открыв­шемся окне в поле Rule action соз­даем новый мак­рос run post request macro — то есть выпол­няемый пос­ле основно­го зап­роса.

Нас­трой­ки пра­вила

Для соз­данно­го мак­роса откры­ваем Editor и выбира­ем зап­рос к API: /api/v1/auth/user. Здесь мы получа­ем текущее зна­чение нас­тро­ек про­филя.

Нас­трой­ки мак­роса

Под­твержда­ем — и в окне с нас­трой­ками соз­данно­го пра­вила видим наш мак­рос.

Нас­трой­ки пра­вила

Пе­рехо­дим на вклад­ку Scope и в парамет­ре URL scope выбира­ем Include all URLs, что­бы пра­вило при­меня­лось абсо­лют­но ко всем зап­росам.

Нас­трой­ки пра­вила

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

Спи­сок пра­вил сес­сий

Те­перь перено­сим зап­рос к API /api/v1/gallery/user/genres в Burp Intruder. В нас­трой­ках перехо­дим к опции Grep → Extract и ука­зыва­ем инте­ресу­ющее нас поле, что­бы добавить его содер­жимое в общую таб­лицу резуль­татов Intruder.

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

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

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

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

Прос­мотрев резуль­тат, я ничего необыч­ного не нашел, кро­ме того, что мы получа­ем ошиб­ку при отправ­ке сим­вола ". Таким обра­зом, как бы ни менялось поле жан­ра, ничего инте­рес­ного мы не добива­емся.

Нем­ного поб­родив по сай­ту, замеча­ем, что жанр так­же исполь­зует­ся при прос­мотре галереи. Там выпол­няет­ся вызов API /api/v1/gallery/user/feed.

Зап­рос в Burp History

Мы получа­ем раз­ные изоб­ражения в зависи­мос­ти от уста­нов­ленно­го у нас жан­ра. Этот момент тоже необ­ходимо про­тес­тировать, поэто­му воз­вра­щаем­ся к нашим пра­вилам и изме­няем мак­рос, что­бы он выпол­нял зап­рос к API /api/v1/gallery/user/feed. Для изме­нения выбира­ем Re-record macro и отме­чаем нуж­ный зап­рос.

Нас­трой­ки мак­роса

Macro Recorder

Пос­ле изме­нения мак­роса перево­дим зап­рос в Burp Repeater и отправ­ляем обыч­ную наг­рузку с ком­мента­рием для Boolean-based-инъ­екции test'or 1=1 -- -.

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

От­вет сер­вера

В ответ получа­ем ошиб­ку — видимо, из‑за кавыч­ки. Тог­да про­буем ука­зать наг­рузку без кавыч­ки.

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

От­вет сер­вера

Зап­рос обра­ботан, но дан­ные никакие не получа­ем. Перехо­дим к перебо­ру наг­рузок.

 

SQL-инъекция

Нас­тра­иваем Burp Intruder в один поток, толь­ко в этот раз ничего извле­кать из отве­та не будем, а прос­то отсорти­руем резуль­тат по раз­меру отве­та.

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

Ре­зуль­тат ата­ки

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

Ответить

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