Категория > Новости > HTB Writer. Ломаем приложение на Django, чтобы захватить веб-сервер - «Новости»

HTB Writer. Ломаем приложение на Django, чтобы захватить веб-сервер - «Новости»


15-12-2021, 00:00. Автор: Kendal
Hack The Box.

warning


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



 

Разведка


 

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


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


10.10.10.101 writer.htb

И запус­каем ска­ниро­вание пор­тов.



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


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


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


ports=$(nmap -p- --min-rate=500 $1 | grep^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1

Он дей­ству­ет в два эта­па. На пер­вом про­изво­дит­ся обыч­ное быс­трое ска­ниро­вание, на вто­ром — более тща­тель­ное, с исполь­зовани­ем име­ющих­ся скрип­тов (опция -A).



HTB Writer. Ломаем приложение на Django, чтобы захватить веб-сервер - «Новости»
Ре­зуль­тат работы скрип­та

На­ходим четыре откры­тых пор­та:



  • 22 — служ­ба OpenSSH 8.2p1;

  • 80 — веб‑сер­вер Apache 2.4.1;

  • 139 — служ­ба NetBIOS;

  • 445 — служ­ба smbd 4.6.2.


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


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



 

Служба SMB


Пос­мотрим, что мы смо­жем узнать об SMB без учет­ных дан­ных. Для это­го дос­таточ­но все­го одной коман­ды:


enum4linux -awriter.htb
По­лучен­ные поль­зовате­ли

Из инте­рес­ной информа­ции — два име­ни поль­зовате­лей kyle и john.


 

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


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


ffuf -uhttp://writer.htb/FUZZ -fc 403 -t 200 -wdirectory_2.3_medium.txt


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


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


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




  • -w — сло­варь (исполь­зуем directory-list-2.3-medium из набора SecLists);


  • -t — количес­тво потоков;


  • -u — URL;


  • -fc — исклю­чить из резуль­тата отве­ты с кодом 403.


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

По­мимо извес­тных нам стра­ниц, мы наш­ли вход в админку. Там нас ждет фор­ма авто­риза­ции.


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

Точка входа


Так как сайт самопис­ный, я решил про­тес­тировать обход аутен­тифика­ции для раз­ных тех­нологий. Начал, конеч­но же, с SQL-инъ­екции. Перево­дим зап­рос в Burp Intruder и под­став­ляем спи­сок наг­рузок и в поле логина, и в поле пароля (у меня свой спи­сок, но их пол­но на GitHub). В резуль­тате находим пос­ледова­тель­нос­ти, которые воз­вра­щают мень­ше дан­ных, чем все осталь­ные.


Пе­ребор наг­рузок с помощью Burp Intruder

Это работа­ет, так как, ско­рее все­го, на сто­роне сер­вера исполь­зует­ся SQL-зап­рос вро­де такого (код при­мер­ный):


При исполь­зовании наг­рузки admin' # мы прев­раща­ем его в зап­рос вида select __ from __ where username='admin', так как решет­ка — это сим­вол, обоз­нача­ющий в SQL начало ком­мента­рия. Исполь­зуем эту наг­рузку и получа­ем дос­туп к админке сай­та.


Стра­ница адми­нис­тра­тора сай­та

Из инте­рес­ного на стра­нице лишь фор­ма заг­рузки фай­лов. Одна­ко преж­де, чем изу­чать ее, я решил вер­нуть­ся к SQL-инъ­екции. Из нее явно мож­но выжать что‑то еще! Давай потес­тиру­ем фор­му авто­риза­ции и отпра­вим на перебор сло­варь с дру­гими наг­рузка­ми. Получим нес­коль­ко резуль­татов.


Тес­тирова­ние boolean based инъ­екций
Тес­тирова­ние UNION based инъ­екций

Инъ­екции типа boolean и UNION based дают положи­тель­ный резуль­тат. Опи­раясь на пер­вую, мы можем пос­тро­ить «воп­роситель­ный» зап­рос и смо­жем получать отве­ты о том, вер­но или невер­но какое‑то наше пред­положе­ние. UNION based инъ­екции помога­ют извле­кать за один зап­рос боль­шие объ­емы дан­ных. Поэто­му выбира­ем вто­рой тип.


При этом мы уже зна­ем количес­тво стол­бцов в исполь­зуемой таб­лице — их шесть. Давай опре­делим, дан­ные из каких стол­бцов выводят­ся в отве­те. Для это­го в каж­дом стол­бце переда­дим уни­каль­ную пос­ледова­тель­ность и поищем ее в получа­емой стра­нице. При записи наг­рузки в Burp выделим ее и наж­мем Ctrl-U для URL-кодиро­вания.


UNION ALL SELECT 888,8888,88888,888888,8888888,88888888 #
Оп­ределе­ние целево­го стол­бца таб­лицы

По количес­тву вось­мерок опре­деля­ем вто­рой стол­бец! Теперь про­верим тип дан­ных. Нап­ример, вот такой стро­кой:


UNION ALL SELECT 888,"TEST_SQL",88888,888888,8888888,88888888#
Тес­тирова­ние строч­ного типа дан­ных

Как мы видим, стро­ка отоб­разилась в отве­те. Получим име­ющиеся базы дан­ных. Что­бы объ­еди­нить нес­коль­ко строк в одну, исполь­зуем фун­кции concat или group_concat.


UNION ALL SELECT 1,concat(':::',schema_name),3,4,5,6 from information_schema.schemata #
Ба­зы дан­ных

Те­перь получим таб­лицы из таб­лицы writer. Что­бы не копиро­вать дан­ные каж­дый раз, мож­но исполь­зовать Burp Inspector. Тог­да кодиров­ка будет выпол­нять­ся авто­мати­чес­ки.


asd' UNION ALL SELECT 1,group_concat(0x7c,table_name,0x7c),3,4,5,6 from information_schema.tableas WHERE table_schema = 'writer'#
Таб­лицы

По­луча­ем таб­лицы. Ско­рее все­го, в users смо­жем най­ти учет­ные дан­ные. Давай узна­ем име­на стол­бцов из этой таб­лицы.


asd' UNION ALL SELECT 1,group_concat(0x7c,column_name,0x7c),3,4,5,6 from information_schema.columns WHERE table_name = 'users'#
Име­на стол­бцов в таб­лице users

От­лично, име­ем username и password. Дам­пим пароли.


asd' UNION ALL SELECT 1,group_concat(0x7c,password,0x7c),3,4,5,6 from users#
Хеш пароля поль­зовате­ля

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


asd' UNION ALL SELECT 1,LOAD_FILE('/etc/passwd'),3,4,5,6#
Со­дер­жимое фай­ла /etc/passwd

Зап­рос успешно обра­ботан, и мы получа­ем все содер­жимое фай­ла.


 

Точка опоры


Так как мы можем читать фай­лы на сер­вере, сле­дующий наш шаг — получить и про­ана­лизи­ровать исходные коды сай­та. Что­бы узнать путь к фай­лам сай­та, взгля­нем на файл кон­фигура­ций Apache /etc/apache2/sites-enabled/000-default.conf.


asd' UNION ALL SELECT 1,LOAD_FILE("/etc/apache2/sites-enabled/000-default.conf"),3,4,5,6#
Файл кон­фигура­ций Apache

Перейти обратно к новости