Взлом

HTB Breadcrumbs. Атакуем Apache на Windows и эксплуатируем уязвимость JWT


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

  • Разведка. Сканирование портов
  • Точка входа. Эксплуатация LFI
  • Точка опоры
  • JSON Web Token
  • Эксплуатация уязвимой загрузки файлов
  • Продвижение
  • Получение учетных данных
  • Получение данных из Sticky Notes
  • Локальное повышение привилегий

Се­год­ня я для тебя раз­беру слож­ную машину Breadcrumbs пло­щад­ки Hack The Box. На ее при­мере мы про­экс­плу­ати­руем LFI, что­бы про­честь исходни­ки сай­та, затем под­берем JWT для авто­риза­ции в качес­тве адми­на. Пос­ле про­ник­новения на сер­вер поревер­сим самопис­ный менед­жер паролей и про­ведем в нем SQL-инъ­екцию для получе­ния рута. В общем, ску­чать не при­дет­ся!

warning

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

 

Разведка. Сканирование портов

Ма­шина име­ет IP-адрес 10.10.10.228, который я добав­ляю в /etc/hosts, что­бы мож­но было обра­щать­ся к дан­ном хос­ту по име­ни.

10.10.10.228 breadcrumbs.htb

Лю­бая ата­ка начина­ется со ска­ниро­вания откры­тых на хос­те пор­тов. Дела­ем это при помощи скрип­та, где через Nmap про­изво­дит­ся обыч­ное быс­трое ска­ниро­вание пор­тов, а затем из вывода берут­ся все пор­ты и пов­торя­ется ска­ниро­вание толь­ко обна­ружен­ных пор­тов со скрип­тами (опция -A).

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1

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

Как это обыч­но быва­ет на машинах с Windows, по резуль­татам ска­ниро­вания име­ем мно­го откры­тых пор­тов:

  • порт 22 — служ­ба SSH;
  • порт 80 — веб‑сер­вер Apache 2.4.46;
  • порт 135 — служ­ба MS RPC;
  • порт 139 — служ­ба имен NetBIOS;
  • порт 443 — веб‑сер­вер Apache 2.4.46;
  • порт 445 — служ­ба SMB;
  • порт 3306 — служ­ба MySQL.

Ос­таль­ное не пред­став­ляет для нас инте­реса.

На SSH нам сей­час ловить нечего, пос­коль­ку уче­ток у нас нет, да и SMB для ано­нима инте­реса не пред­став­ляет. Раз есть веб‑сайт, начинать луч­ше все­го с него.

Сайт поз­воля­ет искать кни­ги по биб­лиоте­ке.

Тес­товый поиск

До­пол­нитель­ная информа­ция по выб­ранной кни­ге

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

Прос­матри­вая стра­ницы, обра­тим вни­мание на спо­соб зап­роса кни­ги: наз­вание HTML-фай­ла с кни­гой переда­ется исполня­емо­му фай­лу, который затем вклю­чит этот файл в ответ.

Зап­рос кни­ги, пред­став­ленный Burp 

Точка входа. Эксплуатация LFI

Это потен­циаль­ная уяз­вимость LFI, которую сто­ит про­верить. Есть хорошее средс­тво для тес­тов LFI — LFI Suite. Но так как оно работа­ет мед­ленно, то возь­мем из него толь­ко сло­варь и выпол­ним тест с помощью Burp Intruder (в вер­сии Pro ста­вим 120 потоков).

Burp Intruder, вклад­ка Position

Burp Intruder, вклад­ка Payload

Burp Intruder, вклад­ка Options

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

Филь­тру­ем по раз­меру отве­та и видим, что уда­лось про­читать файл access.log. А чуть ниже в тек­сте ошиб­ки отме­чаем для себя пол­ный путь к веб‑при­ложе­нию.

Ошиб­ка чте­ния фай­ла environ

Да­вай взгля­нем, что инте­рес­ного может дать код в фай­ле bookController.php. Для это­го переда­дим сле­дующее зна­чение парамет­ра:

book=../includes/bookController.php&method=1

Часть исходно­го кода bookController.php

Так, в фай­ле про­исхо­дит вклю­чение фай­ла db.php, в котором обыч­но под­клю­чает­ся база дан­ных, и при этом, ско­рее все­го, исполь­зуют­ся учет­ные дан­ные, хра­нящи­еся в откры­том виде. Про­веря­ем, зап­росив book=../db/db.php&method=1.

Часть исходно­го кода db.php

Так мы находим учет­ку от базы дан­ных. Но что с ней теперь делать, если к дос­тупным нам сер­висам она не под­ходит? Поищем, нет ли еще чего‑нибудь на сай­те.

Для перебо­ра путей с целью поис­ка скры­тых стра­ниц (тех, на которые сна­ружи нет ссы­лок) обыч­но исполь­зуют прог­раммы вро­де dirsearch, dirb или более быс­трый gobuster. Но я пос­леднее вре­мя исполь­зую встро­енные средс­тва Burp Suite. Перех­ватыва­ем зап­рос в Burp Proxy и отправ­ляем в Burp Intruder. Затем отме­чаем позицию для перебо­ра, выс­тавля­ем сло­варь и количес­тво потоков, пос­ле чего выпол­няем ата­ку.

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

Burp Intruder, вклад­ка Payloads

Burp Intruder, вклад­ка Options

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

Так мы находим нес­коль­ко дирек­торий, часть из которых нам уже извес­тна. Но мы еще не были в катало­ге portal, а пос­ле перехо­да нас редирек­тит на http://breadcrumbs.htb/portal/login.php.

Фор­ма авто­риза­ции

Удоб­но, что мы можем пос­мотреть исходник это­го фай­ла, сде­лав зап­рос book=../portal/login.php&method=1.

Ис­ходный код login.php

В исходном коде видим под­клю­чение еще одно­го нового для нас фай­ла — authController.php. Тем же спо­собом гля­нем и его.

Ис­ходный код authController.php

А вот уже здесь находим пря­мую ссыл­ку на admins.php, перей­дя по которой най­дем очень мно­го поль­зовате­лей. У нас есть пароль для под­клю­чения к базе дан­ных, одна­ко это нам никак не помога­ет, и мы вынуж­дены идти даль­ше.

Спи­сок поль­зовате­лей сай­та

В исходном коде находим уже боль­ше инте­рес­ной информа­ции.

Ис­ходный код admins.php

В коде мы видим исполь­зование JWT, сек­ретный ключ и вызов фун­кции makesession. Ее код находим в под­клю­чаемом фай­ле cookie.php.

Ис­ходный код cookie.php 

Точка опоры

 

JSON Web Token

JSON Web Token (JWT) сос­тоит из трех час­тей: заголов­ка (header), полез­ной наг­рузки (payload) и под­писи. Заголо­вок и полез­ная наг­рузка пред­став­ляют собой объ­екты JSON, при этом наг­рузка может быть любой — это имен­но те кри­тичес­кие дан­ные, которые переда­ются при­ложе­нию. А вот заголо­вок содер­жит опре­делен­ные поля: алго­ритм и тип токена. Тре­тий эле­мент вычис­ляет­ся на осно­вании пер­вых и зависит от выб­ранно­го алго­рит­ма. Токены могут быть переко­диро­ваны в ком­пак­тное пред­став­ление: к заголов­ку и полез­ной наг­рузке при­меня­ется алго­ритм кодиро­вания Base64-URL, пос­ле чего добав­ляет­ся под­пись и все три эле­мен­та раз­деля­ются точ­ками.

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

Оставить комментарий

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