Light mode

Утилиты red team: Gobuster

  • #RedTeams

О чем статья

Продолжаем рассказывать об утилитах, которыми пользуются красные команды. Сегодня рассмотрим Gobuster: поговорим о вариантах установки, режимах работы инструмента и типовых ошибках, а также проведем тестовую атаку и обсудим способы защиты.

Gobuster — это инструмент для брутфорса, написанный на Go. Он компилируется на множестве платформ, работает быстрее интерпретируемых скриптов и не требует специальной среды выполнения. С помощью Gobuster можно брутфорсить:

  • URI (директории и файлы) на веб-сайтах;
  • DNS-субдомены (с поддержкой подстановочных символов);
  • Имена виртуальных хостов на целевых веб-серверах;
  • Открытые бакеты Amazon S3 и Google Cloud;
  • ТFTP-серверы.

Варианты применения Gobuster:

  • Поиск скрытых директорий и файлов на веб-сайтах.
  • Проверка веб-приложений на устойчивость к словарным атакам на поддиректории и файлы. 
  • Поиск уязвимостей в веб-приложениях: неправильных конфигураций серверов, незащищенных директорий, файлов с чувствительной информацией и др.
  • Регулярное сканирование сайтов для выявления потенциально опасных ресурсов.
  • Анализ веб-приложений в рамках пентестов.

Статья носит исключительно информационный характер и не является инструкцией или призывом к совершению противоправных действий. Авторы не несут ответственности за использование опубликованной информации. Помните, что нужно следить за защищенностью своих данных.

Установка

Kali Linux

Все просто: вводим команду gobuster, и, если утилита не установлена, система сама предложит это исправить.

Рисунок 1. Установка на Kali Linux

Debian 11

Для начала накатываем версию Go от 1.19 и выше, а затем ставим саму утилиту: go install github.com/OJ/gobuster/v3@latest.

Рисунок 2. Установка на Debian 11 

Теперь добавим утилиту в переменную окружения PATH, чтобы консоль знала команду gobuster. Для этого используем export PATH=$PATH:~/go/bin (см. рис. 3). Отметим, что команду стоит добавить в самый низ файла ~/.bashrc, чтобы после перелогина не приходилось заново добавлять путь.

Рисунок 3. Добавляем утилиту в переменную окружения PATH 

Docker

Встроенный образ для Docker можно забрать с помощью команды docker pull ghcr.io/oj/gobuster:latest. Далее вводим gobuster -h, чтобы посмотреть возможные команды (см. рис. 4).

Рисунок 4. Команды gobuster

Словари

Для работы утилиты нужны словари (wordlists). Это списки часто используемых выражений: пароли, директории и т. д. Возьмем словари с Kali, DNS, а также с S3-бакетами.

Рисунок 5. Устанавливаем и переименовываем словарь с DNS

Режимы работы Gobuster

Теперь рассмотрим основные режимы работы утилиты. Конфигурация тестового стенда, который мы будем использовать, представлена на рис. 6.

Рисунок 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

Рисунок 7. Ошибка утилиты

Утилита выдает ошибку. В чем причина? Сначала Gobuster отправляет запрос на несуществующий URL-адрес, чтобы проверить ответ сервера: это необходимо для предотвращения ложных срабатываний. Сервер должен возвращать ошибку 404 для несуществующих ресурсов и 200 ОК для существующих, но в зависимости от конфигурации можно встретить и другие коды состояния.

Если Gobuster получает код 200 ОК при проверке несуществующего URL, возникает ошибка. Это значит, что утилита не может отличить ложноположительный код. Подробнее процесс возникновения ошибки можно отследить с помощью Wireshark (см. рис. 8).

Рисунок 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.

Рисунок 9. Успешный брутфорс

Сработало! Отметим, что скорость поиска напрямую зависит от размера используемого словаря. Кроме того, процесс можно ускорить или замедлить с помощью опции -t, которая отвечает за количество потоков (по умолчанию значение -t равно 10).

Теперь попробуем открыть рандомный файл или директорию в надежде обнаружить там что-то интересное — например, /security.txt.

Рисунок 10. Содержимое /security.txt

Далее запускаем брутфорс по найденным директориям (к примеру, для /assets используем адрес 10.0.2.1:3000/assets). Снова обратимся к Wireshark и посмотрим на трафик: видим множество TCP- и HTTP-пакетов, в последних сразу замечаем GET-запросы с файлами и директориями из словаря (см. рис. 11). 

Рисунок 11. Анализируем трафик

Также мы можем посмотреть другие доступные команды с помощью gobuster dir --help (см. рис. 12).

Рисунок 12. Доступные команды: режим Dir

DNS

Этот режим нужен для обнаружения поддоменов. Доступные опции можно посмотреть с помощью команды gobuster dns --help (см. рис. 18).

Рисунок 13. Доступные команды: режим DNS

Попробуем запустить перебор у сайта dom.ru. Используем для этого словарь с DNS: gobuster dns -d dom.ru -w ~/wordlists/dns-small.txt -t 50.

Отметим, что в режиме DNS для указания домена применяется опция -d, а не -u. Кроме того, мы используем уже упомянутую опцию -t для ускорения поиска.

Рисунок 14. Утилита выдает ошибку

В результате видим ошибку, указывающую, что DNS-сервер вернул одинаковые IP-адреса для каждого домена. Причина в том, что на сервере используется Wildcard DNS, отвечающий за поддомены. 

Рисунок 15. Трафик

Утилита отправляет на сервер сгенерированный несуществующий домен, а далее мы видим его IP-адрес в ответе: мол, все в порядке (см. рис. 16). После этого Gobuster прекращает работу, чтобы не выводить ложные поддомены. 

Рисунок 16. Ответ сервера

Можно проигнорировать эту ошибку, как и подсказывает сама утилита. Для этого добавляем в запрос опцию --wildcard: gobuster dns -q -d dom.ru -w ~/wordlists/dns-small.txt -t 50 --wildcard -o results.txt. Обратите внимание на -q и -o: первая опция убирает из вывода лишнюю информацию, а вторая используется для указания файла, в который будет записываться результат.

Рисунок 17. Успешный поиск

В итоге находим несколько поддоменов, но не все из них будут рабочими, поскольку Gobuster больше не распознает фейки. Если обратимся к трафику, то сначала увидим наши DNS-запросы (см. рис. 23), а затем ответы сервера (см. рис. 18–19).

Рисунок 18. DNS-запросы 
Рисунок 19. Ответы сервера

Из-за опции --wildcard ответы с IP-адреса 188.186.157.51 не выводятся. К примеру, в списке есть поддомен billing, но нет administrator, потому что с него в самом начале поступил ответ на несуществующий поддомен.

Рисунок 20. Поддомены billing и administrator

Наконец, проверим, что вывод записался в указанный ранее файл.

Рисунок 21. Вывод записывается в файл

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, чтобы исключить пустые записи.

Рисунок 22. Запрос в режиме VHost

Отметим, что Gobuster считает найденным каждый домен из словаря. Причин может быть несколько:

  • Тот самый Wildcard DNS на сервере.
  • На сайте настроен редирект: с любого запроса поддомена на конкретный домен.
  • Сайт настроен так, чтобы любой запрошенный поддомен считался доступным. 

При анализе трафика видим, что сначала утилита отправляет DNS-запрос, чтобы узнать IP-адрес домена. После устанавливается TCP-соединение с сервером и начинается передача данных с использованием TLS (см. рис. 23).

 Рисунок 23. Анализируем трафик

В режиме VHost есть важная опция --append-domain. Без нее Gobuster будет использовать домены из словаря без добавления основного домена, как в нашем случае. Дополняем запрос: gobuster vhost -q -u https://dom.ru/ -w ~/dns-small.txt -t 2 --append-domain --exclude-length 0.

Рисунок 24. Обновленный вывод

Готово! Теперь в выводе нет каждого поддомена из списка, при этом мы получаем трафик с аналогичной структурой (см. рис. 25).

Рисунок 25. Обновленный трафик

S3

Этот режим служит для обнаружения открытых S3-бакетов (у них уникальные имена, поэтому необходим отдельный словарь). Запускаем утилиту: gobuster s3 -w aws-s3-bucket-wordlist/list.txt -q -t 10.

Рисунок 26. Запрос в режиме S3

Сразу же видим поток DNS-трафика (см. рис. 27).

Рисунок 27. Поток DNS-трафика 

После получения IP-адресов начинается установка TCP-соединения (см. рис. 28).

Рисунок 28. Установка TCP-соединения 

Далее устанавливается TLS-соединение и начинается передача данных (см. рис. 29).

Рисунок 29. Трафик в режиме S3

GCS

Принцип тот же, что и у S3, но GCS подходит для Google Cloud (примечательно, что словарь менять не нужно). Запускаем утилиту: gobuster gcs -w aws-s3-bucket-wordlist/list.txt -q -t 10.

Рисунок 30. Сканирование в режиме GCS 

Сразу видим результаты и получаем трафик со структурой, как в режиме S3 (см. рис. 31).

Рисунок 31. Трафик в режиме GCS 

Fuzz

Режим для фаззинга. В наличии те же опции, что и у DIR, — нужно только добавить ключевое слово FUZZ в место, куда будем внедрять словарь. Для проверки режима используем специальный сайт ffuf.io.fi.

Запускаем утилиту: gobuster fuzz -u https://ffuf.io.fi/FUZZ -w kali-wordlists/wfuzz/general/test.txt -t 100 -q.

Рисунок 32. Запрос в режиме Fuzz

Видим, что утилита считает успешными результаты страницы с кодом 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
Рисунок 33. Результаты брутфорса 
Рисунок 34. Трафик в режиме Fuzz

TFTP

Режим для поиска файлов на TFTP-сервере. Чтобы провести тест, устанавливаем TFTP-сервер на Deb12-2 и создаем небольшой словарь на три слова (названия файлов на сервере): test, maslo, cactus.

Рисунок 35. Словарь 

Запустим утилиту: gobuster tftp -s 10.0.2.2 -w tftp-test.txt -q. Опция -s служит для указания цели, то есть TFTP-сервера.

Рисунок 36. Запрос в режиме TFTP

Файлы найдены! При анализе трафика видим TFTP-запросы на чтение указанных в словаре файлов. Если файла нет, сервер возвращает ошибку.

Рисунок 37. Трафик в режиме TFTP

Пример атаки

Для проведения тестовой атаки берем лабораторную работу Three с Hack The Box и открываем их машину в браузере через Pwnbox. Для начала используем Nmap, чтобы просканировать открытые TCP-порты.

Рисунок 38. Сканируем открытые порты 

Открыты порты 80 и 22: заходим на сайт и видим страницу музыкальной группы.

Рисунок 39. Страница музыкальной группы 

Внизу страницы есть контакты, в том числе email с доменом thetoppers.htb.

Рисунок 40. Контактные данные на сайте

Добавим соответствующую запись в /etc/hosts вместе с адресом, чтобы получить доступ к домену в браузере.

Рисунок 41. Добавляем запись в /etc/hosts 
Рисунок 42. Домен в браузере 

Теперь поищем поддомены с помощью Gobuster.

Рисунок 43. Запускаем утилиту 

Находим несколько поддоменов, добавляем первый в /etc/hosts.

Рисунок 44. Добавляем поддомен в  /etc/hosts 

Открываем страницу поддомена и видим, что она содержит только данные в формате JSON.

Рисунок 45. Страница поддомена 

Теперь настроим AWS CLI (можно ввести любые данные).

Рисунок 46. Настройка AWS CLI 

Проверяем cli и видим файлы в хранилище. 

Рисунок 47. Файлы в хранилище 

Находим thetoppers.htb и проверяем содержимое.

 Рисунок 48. Содержимое thetoppers.htb 

Видим только index.php, значит, у нас есть возможность загрузить файл на сервер! Для этого пишем скрипт <?php system($_GET["cmd"]);?> в файл shell.php и загружаем его в хранилище.

 Рисунок 49. Загружаем shell.php в хранилище 

Теперь на запрос файла shell.php приходит ответ 200.

Рисунок 50. Получаем код 200 ОК

Попробуем ввести команду ls: ответ приходит, значит, теперь мы можем выполнять любые команды на сервере. Задача выполнена!

Рисунок 51. Тестируем команду ls 
Рисунок 52. Схема атаки

Рекомендации по защите

В целом

  • Регулярно обновляйте ПО.
  • Мониторьте журналы для выявления подозрительной активности.
  • Укажите директории, которые требуют аутентификации или запрета доступа: location в nginx и Require в Apache.
  • Избегайте предсказуемых названий директорий и файлов.
  • Проводите пентесты! 

Режим Dir

  • Используйте механизмы аутентификации и авторизации, чтобы ограничить доступ к чувствительным директориям.
  • Отслеживайте ошибки 404 для выявления попыток сканирования.

Режим DNS

  • Ограничьте количество запросов с одного IP-адреса для предотвращения DDoS и сканирования.
  • Включите ограничение скорости для DNS-запросов.

Режим VHOST

  • Убедитесь, что виртуальные хосты настроены корректно, при необходимости откажитесь от записей Wildcard DNS.
  • Внимательно мониторьте логи веб-сервера.

Режим S3

  • Убедитесь, что бакеты настроены с учетом принципов least privilege.
  • Включите мониторинг событий для выявления подозрительной активности.

Режим GCS

  • Установите права доступа к Google Cloud Storage с учетом принципов least privilege.
  • Включите мониторинг событий для выявления подозрительной активности.

Режим TFTP

  • Это не слишком-то безопасный протокол, так что остается молиться :)

Мы дěлаем Positive Research → для ИБ-экспертов, бизнеса и всех, кто интересуется ✽ {кибербезопасностью}