Свое расширение для Burp. Часть 7: Используем gobuster для поиска vhosts

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Автор petrinh1988
Источник https://xss.is


Какими бы хорошими сканерами не обладал Burp, есть огромная куча инструментов, которые лучше выполняют точечные задачи или позволяют развить атаку. Например, в Burp нет и десятой доли мощи от того же sqlmap. Поэтому, в сообществе появилось соответствующее расширение, которое позволяет интегрировать sqlmap в Burp. Но есть и другие специализированные инструменты, которые было бы неплохо научиться встраивать в инфраструктуру Burp, Один из них, gobuster. В этой статье займемся частичной интеграцией. Почему частичной? Потому что по аналогии вы сможете самостоятельно расширить интеграцию, добавляя однотипные функции. В ином случае, получится полотнище из серии “то да потому”, без смысловой нагрузки.

В этой статье, мы научимся запускать сторонние утилиты и обрабатывать их вывод в рамках расширения Burp. Для примера приведу два варианта запуска. Один из которых нужен скорее для примера, а может быть кому-то подойдет, как база для доведения до идеала. Кроме того, построим интерфейс на базе закладок, а также познакомимся с другими элементами интерфейса, например, выбором файлов. Но главное, для построения интерфейса будем использовать Apache NetBeans 22. Это бесплатная IDE для разработки на Java, которая поможет быстро и удобно собрать нужные формы в конструкторе, а после выгрузить их в виде кода. Тем самым, сильно сократив время разработки и почти полностью исключив ад)))

Vhost vs Subdomain?​

По сути, под vhost я буду подразумевать субдомен, не имеющий DNS-записи. Не получится зайти на него в браузере используя URL типа http://VHOST.domain.com, так как общедоступный DNS не знает IP-адрес связанный с этим хостом. Хотя, по факту, сам виртуальный хост существует и мы можем обратиться к нему по прямому IP или через домен, указав правильный заголовом Host.

Для понимания. Чтобы находить виртуальные хосты при помощи ffuf, строка запуска будет выглядеть примерно так ffuf -w /path/to/vhost/wordlist -u https://target -H "Host: FUZZ.target".

Ну или на примере библиотеки requests Python:

Python: Скопировать в буфер обмена
Код:
import requests
response = requests.get('https://subdomain.example.com/')

Подобный запрос спокойно получает ответ от поддомена, но получит ошибку “Failed to resolve 'subdomain.example.com' ([Errno 11001] getaddrinfo failed)” если речь идет о виртуальном хосте. К vhost получится обратиться подобным способом:

Python: Скопировать в буфер обмена
Код:
import requests
response = requests.get('https://example.com/', headers={'Host': 'subdomain.example.com'})

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

Соответственно, у gobuster есть специальный режим поиска vhost, запускается следующим образом:

Bash: Скопировать в буфер обмена
gobuster vhost [flags]

Что предстоит сделать?​

Думаю, что в целом задача ясна, просто обговорим детали. Нам потребуется интерфейс, в котором мы настроим все параметры для запуска gobuster. Читай все аргументы типа поиска “vhost”

Спойлер: Список аргументов
Bash: Скопировать в буфер обмена
Код:
Flags:
      --append-domain                     Append main domain from URL to words from wordlist. Otherwise the fully qualified domains need to be specified in the wordlist.
      --client-cert-p12 string            a p12 file to use for options TLS client certificates
      --client-cert-p12-password string   the password to the p12 file
      --client-cert-pem string            public key in PEM format for optional TLS client certificates
      --client-cert-pem-key string        private key in PEM format for optional TLS client certificates (this key needs to have no password)
  -c, --cookies string                    Cookies to use for the requests
      --domain string                     the domain to append when using an IP address as URL. If left empty and you specify a domain based URL the hostname from the URL is extracted
      --exclude-length string             exclude the following content lengths (completely ignores the status). You can separate multiple lengths by comma and it also supports ranges like 203-206
  -r, --follow-redirect                   Follow redirects
  -H, --headers stringArray               Specify HTTP headers, -H 'Header1: val1' -H 'Header2: val2'
  -h, --help                              help for vhost
  -m, --method string                     Use the following HTTP method (default "GET")
      --no-canonicalize-headers           Do not canonicalize HTTP header names. If set header names are sent as is.
  -k, --no-tls-validation                 Skip TLS certificate verification
  -P, --password string                   Password for Basic Auth
      --proxy string                      Proxy to use for requests [http(s)://host:port] or [socks5://host:port]
      --random-agent                      Use a random User-Agent string
      --retry                             Should retry on request timeout
      --retry-attempts int                Times to retry on request timeout (default 3)
      --timeout duration                  HTTP Timeout (default 10s)
  -u, --url string                        The target URL
  -a, --useragent string                  Set the User-Agent string (default "gobuster/3.6")
  -U, --username string                   Username for Basic Auth

Global Flags:
      --debug                 Enable debug output
      --delay duration        Time each thread waits between requests (e.g. 1500ms)
      --no-color              Disable color output
      --no-error              Don't display errors
  -z, --no-progress           Don't display progress
  -o, --output string         Output file to write results to (defaults to stdout)
  -p, --pattern string        File containing replacement patterns
  -q, --quiet                 Don't print the banner and other noise
  -t, --threads int           Number of concurrent threads (default 10)
  -v, --verbose               Verbose output (errors)
  -w, --wordlist string       Path to the wordlist. Set to - to use STDIN.
      --wordlist-offset int   Resume from a given position in the wordlist (defaults to 0)

Соответственно, под параметры потребуются разные компоненты Java.Swing. Где-то текстовая строка, например, для указания имени пользователя и пароля. Где-то флажок, например, для -follow-redirect. Выпадающий список для выбора типа запроса (GET, POST, etc.). Окно выбора файла для словаря или сертификата. Прогрессбар для отслеживания статуса процесса. В общем, будет с чем потренироваться. Сам интерфейс реализуем на базе Tab-ов, чтобы не возникло заморочек, если захотите расширить возможности расширения.

Стартовый URL предлагаю задавать, как просто вводом текста, так и через контекстное меню. Например, зашел пользователь в Target и кликнул на карте сайта “Искать vhosts”. Для пользования удобно и нам лишняя тренировка.

Что касается получения результатов. Хотелось бы, чтобы все происходило интерактивно и найденные виртуальные хосты, сразу добавлялись на карту сайта. С этой целью, будет считывать вывод gobuster. Примерно такой принцип работы: пользователь указал все настройки и нажал кнопку “начать сканирование”. Приложение поменяло свое состояние. С этого момента, слушаем поток вывода данных и поток ошибок. Каждую строку анализируем регулярными выражениями. Если нашли новый поддомен и у него подходящий код ответа, то вызываем метод добавления на карту сайта.

На мой взгляд, задача достаточно интересная и набор приобретаемых навыков крайне полезный. На выходе получим уже второе полноценное решение (или третье?).

Установка необходимого​

Я все делать буду на Windows, хотя нет никаких проблем все повторить в Linux. Для начала пару слов про установку gubouster, если еще не установлен. Качаем последний релиз отсюда. Распаковываем в любую папку, добавляем в системные переменные и, на всякий случай, в исключения антивируса Windows. Запускаем cmd и проверяем работоспособность, вызвав gobuster –help. Обычно проблем не возникает.

Как и писал выше, интерфейс будем собирать в Apache NetBeans. Скачать
View hidden content is available for registered users!
 
Сверху Снизу