Мониторинг изменений инфраструктуры: уведомления о новых поддоменах, сертификатах, изменениях в DNS
Мониторинг изменений инфраструктуры: уведомления о новых поддоменах, сертификатах, изменениях в DNS
Инфраструктура организации не статична. Появляются новые поддомены, меняются IP-адреса, выпускаются новые сертификаты, обновляются технологии. Для специалиста по техническому OSINT отслеживание этих изменений критически важно: новые поддомены могут раскрыть неанонсированные проекты, свежие сертификаты — указать на новые серверы, а изменения в DNS — на смену хостинг-провайдера или CDN. Мониторинг изменений позволяет реагировать на появление новых активов в реальном времени, не дожидаясь, пока они будут обнаружены случайно. Данная статья посвящена методам и инструментам мониторинга инфраструктуры, а также настройке автоматических уведомлений.
Этап 1: Мониторинг поддоменов через crt.sh и CertSpotter
crt.sh позволяет выполнять поиск новых сертификатов для домена. Поскольку каждый новый сертификат (и соответственно, поддомен) попадает в CT-логи, crt.sh — идеальный источник для обнаружения новых поддоменов.
- Ежедневно выполнять запрос к crt.sh:
?q=%.example.com&output=json. - Сравнивать полученный список доменов с предыдущим.
- При появлении новых — отправлять уведомление.
Пример скрипта для мониторинга поддоменов через 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 доменов.
- Зарегистрироваться на sslmate.com/certspotter.
- Добавить домены для мониторинга.
- Получать уведомления о новых сертификатах (с указанием 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 и сравнивать результаты.
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) для платных подписок. Вы можете отслеживать:
Censys позволяет отслеживать изменения в сертификатах и открытых портах.
После обнаружения изменений важно получать уведомления в удобном формате.
- 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: Полный конвейер мониторинга
Для эффективного мониторинга все инструменты можно объединить в единый конвейер:
- Ежедневный запуск (через cron или Task Scheduler).
- Проверка поддоменов (crt.sh, SecurityTrails).
- Проверка DNS (собственный скрипт).
- Проверка SSL-сертификатов (CertSpotter / crt.sh).
- Проверка контента (Changedetection.io / собственный скрипт).
- Проверка WHOIS (собственный скрипт).
- Сбор изменений в единый отчёт.
- Отправка уведомления (Telegram, Email).
Пример крона для ежедневного запуска:
0 8 * * * /usr/bin/python3 /path/to/monitor_all.py
Практический пример: мониторинг компании-конкурента
Задача: отслеживать изменения в инфраструктуре конкурента compete.com.
- Настройка CertSpotter для
compete.comи*.compete.com→ получение уведомлений о новых сертификатах. - Ежедневный скрипт для crt.sh → запись всех поддоменов, сравнение с предыдущим днём. При появлении нового отправка в Telegram.
- Мониторинг DNS → раз в неделю проверка A, MX, TXT записей. При изменении — уведомление.
- Мониторинг сайта → Changedetection.io для главной страницы и страницы
/careers(появление новых вакансий может указывать на расширение). - Обнаружение: спустя неделю появился поддомен
app.compete.com. В сертификате указан AWS CloudFront. Это указывает на запуск нового веб-приложения. Мониторинг подтверждает, что сайт стал доступен. - Вывод: компания запускает новый продукт. Информация может быть использована для анализа конкурентной среды.
Инструменты для мониторинга (сводная таблица)
- Мониторинг публичных данных (DNS, сертификаты, поддомены, WHOIS) легален.
- Использование автоматизированных скриптов для частых запросов к crt.sh или другим сервисам должно соответствовать их условиям использования (не превышать лимиты).
- Если вы мониторите конкурента, не нарушайте законы о коммерческой тайне и не используйте методы, требующие несанкционированного доступа.
Мониторинг изменений инфраструктуры — это непрерывный процесс, позволяющий быть в курсе всех изменений в цифровых активах цели. Комбинация автоматических скриптов (crt.sh, DNS, WHOIS), готовых сервисов (CertSpotter, Changedetection) и уведомлений (Telegram) создаёт систему раннего обнаружения новых поддоменов, сертификатов, DNS-записей и контента. Это позволяет оперативно реагировать на появление новых проектов, смену хостинга и другие изменения, важные для технической разведки.