Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этой статье я покажу, как с помощью SQL-инъекции получить исходные коды приложения, затем проэксплуатируем уязвимость загрузки и обработки файлов, а под конец поищем путь к повышению привилегий через мониторинг запускаемых пользователем процессов. Все это потребуется, чтобы пройти среднюю по сложности машину Writer с площадки Hack The Box.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts
:
10.10.10.101 writer.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
).
Результат работы скрипта
Находим четыре открытых порта:
Справка: брутфорс учеток
Поскольку в начале у нас нет учетных данных, нет и смысла изучать службы, которые всегда требуют авторизации (например, SSH). Единственное, что мы можем делать здесь, — это перебирать пароли брутфорсом, но у машин с HTB почти всегда есть другое прохождение. В жизни таких вариантов может не быть, к тому же есть шансы подобрать пароль или получить его при помощи социальной инженерии.
Посмотрим, что мы сможем узнать об SMB без учетных данных. Для этого достаточно всего одной команды:
enum4linux -a writer.htb
Полученные пользователи
Из интересной информации — два имени пользователей kyle
и john
.
Заглянем на главную страницу сайта. Здесь ничего интересного нет, разве что имена авторов над каждым постом. В таких случаях нужно искать дополнительные страницы при помощи слепого перебора. Просканируем директории в корневом каталоге сайта с помощью ffuf.
ffuf -u http://writer.htb/FUZZ -fc 403 -t 200 -w directory_2.3_medium.txt
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-w
— словарь (используем directory-list-2.3-medium из набора SecLists);
-t
— количество потоков;
-u
— URL;
-fc
— исключить из результата ответы с кодом 403.
Результат сканирования файлов
Помимо известных нам страниц, мы нашли вход в админку. Там нас ждет форма авторизации.
Форма авторизации
Так как сайт самописный, я решил протестировать обход аутентификации для разных технологий. Начал, конечно же, с SQL-инъекции. Переводим запрос в Burp Intruder и подставляем список нагрузок и в поле логина, и в поле пароля (у меня свой список, но их полно на GitHub). В результате находим последовательности, которые возвращают меньше данных, чем все остальные.
Перебор нагрузок с помощью Burp Intruder
Это работает, так как, скорее всего, на стороне сервера используется SQL-запрос вроде такого (код примерный):
select __ from __ where username='$_POST["username"]' and password=''$_POST["password"]'
При использовании нагрузки admin' #
мы превращаем его в запрос вида select __ from __ where username='admin'
, так как решетка — это символ, обозначающий в SQL начало комментария. Используем эту нагрузку и получаем доступ к админке сайта.
Страница администратора сайта
Из интересного на странице лишь форма загрузки файлов. Однако прежде, чем изучать ее, я решил вернуться к SQL-инъекции. Из нее явно можно выжать что‑то еще! Давай потестируем форму авторизации и отправим на перебор словарь с другими нагрузками. Получим несколько результатов.
Тестирование boolean based инъекций
Тестирование UNION based инъекций
Инъекции типа boolean и UNION based дают положительный результат. Опираясь на первую, мы можем построить «вопросительный» запрос и сможем получать ответы о том, верно или неверно какое‑то наше предположение. UNION based инъекции помогают извлекать за один запрос большие объемы данных. Поэтому выбираем второй тип.
При этом мы уже знаем количество столбцов в используемой таблице — их шесть. Давай определим, данные из каких столбцов выводятся в ответе. Для этого в каждом столбце передадим уникальную последовательность и поищем ее в получаемой странице. При записи нагрузки в Burp выделим ее и нажмем Ctrl-U для URL-кодирования.
UNION ALL SELECT 888,8888,88888,888888,8888888,88888888 #
Определение целевого столбца таблицы
По количеству восьмерок определяем второй столбец! Теперь проверим тип данных. Например, вот такой строкой:
UNION ALL SELECT 888,"TEST_SQL",88888,888888,8888888,88888888#
Тестирование строчного типа данных
Как мы видим, строка отобразилась в ответе. Получим имеющиеся базы данных. Чтобы объединить несколько строк в одну, используем функции concat
или group_concat
.
UNION ALL SELECT 1,concat(':::',schema_name),3,4,5,6 from information_schema.schemata #
Базы данных
Теперь получим таблицы из таблицы writer
. Чтобы не копировать данные каждый раз, можно использовать Burp Inspector. Тогда кодировка будет выполняться автоматически.
asd' UNION ALL SELECT 1,group_concat(0x7c,table_name,0x7c),3,4,5,6 from information_schema.tableas WHERE table_schema = 'writer'#
Таблицы
Получаем таблицы. Скорее всего, в users
сможем найти учетные данные. Давай узнаем имена столбцов из этой таблицы.
asd' UNION ALL SELECT 1,group_concat(0x7c,column_name,0x7c),3,4,5,6 from information_schema.columns WHERE table_name = 'users'#
Имена столбцов в таблице users
Отлично, имеем username и password. Дампим пароли.
asd' UNION ALL SELECT 1,group_concat(0x7c,password,0x7c),3,4,5,6 from users#
Хеш пароля пользователя
Получаем хеш. Только есть одна загвоздка — он нам ничего не дает. Поэтому нужно снова менять вектор атаки. Попробуем читать файлы с сервера, к примеру из /etc/passwd
.
asd' UNION ALL SELECT 1,LOAD_FILE('/etc/passwd'),3,4,5,6#
Содержимое файла /etc/passwd
Запрос успешно обработан, и мы получаем все содержимое файла.
Так как мы можем читать файлы на сервере, следующий наш шаг — получить и проанализировать исходные коды сайта. Чтобы узнать путь к файлам сайта, взглянем на файл конфигураций Apache /etc/apache2/sites-enabled/000-default.conf
.
asd' UNION ALL SELECT 1,LOAD_FILE("/etc/apache2/sites-enabled/000-default.conf"),3,4,5,6#
Файл конфигураций Apache
Источник: xakep.ru