В этом рай­тапе я покажу, как через уяз­вимость в рас­ширении бра­узе­ра получить дос­туп к фай­лам дру­гого поль­зовате­ля. Най­ден­ные кри­тичес­ки важ­ные дан­ные помогут нам зак­репить­ся на хос­те, а зах­ватим кон­троль над ним мы при помощи уяз­вимос­ти в веб‑сер­висе. А потом нам пред­сто­ит побег из Docker!

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

warning

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

 

Разведка

 

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

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

10.10.11.171 extension.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 7.6p1 и 80 — веб‑сер­вер Nginx 1.14.0. Начина­ем, конеч­но же, с сай­та.

Главная страница сайта http://extension.htb
Глав­ная стра­ница сай­та http://extension.htb

На сай­те видим ука­зан­ный домен, который добав­ляем в файл /etc/hosts.

10.10.11.171 extension.htb snippet.htb

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

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

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

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

  • -w — сло­варь (я исполь­зую сло­вари из набора SecLists);
  • -t — количес­тво потоков;
  • -u — URL;
  • -r — выпол­нять редирек­ты;
  • -fs — филь­тро­вать стра­ницы по раз­меру;
  • -fc — исклю­чить из резуль­тата отве­ты с кодом 403.

Мес­то перебо­ра помеча­ется сло­вом FUZZ.

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

ffuf -u 'http://snippet.htb/' -r -w subdomains-top1million-110000.txt -t 256 -H 'Host: FUZZ.snippet.htb' --fl 30
Результат сканирования поддоменов с помощью ffuf
Ре­зуль­тат ска­ниро­вания под­доменов с помощью ffuf

Так находим еще два под­домена, которые тоже добав­ляем в файл /etc/hosts. Там най­дем сер­висы Gitea и RoundCube.

10.10.11.171 extension.htb snippet.htb dev.snippet.htb mail.snippet.htb
Главная страница http://dev.snippet.htb
Глав­ная стра­ница http://dev.snippet.htb
Главная страница http://mail.snippet.htb
Глав­ная стра­ница http://mail.snippet.htb

В Gitea можем без авто­риза­ции пос­мотреть сущес­тву­ющих поль­зовате­лей.

Пользователи Gitea
Поль­зовате­ли Gitea

Ска­ниро­вание катало­гов на поль­зователь­ском сай­те тоже ничего не дало.

ffuf -u 'http://snippet.htb/FUZZ' -r -w directory_2.3_medium_lowercase.txt -t 256
Результат сканирования каталогов с помощью ffuf
Ре­зуль­тат ска­ниро­вания катало­гов с помощью ffuf
 

Точка входа

Тог­да пос­мотрим на поль­зователь­ский сайт через Burp. Нас инте­ресу­ет Burp History.

Вкладка Burp History
Вклад­ка Burp History

В коде стра­ницы видим исполь­зование какого‑то API. Изу­чив его под­робнее, находим воз­можность не толь­ко получать раз­ную информа­цию, но и дам­пить ее.

API для дампа информации
API для дам­па информа­ции

Пер­вым делом я решил пос­мотреть на поль­зовате­лей сай­та, но это получит­ся толь­ко пос­ле авто­риза­ции.

Запрос страницы /users
Зап­рос стра­ницы /users

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

Запрос страницы /management/dump
Зап­рос стра­ницы /management/dump

Так как нам инте­рес­на информа­ция о поль­зовате­лях, в качес­тве зна­чения будем исполь­зовать users. Но имя парамет­ра нуж­но будет переб­рать. Раз ответ при­шел в фор­мате JSON, переда­вать параметр мы будем так же. Для перебо­ра я исполь­зовал Burp Intruder.

Burp Intruder — вкладка Positions
Burp Intruder — вклад­ка Positions
Результат перебора имени параметра
Ре­зуль­тат перебо­ра име­ни парамет­ра

И находим наз­вание нуж­ного парамет­ра — download. Ответ очень боль­шой, поэто­му сох­раня­ем в файл и выводим в jq.

Полученные данные
По­лучен­ные дан­ные

Нам дос­тупны хеши паролей поль­зовате­лей, поэто­му для перебо­ра поп­робу­ем узнать алго­ритм с помощью hashid.

Распознавание алгоритма хеширования
Рас­позна­вание алго­рит­ма хеширо­вания

В качес­тве алго­рит­ма шиф­рования, ско­рее все­го, исполь­зует­ся SHA-256. Давай выберем из спис­ка все пары логинов и паролей.

cat users.dump| jq | grep 'email"\|password' | cut -d '"' -f 4 > users.txt

За­тем мож­но все пос­ледова­тель­нос­ти .htb\n заменить дво­ето­чием, тог­да мы получим стро­ки типа логин:пароль. Отправ­ляем спи­сок прог­рамме John the Ripper и ука­зыва­ем фор­мат хеша. Спус­тя нес­коль­ко секунд получим пароль.

john -form=dynamic='sha256($p)' --wordlist=~/tmp/wordlists/Passwords/rockyou.txt creds.txt
Результат перебора хешей
Ре­зуль­тат перебо­ра хешей

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

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

Точка опоры

 

Пользовательский сервис

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

Доступные сниппеты
Дос­тупные снип­петы

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

Запрос на публикацию сниппета
Зап­рос на пуб­ликацию снип­пета
Доступные сниппеты
Дос­тупные снип­петы

Прос­мотрим вытащен­ный нами снип­пет и най­дем там HTTP-заголо­вок базовой аутен­тифика­ции. Декоди­руем стро­ку Base64 и получа­ем учет­ные дан­ные для поль­зовате­ля jean.

Содержимое сниппета
Со­дер­жимое снип­пета
Учетные данные пользователя
Учет­ные дан­ные поль­зовате­ля

С получен­ными учет­ными дан­ными можем авто­ризо­вать­ся в Gitea. Там нам дос­тупен один про­ект.

Репозиторий extension
Ре­пози­торий extension
 

Gitea

Сам про­ект — это пла­гин бра­узе­ра для быс­тро­го опо­веще­ния об ошиб­ках. В нас­трой­ках про­екта находим соав­тора, это нам при­годит­ся.

Соавторы проекта
Со­авто­ры про­екта

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

Старый фильтр сообщений
Ста­рый филь­тр сооб­щений

На­ходим подоб­ный фраг­мент в коде текуще­го парамет­ра.

Новый фильтр сообщений
Но­вый филь­тр сооб­щений

Из сооб­щения уда­ляет­ся любая пос­ледова­тель­ность сим­волов, если она зак­лючена в тре­уголь­ные скоб­ки, то есть похожа на HTML-тег. Так­же если при­сутс­тву­ет пос­ледова­тель­ность сим­волов, при­веден­ных в перемен­ной filter. Но в самом регуляр­ном выраже­нии ошиб­ка, так уда­лит­ся толь­ко пер­вое вхож­дение пос­ледова­тель­нос­ти в тегах. Про­верим это, для чего запус­тим веб‑сер­вер и отпра­вим сле­дующую стро­ку:

qwe<qwe><img src="http://10.10.14.7/test">
Отправка сообщения
От­прав­ка сооб­щения
Опубликованное сообщение
Опуб­ликован­ное сооб­щение
Логи веб-сервера
Ло­ги веб‑сер­вера

В логах веб‑сер­вера уви­дим под­клю­чение, зна­чит, мож­но про­экс­плу­ати­ровать хра­нимую XSS.

 

Хранимая XSS

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

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

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

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

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


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

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

    Подписаться

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