Мониторинг появления новых субдоменов в реальном времени


При тестировании на проникновение веб-ресурса одной из стратегий является взлом периметра. У больших компаний с развитой веб структурой могут быть сетевые узлы, которые активно не используются и не поддерживаются — попросту говоря, о которых все забыли. С одной стороны, такие узлы могут быть более уязвимы для атак из-за устаревшего программного обеспечения или просто потому, что они не предполагались для работы с внешними пользователями (в production). Но при этом они могут быть подключены к локальной сети и методами сетевого pivoting’а можно через них продолжить сбор информации и атаки узлов в production через локальную сеть.

Связанная статья: Сетевой pivoting: понятие, примеры, техники, инструменты

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

Некоторые из рассмотренных в этих статьях инструментов применяют анализ логов Certificate Transparency. Кроме поиска давно существующих субдоменов, Certificate Transparency можно применять для обнаружения субдоменов при их появлении практически в реальном времени! Именно этому и посвящена данная статья — мы рассмотрим, как узнавать о субдоменах сразу при их появлении, какие инструменты для этого есть и в каких случаях эта техника будет работать.

Начнём со знакомства с Certificate Transparency. В следующем разделе информация из Википедии.

Certificate Transparency

Что такое Certificate Transparency

Certificate Transparency (CT, прозрачность сертификатов) — это стандарт безопасности в Интернете и платформа с открытым исходным кодом для мониторинга и аудита цифровых сертификатов. Стандарт создаёт систему общедоступных журналов, которые стремятся в конечном итоге записывать все сертификаты, выданные общественно доверенными центрами сертификации, что позволяет эффективно идентифицировать ошибочно или злонамеренно выданные сертификаты.

Прозрачность сертификата описана в экспериментальном RFC 6962.

С 2021 года прозрачность сертификата является обязательной для всех сертификатов TLS, но не для других типов сертификатов.

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

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

Журналы прозрачности сертификата

Прозрачность сертификата зависит от проверяемых журналов прозрачности сертификата. Журнал добавляет новые сертификаты к постоянно растущему хэш-дереву Меркла. Чтобы считаться правильно работающим, журнал должен:

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

Журнал может принимать сертификаты, которые ещё не полностью действительны, и сертификаты, срок действия которых истёк.

Смотрите также: OpenSSL: принципы работы, создание сертификатов, аудит

Мониторы прозрачности сертификатов

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

Аудиторы прозрачности сертификатов

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

Certificate Transparency понятным языком

1. Все выпущенные TLS сертификаты необходимо записывать в журнал Certificate Transparency. Если не записать сертификат в журнал, то он не будет считаться действительным даже при соблюдении всех других условий.

2. Журнал выпущенных TLS сертификатов является публичным для всех.

Из этого следует, что как только я выпущу сертификат для субдомена project2.hackware.ru

информация о данном сертификате сразу попадает в обще доступный журнал


и информация о субдомене project2.hackware.ru становится общедоступной.

В результате, как только я получил сертификат для project2.hackware.ru, то даже если я не успел что-либо настроить по адресу project2.hackware.ru, то об этом поддомене уже известно любому желающему.

В этом и есть вся суть рассматриваемой в данной статье методике.

Ограничения данной методики

Очевидно, что для субдоменов, работающих по протоколу HTTP (то есть для которых TLS сертификат не выпускается вовсе), данный метод поиска поддоменов неприменим. Он применим только для субдоменов использующих HTTPS протокол.

Также если для субдоменов не регистрируются отдельные сертификаты, а работа происходит с сертификатом с подстановочным символом (например, *.hackware.ru), то данная техника также не даст результатов.

Почему компании выпускают сертификаты для субдоменов вместо использования подстановочного символа?

Кстати, может возникнуть вопрос, а зачем выпускать отдельные сертификаты для каждого субдомена если можно выпустить один сертификат с подстановочным символом (например, *.hackware.ru) который будет охватывать сразу все субдомены?

Вы можете посмотреть в свойствах сертификата сайта HackWare.ru, что здесь используется именно сертификат с подстановочным символом.

Почему, например, системные администраторы yandex.ru не такие «умные» и «не додумались» выпустить один сертификат *.yandex.ru и использовать его вообще для всего?

Дело в том, что в крупных организациях трудно гарантировать отсутствие утечек и если утекёт приватный ключ от разработчика отвечающего за второстепенное направление третьесортной услуги для какого-нибудь домена eda.kino.dostavka.yandex.ru, то это одно, а если утекёт приватный ключ для *.yandex.ru, включающий в том числе субдомены passport.yandex.ru, mail.yandex.ru и прочее, то это намного серьёзнее. Утечка приватного ключа для сертификата *.yandex.ru будет означать возможность выполнять атаки человек-посередине для основного домена и всех субдоменов, при этом в веб-браузере соединение будет показано как безопасное (зелёный замочек)!


По этой причине организации всегда стараются выпускать отдельные сертификаты для субдоменов. Информация об этих субдоменах записывается в публичный журнал. Что для нас означает, что мы можем узнать о них ровно в тот момент, когда выпущен сертификат (создан субдомен).

Где посмотреть журналы Certificate Transparency

Официальный сайт Certificate Transparency https://certificate.transparency.dev/ имеет список компаний выполняющих мониторинг, а также список предоставляющих доступ к журналам.


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

Инструмент для мониторинга новых субдоменов (выпуска новых сертификатов TLS)

Список выпущенных сертификатов для ДОМЕНА можно получить парсингом ссылки вида https://crt.sh/?q=ДОМЕН. Если вы предпочитаете работать с форматом JSON, то используйте ссылку вида https://crt.sh/?q=ДОМЕН&output=json.

Алгоритм очень простой:

  1. Получаем список субдоменов по ссылке https://crt.sh/?q=ДОМЕН и сохраняем их в файл
  2. Время от времени вновь получаем список поддоменов по ссылке https://crt.sh/?q=ДОМЕН и сравниваем их с уже имеющимися
  3. Если обнаружены новые субдомены, то выводим их на экран
  4. Если доменов несколько, то повторяем эту процедуру для каждого из них

Это несложная задача и для её автоматизации можно написать свой собственный Bash скрипт в несколько строк. Но я повёлся на то, что имеется готовый инструмент Sublert. Он в исходном виде просто не работает, пришлось потратить на него довольно много времени, но всё-таки удалось разобраться.

Установка Sublert в Kali Linux

sudo apt install git python3 python3-termcolor python3-tld python3-requests python3-dnspython python3-psycopg2 python3-tld
git clone https://github.com/yassineaboukir/sublert && cd sublert

Если возникнет ошибка

Traceback (most recent call last):
  File "/home/mial/bin/sublert/sublert.py", line 16, in <module>
    from tld.utils import update_tld_names
ImportError: cannot import name 'update_tld_names' from 'tld.utils' (/usr/lib/python3/dist-packages/tld/utils.py)

То выполните следующие команды:

sudo apt install python3-pip
sudo pip3 install tld==0.9.6

Установка Sublert в BlackArch

sudo pacman -S sublert

Патч Sublert

В своём исходном виде Sublert при обнаружении новых субдоменов отправляет их через Slack. Я не знаю, что это такое и мне не нравится идея использовать сторонние сервисы, поэтому сейчас мы изменим код программы так, чтобы она выводила полученные результаты прямо в стандартный вывод. Если вас устраивает работа с Slack, то обратитесь к официальной инструкции: https://medium.com/@yassineaboukir/automated-monitoring-of-subdomains-for-fun-and-profit-release-of-sublert-634cfc5d7708

Откройте файл config.py — у пользователей Kali Linux этот файл в той же папке, куда они скачали Sublert, у пользователей BlackArch этот файл находится по пути /usr/share/sublert/config.py:

sudo gedit /usr/share/sublert/sublert.py

В этом файле найдите фрагмент

            url = "https://" + url.replace('+ ', '')
            rev_url.append(get_fld(url))
            data = "{}:new: {}".format(at_channel(), url)
            slack(data)

и весь его замените на

            print (url)

Следующая проблема: Sublert использует два способа получения данных из журнала:

1) подключение к базе данных


2) если первый способ не удался, то просто парсится адрес вида https://crt.sh/?q=ДОМЕН&output=json

Так вот, при подключении к БД программа НЕ ВИДИТ новые субдомены. Я не знаю в чём проблема, но без следующего изменения программа будет работать, но даже при появлении субдоменов ничего вам не покажет.

Итак в файле sublert.py найдите и полностью удалите следующий фрагмент:

        try:
            #connecting to crt.sh postgres database to retrieve subdomains.
            unique_domains = set()
            domain = domain.replace('%25.', '')
            conn = psycopg2.connect("dbname={0} user={1} host={2}".format(DB_NAME, DB_USER, DB_HOST))
            conn.autocommit = True
            cursor = conn.cursor()
            cursor.execute("SELECT ci.NAME_VALUE NAME_VALUE FROM certificate_identity ci WHERE ci.NAME_TYPE = 'dNSName' AND reverse(lower(ci.NAME_VALUE)) LIKE reverse(lower('%{}'));".format(domain))
            for result in cursor.fetchall():
                matches = re.findall(r"\'(.+?)\'", str(result))
                for subdomain in matches:
                    try:
                        if get_fld("https://" + subdomain) == domain:
                            unique_domains.add(subdomain.lower())
                    except: pass
            return sorted(unique_domains)
        except:

В Kali Linux для запуска укажите путь до файла sublert.py:

python3 sublert.py -u ДОМЕН

В BlackArch запускать так:

sudo sublert -u ДОМЕН

Для добавления новых доменов в мониторинг используйте опцию -u, например:

python3 sublert.py -u yandex.ru
sudo sublert -u yandex.ru

Вам будет показан запрос, хотите ли вы просмотреть список найденных субдоменов (введите «Y» для «Да» или «N» для «Нет»):

Если вы не хотите, чтобы каждый раз предлагалось вывести список субдоменов, то используйте опцию -q false, например:

sudo sublert -u wise.com -q false
sudo sublert -u hackware.ru -q false
sudo sublert -u paysend.com -q false

Чтобы показать список всех доменов для мониторинга выпуска новых сертификатов, выполните команду

sublert -a

Для того, чтобы проверить выпуск новых сертификатов для субдоменов выполните команду:

sudo sublert

Если новых субдоменов не найдено, будет показано:

[!] Done.

Если найдены новые субдомены, то будет выведена строка (хотя на самом деле в Slack ничего не отправляется):

[!] Exporting the result to Slack. Please don't interrupt!

А также будут показаны найденные поддомены.

Как вы можете обратить внимание, найден субдомен project2reloaded.hackware.ru, для которого я создал поддомен и получил сертификат непосредственно перед запуском скрипта.

Вы можете вручную запускать скрипт, либо настроить автоматический запуск с помощью Cron и отправку уведомлений вам по email или другим способом.

Связанная статья: Настройка cron в Arch Linux / BlackArch

На странице-карточке программы Sublert https://kali.tools/?p=6651 вы найдёте полный список опций. Из них обратите внимание на следующие:

  -u ЦЕЛЬ, --url ЦЕЛЬ
                        Домен для мониторинга. Например: yahoo.com (по умолчанию: None)
  -q true|false, --question true|false
                        Запросы к пользователю для ввода (по умолчанию: True)
  -d ДОМЕН, --delete ДОМЕН
                        Домен для удаления из списка мониторинга. Например: yahoo.com (по умолчанию: None)
  -t ПОТОКИ, --threads ПОТОКИ
                        Число одновременно используемых потоков. По умолчанию: 10
  -a, --list
                        Показать все наблюдаемые домены.
  -m, --reset
                        Всё сбросить в начальное состояние.

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *