Содержание статьи
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
IP машины — 10.
, добавляем его в /
.
10.10.10.217 cereal.htb
И переходим к сканированию портов:
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1
В результате работы скрипта узнаем список открытых портов и работающих служб:
- порт 22 (TCP) — служба SSH;
- порт 80 (HTTP) — веб‑сервер Microsoft IIS/10.0;
- порт 443 (HTTPS) — веб‑сервер Microsoft IIS/10.0.
SSH пока что пропускаем, поскольку учетных данных у нас нет. Веб‑сервер с 80-го порта перенаправляет на 443-й порт. При этом в SSL-сертификате указано доменное имя source.
— тоже добавляем его в /
.
10.10.10.217 source.cereal.htb
Сканирование веба
Теперь выполняем запрос в браузере, и нас переносит с 80-го порта на 443-й, затем заставляют подтвердить, что мы принимаем риски, связанные с безопасностью. Опасность будет происходить как раз от нас, так что без проблем подтверждаем. И попадаем на форму авторизации.
Если же обратиться по найденному доменному имени, то получим ошибку Server
.
Нам не доступно почти ничего интересного, а значит, следует прибегнуть к перебору каталогов. Для этого есть такие программы, как dirsearch, DIRB и gobuster, который я и использую, поскольку он показал себя как самый быстрый.
Вот команда, которую я использовал:
gobuster dir -t 128 -u https://cereal.htb/ -k -w /usr/share/seclists/Discovery/Web-Content/raft-large-words-lowercase.txt -x php,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-Originating-IP: 127.0.0.1
- X-Forwarded-For: 127.0.0.1
- X-Remote-IP: 127.0.0.1
- X-Remote-Addr: 127.0.0.1
- X-Client-IP: 127.0.0.1
- X-Real-Ip: 127.0.0.
- X-Host: 127.0.0.1
- X-Forwared-Host: 127.0.0.1
Из этого сработал X-Real-Ip
: если добавить этот заголовок, то в ответе будут отсутствовать хедеры X-Rate-Limit-Limit
и X-Rate-Limit-Remaining
.
Сканируем повторно, уже с использованием X-Real-Ip
(опция -H
), и сталкиваемся с другой проблемой: сервер на запросы несуществующих страниц не отвечает кодом ошибки, а радостно возвращает 200
(«Успешный результат»).
gobuster dir -t 128 -u https://cereal.htb/ -k -w /usr/share/seclists/Discovery/Web-Content/raft-large-words-lowercase.txt -x php,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 -u https://cereal.htb/FUZZ -fs 1948
Находим только одну страницу, которая предположительно должна принимать определенные параметры. Для сканирования другого сайта, где нам встретилась ошибка, используем gobuster, благо там нет никаких блокировщиков.
gobuster dir -t 128 -u https://source.cereal.htb/ -k -w /usr/share/seclists/Discovery/Web-Content/raft-large-words-lowercase.txt -x php,html,aspx --timeout 30s
Нам попался каталог .
, а это значит, что мы можем попытаться скачать весь репозиторий.
Точка входа
Для загрузки репозиториев я обычно использую пакет скриптов dvcs-ripper. Запускаем rip-git
со следующими аргументами:
-
-s
— не проверять сертификат; -
-v
— вести логирование; -
-u
— URL репозитория.
./rip-git.pl -s -v -u https://source.cereal.htb/.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 ; echoecho -n '{"alg": "HS256", "typ":"JWT"}' | base64 -w0 ; echopython3 jwt_tool.py -b -S hs256 -p 'secretlhfIH&FY*#oysuflkhskjfhefesf' [заголовок].[данные].
У нас есть токен для доступа, но страница requests
требует параметры в формате JSON, о чем свидетельствуют класс Request
в файле Models/
и функция requestCereal
из файла ClientApp/
.
Анализируя исходники далее, узнаем и сами параметры из файла ClientApp/
.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»