О чем статья
Продолжаем рассказывать об утилитах, которыми пользуются красные команды. Сегодня рассмотрим Gobuster: поговорим о вариантах установки, режимах работы инструмента и типовых ошибках, а также проведем тестовую атаку и обсудим способы защиты.
Gobuster — это инструмент для брутфорса, написанный на Go. Он компилируется на множестве платформ, работает быстрее интерпретируемых скриптов и не требует специальной среды выполнения. С помощью Gobuster можно брутфорсить:
- URI (директории и файлы) на веб-сайтах;
- DNS-субдомены (с поддержкой подстановочных символов);
- Имена виртуальных хостов на целевых веб-серверах;
- Открытые бакеты Amazon S3 и Google Cloud;
- ТFTP-серверы.
Варианты применения Gobuster:
- Поиск скрытых директорий и файлов на веб-сайтах.
- Проверка веб-приложений на устойчивость к словарным атакам на поддиректории и файлы.
- Поиск уязвимостей в веб-приложениях: неправильных конфигураций серверов, незащищенных директорий, файлов с чувствительной информацией и др.
- Регулярное сканирование сайтов для выявления потенциально опасных ресурсов.
- Анализ веб-приложений в рамках пентестов.
Статья носит исключительно информационный характер и не является инструкцией или призывом к совершению противоправных действий. Авторы не несут ответственности за использование опубликованной информации. Помните, что нужно следить за защищенностью своих данных.
Установка
Kali Linux
Все просто: вводим команду gobuster, и, если утилита не установлена, система сама предложит это исправить.
Debian 11
Для начала накатываем версию Go от 1.19 и выше, а затем ставим саму утилиту: go install github.com/OJ/gobuster/v3@latest.
Теперь добавим утилиту в переменную окружения PATH, чтобы консоль знала команду gobuster. Для этого используем export PATH=$PATH:~/go/bin (см. рис. 3). Отметим, что команду стоит добавить в самый низ файла ~/.bashrc, чтобы после перелогина не приходилось заново добавлять путь.
Docker
Встроенный образ для Docker можно забрать с помощью команды docker pull ghcr.io/oj/gobuster:latest. Далее вводим gobuster -h, чтобы посмотреть возможные команды (см. рис. 4).
Словари
Для работы утилиты нужны словари (wordlists). Это списки часто используемых выражений: пароли, директории и т. д. Возьмем словари с Kali, DNS, а также с S3-бакетами.
- Словари с Kali находим на GitHub: git clone https://github.com/00xBAD/kali-wordlists
- Словарь с DNS забираем из интернета (берем поменьше, чтобы перебор заканчивался быстрее): wget https://gist.githubusercontent.com/six2dez/a307a04a222fab5a57466c51e1569acf/raw. Для удобства переименовываем словарь: mv raw dns-small.txt (см. рис. 5)
- Словарь для S3 также находим в сети: git clone https://github.com/koaj/aws-s3-bucket-wordlist
Режимы работы Gobuster
Теперь рассмотрим основные режимы работы утилиты. Конфигурация тестового стенда, который мы будем использовать, представлена на рис. 6.
Dir
С помощью режима Dir мы можем пройтись по директориям и форматам файлов. Обязательно используем опции -u и -w для указания адреса сайта и словаря, а с помощью -x задаем интересующие нас форматы файлов.
Попробуем забрутфорсить наше веб-приложение OWASP Juice Shop (подробнее — в предыдущей статье): gobuster dir -u http://10.0.2.1:3000/ -w ~/wordlists/kali-wordlists/dirbuster/directory-list-2.3-small.txt -x .txt,json.
Утилита выдает ошибку. В чем причина? Сначала Gobuster отправляет запрос на несуществующий URL-адрес, чтобы проверить ответ сервера: это необходимо для предотвращения ложных срабатываний. Сервер должен возвращать ошибку 404 для несуществующих ресурсов и 200 ОК для существующих, но в зависимости от конфигурации можно встретить и другие коды состояния.
Если Gobuster получает код 200 ОК при проверке несуществующего URL, возникает ошибка. Это значит, что утилита не может отличить ложноположительный код. Подробнее процесс возникновения ошибки можно отследить с помощью Wireshark (см. рис. 8).
Попробуем исправить ситуацию. Утилита подсказывает, что нужно исключить из запроса либо статус 200 ОК, либо размер страницы (3748 байт). В первом случае мы получим на выходе слишком мало информации, поэтому выбираем второй: добавляем к исходной команде опцию --exclude-length 3748.
Запускаем брутфорс: gobuster dir -u http://10.0.2.1:3000/ -w ~/wordlists/kali-wordlists/dirbuster/directory-list-2.3-small.txt -x .txt,.json --exclude-length 3748.
Сработало! Отметим, что скорость поиска напрямую зависит от размера используемого словаря. Кроме того, процесс можно ускорить или замедлить с помощью опции -t, которая отвечает за количество потоков (по умолчанию значение -t равно 10).
Теперь попробуем открыть рандомный файл или директорию в надежде обнаружить там что-то интересное — например, /security.txt.
Далее запускаем брутфорс по найденным директориям (к примеру, для /assets используем адрес 10.0.2.1:3000/assets). Снова обратимся к Wireshark и посмотрим на трафик: видим множество TCP- и HTTP-пакетов, в последних сразу замечаем GET-запросы с файлами и директориями из словаря (см. рис. 11).
Также мы можем посмотреть другие доступные команды с помощью gobuster dir --help (см. рис. 12).
DNS
Этот режим нужен для обнаружения поддоменов. Доступные опции можно посмотреть с помощью команды gobuster dns --help (см. рис. 18).
Попробуем запустить перебор у сайта dom.ru. Используем для этого словарь с DNS: gobuster dns -d dom.ru -w ~/wordlists/dns-small.txt -t 50.
Отметим, что в режиме DNS для указания домена применяется опция -d, а не -u. Кроме того, мы используем уже упомянутую опцию -t для ускорения поиска.
В результате видим ошибку, указывающую, что DNS-сервер вернул одинаковые IP-адреса для каждого домена. Причина в том, что на сервере используется Wildcard DNS, отвечающий за поддомены.
Утилита отправляет на сервер сгенерированный несуществующий домен, а далее мы видим его IP-адрес в ответе: мол, все в порядке (см. рис. 16). После этого Gobuster прекращает работу, чтобы не выводить ложные поддомены.
Можно проигнорировать эту ошибку, как и подсказывает сама утилита. Для этого добавляем в запрос опцию --wildcard: gobuster dns -q -d dom.ru -w ~/wordlists/dns-small.txt -t 50 --wildcard -o results.txt. Обратите внимание на -q и -o: первая опция убирает из вывода лишнюю информацию, а вторая используется для указания файла, в который будет записываться результат.
В итоге находим несколько поддоменов, но не все из них будут рабочими, поскольку Gobuster больше не распознает фейки. Если обратимся к трафику, то сначала увидим наши DNS-запросы (см. рис. 23), а затем ответы сервера (см. рис. 18–19).
Из-за опции --wildcard ответы с IP-адреса 188.186.157.51 не выводятся. К примеру, в списке есть поддомен billing, но нет administrator, потому что с него в самом начале поступил ответ на несуществующий поддомен.
Наконец, проверим, что вывод записался в указанный ранее файл.
VHost
VHost, как и DNS, используется для обнаружения поддоменов. Разница в том, что в этом режиме Gobuster проверяет поддомены путем посещения сформированных URL и проверки IP-адресов, а не отправляет DNS-запросы.
Используем те же словари, что и в режиме DNS, и просканируем dom.ru: gobuster vhost -q -u https://dom.ru/ -w dns-small.txt -t 2 --exclude-length 0. Используем опцию --exclude-length 0, чтобы исключить пустые записи.
Отметим, что Gobuster считает найденным каждый домен из словаря. Причин может быть несколько:
- Тот самый Wildcard DNS на сервере.
- На сайте настроен редирект: с любого запроса поддомена на конкретный домен.
- Сайт настроен так, чтобы любой запрошенный поддомен считался доступным.
При анализе трафика видим, что сначала утилита отправляет DNS-запрос, чтобы узнать IP-адрес домена. После устанавливается TCP-соединение с сервером и начинается передача данных с использованием TLS (см. рис. 23).
В режиме VHost есть важная опция --append-domain. Без нее Gobuster будет использовать домены из словаря без добавления основного домена, как в нашем случае. Дополняем запрос: gobuster vhost -q -u https://dom.ru/ -w ~/dns-small.txt -t 2 --append-domain --exclude-length 0.
Готово! Теперь в выводе нет каждого поддомена из списка, при этом мы получаем трафик с аналогичной структурой (см. рис. 25).
S3
Этот режим служит для обнаружения открытых S3-бакетов (у них уникальные имена, поэтому необходим отдельный словарь). Запускаем утилиту: gobuster s3 -w aws-s3-bucket-wordlist/list.txt -q -t 10.
Сразу же видим поток DNS-трафика (см. рис. 27).
После получения IP-адресов начинается установка TCP-соединения (см. рис. 28).
Далее устанавливается TLS-соединение и начинается передача данных (см. рис. 29).
GCS
Принцип тот же, что и у S3, но GCS подходит для Google Cloud (примечательно, что словарь менять не нужно). Запускаем утилиту: gobuster gcs -w aws-s3-bucket-wordlist/list.txt -q -t 10.
Сразу видим результаты и получаем трафик со структурой, как в режиме S3 (см. рис. 31).
Fuzz
Режим для фаззинга. В наличии те же опции, что и у DIR, — нужно только добавить ключевое слово FUZZ в место, куда будем внедрять словарь. Для проверки режима используем специальный сайт ffuf.io.fi.
Запускаем утилиту: gobuster fuzz -u https://ffuf.io.fi/FUZZ -w kali-wordlists/wfuzz/general/test.txt -t 100 -q.
Видим, что утилита считает успешными результаты страницы с кодом 404. Исключим этот код с помощью опции -b. Также можно попробовать воспользоваться другими словарями:
- gobuster fuzz -u http://ffuf.io.fi/FUZZ -w kali-wordlists/wfuzz/general/common.txt -q -b 404
- gobuster fuzz -u http://ffuf.io.fi/FUZZ -w kali-wordlists/wfuzz/general/admin-panels.txt -t 100 -q -b 404
TFTP
Режим для поиска файлов на TFTP-сервере. Чтобы провести тест, устанавливаем TFTP-сервер на Deb12-2 и создаем небольшой словарь на три слова (названия файлов на сервере): test, maslo, cactus.
Запустим утилиту: gobuster tftp -s 10.0.2.2 -w tftp-test.txt -q. Опция -s служит для указания цели, то есть TFTP-сервера.
Файлы найдены! При анализе трафика видим TFTP-запросы на чтение указанных в словаре файлов. Если файла нет, сервер возвращает ошибку.
Пример атаки
Для проведения тестовой атаки берем лабораторную работу Three с Hack The Box и открываем их машину в браузере через Pwnbox. Для начала используем Nmap, чтобы просканировать открытые TCP-порты.
Открыты порты 80 и 22: заходим на сайт и видим страницу музыкальной группы.
Внизу страницы есть контакты, в том числе email с доменом thetoppers.htb.
Добавим соответствующую запись в /etc/hosts вместе с адресом, чтобы получить доступ к домену в браузере.
Теперь поищем поддомены с помощью Gobuster.
Находим несколько поддоменов, добавляем первый в /etc/hosts.
Открываем страницу поддомена и видим, что она содержит только данные в формате JSON.
Теперь настроим AWS CLI (можно ввести любые данные).
Проверяем cli и видим файлы в хранилище.
Находим thetoppers.htb и проверяем содержимое.
Видим только index.php, значит, у нас есть возможность загрузить файл на сервер! Для этого пишем скрипт <?php system($_GET["cmd"]);?> в файл shell.php и загружаем его в хранилище.
Теперь на запрос файла shell.php приходит ответ 200.
Попробуем ввести команду ls: ответ приходит, значит, теперь мы можем выполнять любые команды на сервере. Задача выполнена!
Рекомендации по защите
В целом
- Регулярно обновляйте ПО.
- Мониторьте журналы для выявления подозрительной активности.
- Укажите директории, которые требуют аутентификации или запрета доступа: location в nginx и Require в Apache.
- Избегайте предсказуемых названий директорий и файлов.
- Проводите пентесты!
Режим Dir
- Используйте механизмы аутентификации и авторизации, чтобы ограничить доступ к чувствительным директориям.
- Отслеживайте ошибки 404 для выявления попыток сканирования.
Режим DNS
- Ограничьте количество запросов с одного IP-адреса для предотвращения DDoS и сканирования.
- Включите ограничение скорости для DNS-запросов.
Режим VHOST
- Убедитесь, что виртуальные хосты настроены корректно, при необходимости откажитесь от записей Wildcard DNS.
- Внимательно мониторьте логи веб-сервера.
Режим S3
- Убедитесь, что бакеты настроены с учетом принципов least privilege.
- Включите мониторинг событий для выявления подозрительной активности.
Режим GCS
- Установите права доступа к Google Cloud Storage с учетом принципов least privilege.
- Включите мониторинг событий для выявления подозрительной активности.
Режим TFTP
- Это не слишком-то безопасный протокол, так что остается молиться :)