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

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

warning

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

 

Разведка

 

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

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

10.10.11.220 intentions.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 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 actions соз­даем новый мак­рос 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 — вклад­ка Positions
Burp Intruder — вкладка Settings
Burp Intruder — вклад­ка Settings

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

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

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

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

Запрос в Burp History
Зап­рос в Burp History

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

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

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

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

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

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

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

 

SQL-инъекция

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

Burp Intruder — вкладка Positions
Burp Intruder — вклад­ка Positions
Результат атаки
Ре­зуль­тат ата­ки

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    2 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии