Yesterday

Мониторинг изменений инфраструктуры: уведомления о новых поддоменах, сертификатах, изменениях в DNS

Мониторинг изменений инфраструктуры: уведомления о новых поддоменах, сертификатах, изменениях в DNS

Инфраструктура организации не статична. Появляются новые поддомены, меняются IP-адреса, выпускаются новые сертификаты, обновляются технологии. Для специалиста по техническому OSINT отслеживание этих изменений критически важно: новые поддомены могут раскрыть неанонсированные проекты, свежие сертификаты — указать на новые серверы, а изменения в DNS — на смену хостинг-провайдера или CDN. Мониторинг изменений позволяет реагировать на появление новых активов в реальном времени, не дожидаясь, пока они будут обнаружены случайно. Данная статья посвящена методам и инструментам мониторинга инфраструктуры, а также настройке автоматических уведомлений.

Зачем мониторить изменения?

Типы мониторинга изменений

Этап 1: Мониторинг поддоменов через crt.sh и CertSpotter

crt.sh позволяет выполнять поиск новых сертификатов для домена. Поскольку каждый новый сертификат (и соответственно, поддомен) попадает в CT-логи, crt.sh — идеальный источник для обнаружения новых поддоменов.

Алгоритм мониторинга:

  1. Ежедневно выполнять запрос к crt.sh: ?q=%.example.com&output=json.
  2. Сравнивать полученный список доменов с предыдущим.
  3. При появлении новых — отправлять уведомление.

Пример скрипта для мониторинга поддоменов через crt.sh:

import requests
import json
import time
import hashlib

def get_subdomains(domain):
    url = f"https://crt.sh/?q=%25.{domain}&output=json"
    try:
        resp = requests.get(url, timeout=30)
        if resp.status_code == 200:
            data = resp.json()
            subdomains = set()
            for entry in data:
                name = entry.get('name_value', '')
                if name.endswith(f'.{domain}') or name == domain:
                    subdomains.add(name.lower())
            return sorted(subdomains)
    except Exception as e:
        print(f"Ошибка crt.sh: {e}")
    return []

def monitor_subdomains(domain, state_file='subdomains_state.json'):
    # Загрузка предыдущего состояния
    try:
        with open(state_file, 'r') as f:
            previous = set(json.load(f))
    except:
        previous = set()
    
    # Получение текущего состояния
    current = set(get_subdomains(domain))
    
    # Поиск изменений
    new = current - previous
    removed = previous - current
    
    if new:
        print(f"Новые поддомены: {', '.join(new)}")
        # Здесь отправка уведомления
    if removed:
        print(f"Удалены: {', '.join(removed)}")
    
    # Сохранение состояния
    with open(state_file, 'w') as f:
        json.dump(list(current), f)
    
    return new, removed

# Запуск ежедневно
monitor_subdomains('example.com')

CertSpotter — сервис, который автоматически отслеживает новые сертификаты для указанных доменов и присылает уведомления по email. Бесплатно до 10 доменов.

Как настроить CertSpotter:

  1. Зарегистрироваться на sslmate.com/certspotter.
  2. Добавить домены для мониторинга.
  3. Получать уведомления о новых сертификатах (с указанием SAN и даты истечения).

Этап 2: Мониторинг DNS-изменений

Изменения DNS-записей могут указывать на смену хостинга, добавление новых сервисов или изменение почтовой инфраструктуры.

Инструменты для мониторинга DNS:

Собственный скрипт для мониторинга DNS-записей(пример):

import dns.resolver
import json
import time

def get_dns_records(domain, record_types=['A', 'MX', 'TXT', 'NS', 'CNAME']):
    records = {}
    for rtype in record_types:
        try:
            answers = dns.resolver.resolve(domain, rtype)
            records[rtype] = [str(r) for r in answers]
        except:
            records[rtype] = []
    return records

def monitor_dns(domain, state_file='dns_state.json'):
    try:
        with open(state_file, 'r') as f:
            previous = json.load(f)
    except:
        previous = {}
    
    current = get_dns_records(domain)
    
    changes = {}
    for rtype in set(previous.keys()) | set(current.keys()):
        prev = previous.get(rtype, [])
        curr = current.get(rtype, [])
        if set(prev) != set(curr):
            changes[rtype] = {
                'old': prev,
                'new': curr
            }
    
    if changes:
        print(f"DNS изменения для {domain}:")
        for rtype, change in changes.items():
            print(f"  {rtype}: {change['old']} → {change['new']}")
        # здесь отправка уведомления
    
    with open(state_file, 'w') as f:
        json.dump(current, f)
    
    return changes

# Запуск
monitor_dns('example.com')

Этап 3: Мониторинг SSL-сертификатов

Новые SSL-сертификаты часто появляются при запуске новых серверов или обновлении старых.

CertSpotter (см. выше) — лучший бесплатный способ мониторинга.

Альтернатива: регулярный запрос к crt.sh с фильтром по дате:

https://crt.sh/?q=%.example.com&exclude=expired&limit=100&output=json

Скрипт для отслеживания сертификатов, истекающих в ближайшее время:

import requests
from datetime import datetime, timedelta

def get_expiring_certs(domain, days=30):
    url = f"https://crt.sh/?q=%25.{domain}&output=json"
    resp = requests.get(url)
    if resp.status_code == 200:
        data = resp.json()
        expiring = []
        now = datetime.now()
        for entry in data:
            if len(entry) < 5:
                continue
            valid_to = entry[4]  # дата истечения
            if valid_to:
                try:
                    exp_date = datetime.strptime(valid_to, '%Y-%m-%dT%H:%M:%S')
                    if (exp_date - now).days < days:
                        expiring.append({
                            'name': entry[1],
                            'expires': valid_to
                        })
                except:
                    pass
        return expiring
    return []

expiring = get_expiring_certs('example.com', 30)
for cert in expiring:
    print(f"Сертификат для {cert['name']} истекает {cert['expires']}")

Этап 4: Мониторинг изменений контента сайта

Изменения на сайте (новые страницы, обновлённый текст, новые файлы) могут указывать на новые проекты, изменения в стратегии или утечку информации.

Инструменты для мониторинга изменений страниц:

Пример использования Changedetection.io (Docker):

docker run -d --name changedetection -p 5000:5000 ghcr.io/dgtlmoon/changedetection.io

Затем через веб-интерфейс добавить URL для мониторинга, настроить интервал проверки и канал уведомлений.

Собственный скрипт мониторинга контента (с хэшированием)

import requests
import hashlib
import json
import time

def fetch_page_hash(url):
    try:
        resp = requests.get(url, timeout=10)
        return hashlib.sha256(resp.text.encode()).hexdigest()
    except:
        return None

def monitor_url(url, state_file='url_state.json'):
    try:
        with open(state_file, 'r') as f:
            state = json.load(f)
            previous_hash = state.get(url)
    except:
        previous_hash = None
    
    current_hash = fetch_page_hash(url)
    if current_hash and current_hash != previous_hash:
        print(f"Страница {url} изменилась!")
        # уведомление
        state[url] = current_hash
        with open(state_file, 'w') as f:
            json.dump(state, f)
        return True
    return False

# Мониторинг нескольких страниц
urls = ['https://example.com', 'https://example.com/about']
for url in urls:
    monitor_url(url)

Этап 5: Мониторинг WHOIS-изменений

Изменения в WHOIS (смена владельца, регистратора, дат) могут указывать на продажу домена или смену контактов.

Инструменты:

  • DomainTools (платный мониторинг).
  • WhoisXML API (есть платный мониторинг).
  • Собственные скрипты через whois и сравнение.

Пример мониторинга WHOIS (с использованием python-whois):

import whois
import json
import time

def get_whois_info(domain):
    try:
        w = whois.whois(domain)
        return {
            'registrar': w.registrar,
            'creation_date': str(w.creation_date),
            'expiration_date': str(w.expiration_date),
            'name_servers': w.name_servers,
            'emails': w.emails
        }
    except:
        return None

def monitor_whois(domain, state_file='whois_state.json'):
    try:
        with open(state_file, 'r') as f:
            previous = json.load(f)
    except:
        previous = {}
    
    current = get_whois_info(domain)
    if current and current != previous:
        print(f"WHOIS для {domain} изменился!")
        # Здесь уведомление
        with open(state_file, 'w') as f:
            json.dump(current, f)
        return True
    return False

monitor_whois('example.com')

Этап 6: Мониторинг технологического стека (Wappalyzer)

Изменения в технологиях могут указывать на обновление CMS, переход на новый фреймворк.

Метод: периодически запускать Wappalyzer CLI и сравнивать результаты.

Пример (через subprocess):

import subprocess
import json

def get_tech_stack(url):
    result = subprocess.run(['wappalyzer', url], capture_output=True, text=True)
    if result.returncode == 0:
        return json.loads(result.stdout)
    return None

# Сравнение результатов за разные даты

Этап 7: Мониторинг через агрегаторы (SecurityTrails, Censys)

SecurityTrails предлагает функцию мониторинга (Alerts) для платных подписок. Вы можете отслеживать:

  • Новые поддомены.
  • Изменения в DNS-записях.
  • Изменения в WHOIS.

Censys позволяет отслеживать изменения в сертификатах и открытых портах.

Этап 8: Настройка уведомлений

После обнаружения изменений важно получать уведомления в удобном формате.

Способы уведомлений:

  • Email (через smtplib в Python или сервисы типа SendGrid).
  • Telegram Bot (см. код ниже).
  • Slack / Discord (вебхуки).
  • SMS (платные сервисы).
  • Pushover (мобильные уведомления).

Пример уведомления через Telegram-бота:

import requests

def send_telegram_alert(token, chat_id, message):
    url = f"https://api.telegram.org/bot{token}/sendMessage"
    payload = {
        'chat_id': chat_id,
        'text': message
    }
    requests.post(url, json=payload)

# Использование
send_telegram_alert('YOUR_BOT_TOKEN', 'YOUR_CHAT_ID', 'Обнаружены новые поддомены: dev.example.com, test.example.com')

Этап 9: Полный конвейер мониторинга

Для эффективного мониторинга все инструменты можно объединить в единый конвейер:

  1. Ежедневный запуск (через cron или Task Scheduler).
  2. Проверка поддоменов (crt.sh, SecurityTrails).
  3. Проверка DNS (собственный скрипт).
  4. Проверка SSL-сертификатов (CertSpotter / crt.sh).
  5. Проверка контента (Changedetection.io / собственный скрипт).
  6. Проверка WHOIS (собственный скрипт).
  7. Сбор изменений в единый отчёт.
  8. Отправка уведомления (Telegram, Email).

Пример крона для ежедневного запуска:

0 8 * * * /usr/bin/python3 /path/to/monitor_all.py

Практический пример: мониторинг компании-конкурента

Задача: отслеживать изменения в инфраструктуре конкурента compete.com.

  1. Настройка CertSpotter для compete.com и *.compete.com → получение уведомлений о новых сертификатах.
  2. Ежедневный скрипт для crt.sh → запись всех поддоменов, сравнение с предыдущим днём. При появлении нового отправка в Telegram.
  3. Мониторинг DNS → раз в неделю проверка A, MX, TXT записей. При изменении — уведомление.
  4. Мониторинг сайтаChangedetection.io для главной страницы и страницы /careers (появление новых вакансий может указывать на расширение).
  5. Обнаружение: спустя неделю появился поддомен app.compete.com. В сертификате указан AWS CloudFront. Это указывает на запуск нового веб-приложения. Мониторинг подтверждает, что сайт стал доступен.
  6. Вывод: компания запускает новый продукт. Информация может быть использована для анализа конкурентной среды.

Инструменты для мониторинга (сводная таблица)

  • Мониторинг публичных данных (DNS, сертификаты, поддомены, WHOIS) легален.
  • Использование автоматизированных скриптов для частых запросов к crt.sh или другим сервисам должно соответствовать их условиям использования (не превышать лимиты).
  • Если вы мониторите конкурента, не нарушайте законы о коммерческой тайне и не используйте методы, требующие несанкционированного доступа.

Мониторинг изменений инфраструктуры — это непрерывный процесс, позволяющий быть в курсе всех изменений в цифровых активах цели. Комбинация автоматических скриптов (crt.sh, DNS, WHOIS), готовых сервисов (CertSpotter, Changedetection) и уведомлений (Telegram) создаёт систему раннего обнаружения новых поддоменов, сертификатов, DNS-записей и контента. Это позволяет оперативно реагировать на появление новых проектов, смену хостинга и другие изменения, важные для технической разведки.