Категория > Новости > HTB Cereal. Сканируем сайт в обход ограничений, эксплуатируем XSS в Markdown и подделываем системную учетку Windows - «Новости»
HTB Cereal. Сканируем сайт в обход ограничений, эксплуатируем XSS в Markdown и подделываем системную учетку Windows - «Новости»6-06-2021, 00:02. Автор: Cramer |
Hack The Box. На ее примере я покажу, как обходить X-Rate-Limit-Limit при сканировании веб‑сайта. Заодно ты узнаешь, как с помощью XSS в Markdown и десериализации объекта С# получить удаленное выполнение кода. После чего поработаем с технологией GraphQL и подделаем учетную запись System в Windows при помощи привилегии SeImpersonate Privilege.warningПодключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками. РазведкаСканирование портовIP машины —
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-сертификате указано доменное имя
10.10.10.217 source.cereal.htb
Сканирование вебаТеперь выполняем запрос в браузере, и нас переносит с 80-го порта на 443-й, затем заставляют подтвердить, что мы принимаем риски, связанные с безопасностью. Опасность будет происходить как раз от нас, так что без проблем подтверждаем. И попадаем на форму авторизации. Форма авторизации на сайте cereal.htb Если же обратиться по найденному доменному имени, то получим ошибку Ошибка на сайте source.cereal.htb Нам не доступно почти ничего интересного, а значит, следует прибегнуть к перебору каталогов. Для этого есть такие программы, как 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
А вот что означает каждый параметр:
Но при попытке перебрать скрытые каталоги на сайте Запрос в Burp Repeater В ответе видим заголовки
Из этого сработал Запрос в Burp Repeater с использованием заголовка X-Real-Ip Сканируем повторно, уже с использованием
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, поскольку он умеет исключать из вывода ответы в зависимости от их размера (опция
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.pl -s -v -u https://source.cereal.htb/.git/
Результат сканирования Git-репозиторияДавай глянем историю коммитов. Для анализа и разбора репозиториев Git я обычно использую Gitk. Просматривая код Код Services/UserService.cs (ключ JWT)Код Services/UserService.cs (формирование JWT) JSON Web Token состоит из трех частей: заголовка (header), полезной нагрузки (payload) и подписи. Заголовок и полезная нагрузка представляют собой объекты JSON, а нагрузка может быть любой — это именно те критические данные, которые передаются приложению. У заголовка есть следующие поля:
Третий элемент вычисляется на основании первых двух и зависит от выбранного алгоритма. Токены могут быть перекодированы в компактное представление: к заголовку и полезной нагрузке применяется алгоритм кодирования Base64-URL, после чего добавляется подпись и все три элемента разделяются точками. Вот пример токена, взятый из Википедии. Пример структуры JWT Попробуем сгенерировать себе токен. Для этого нам понадобится либо приложение jwt_tool, либо сервис jwt.io. Я использовал jwt_tool. Так как с заголовком все ясно, давай разберемся с данными: ключ
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У нас есть токен для доступа, но страница Класс RequestФункции requestCereal и getCerealRequests Анализируя исходники далее, узнаем и сами параметры из файла Функция render Перейти обратно к новости |