<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Shadow</title><generator>teletype.in</generator><description><![CDATA[Shadow]]></description><image><url>https://img1.teletype.in/files/44/58/44587e5a-b44a-43bb-a0e1-c31c7ac0cf48.png</url><title>Shadow</title><link>https://teletype.in/@specialist_infosec</link></image><link>https://teletype.in/@specialist_infosec?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/specialist_infosec?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/specialist_infosec?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Tue, 07 Jul 2026 19:31:28 GMT</pubDate><lastBuildDate>Tue, 07 Jul 2026 19:31:28 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/psheasJMkJG</guid><link>https://teletype.in/@specialist_infosec/psheasJMkJG?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/psheasJMkJG?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Мониторинг изменений инфраструктуры: уведомления о новых поддоменах, сертификатах, изменениях в DNS</title><pubDate>Mon, 06 Jul 2026 05:11:38 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/13/86/1386e3cf-dbb6-410b-b229-2d238476136a.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/5d/35/5d3562b7-5004-4f7d-abda-b6e306585276.png"></img>Инфраструктура организации не статична. Появляются новые поддомены, меняются IP-адреса, выпускаются новые сертификаты, обновляются технологии. Для специалиста по техническому OSINT отслеживание этих изменений критически важно: новые поддомены могут раскрыть неанонсированные проекты, свежие сертификаты — указать на новые серверы, а изменения в DNS — на смену хостинг-провайдера или CDN. Мониторинг изменений позволяет реагировать на появление новых активов в реальном времени, не дожидаясь, пока они будут обнаружены случайно. Данная статья посвящена методам и инструментам мониторинга инфраструктуры, а также настройке автоматических уведомлений.]]></description><content:encoded><![CDATA[
  <figure id="Gequ" class="m_retina">
    <img src="https://img2.teletype.in/files/5d/35/5d3562b7-5004-4f7d-abda-b6e306585276.png" width="1102" />
  </figure>
  <h3 id="tT7R">Мониторинг изменений инфраструктуры: уведомления о новых поддоменах, сертификатах, изменениях в DNS</h3>
  <p id="NCqc">Инфраструктура организации не статична. Появляются новые поддомены, меняются IP-адреса, выпускаются новые сертификаты, обновляются технологии. Для специалиста по техническому OSINT отслеживание этих изменений критически важно: новые поддомены могут раскрыть неанонсированные проекты, свежие сертификаты — указать на новые серверы, а изменения в DNS — на смену хостинг-провайдера или CDN. Мониторинг изменений позволяет реагировать на появление новых активов в реальном времени, не дожидаясь, пока они будут обнаружены случайно. Данная статья посвящена методам и инструментам мониторинга инфраструктуры, а также настройке автоматических уведомлений.</p>
  <p id="fpSv"><strong>Зачем мониторить изменения?</strong></p>
  <figure id="5OhT" class="m_column">
    <img src="https://img2.teletype.in/files/d1/9f/d19fd63f-faf9-4b1b-9054-2eae791cf5ee.png" width="1210" />
  </figure>
  <p id="Ov5j"><strong>Типы мониторинга изменений</strong></p>
  <figure id="62bO" class="m_column">
    <img src="https://img1.teletype.in/files/8a/f4/8af402fc-ba40-4415-bf0a-0358ca89c470.png" width="1202" />
  </figure>
  <p id="WRxS"><strong>Этап 1: Мониторинг поддоменов через crt.sh и CertSpotter</strong></p>
  <p id="yJTl"><strong>crt.sh</strong> позволяет выполнять поиск новых сертификатов для домена. Поскольку каждый новый сертификат (и соответственно, поддомен) попадает в CT-логи, crt.sh — идеальный источник для обнаружения новых поддоменов.</p>
  <p id="XyoT"><strong>Алгоритм мониторинга:</strong></p>
  <ol id="dSuP">
    <li id="jv1Y">Ежедневно выполнять запрос к crt.sh: <code>?q=%.example.com&amp;output=json</code>.</li>
    <li id="TOGG">Сравнивать полученный список доменов с предыдущим.</li>
    <li id="lxHF">При появлении новых — отправлять уведомление.</li>
  </ol>
  <p id="lDAZ"><strong>Пример скрипта для мониторинга поддоменов через crt.sh:</strong></p>
  <pre id="CqNJ">import requests
import json
import time
import hashlib

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

def monitor_subdomains(domain, state_file=&#x27;subdomains_state.json&#x27;):
    # Загрузка предыдущего состояния
    try:
        with open(state_file, &#x27;r&#x27;) 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&quot;Новые поддомены: {&#x27;, &#x27;.join(new)}&quot;)
        # Здесь отправка уведомления
    if removed:
        print(f&quot;Удалены: {&#x27;, &#x27;.join(removed)}&quot;)
    
    # Сохранение состояния
    with open(state_file, &#x27;w&#x27;) as f:
        json.dump(list(current), f)
    
    return new, removed

# Запуск ежедневно
monitor_subdomains(&#x27;example.com&#x27;)</pre>
  <p id="MSr8"><strong>CertSpotter</strong> — сервис, который автоматически отслеживает новые сертификаты для указанных доменов и присылает уведомления по email. Бесплатно до 10 доменов.</p>
  <p id="24uH"><strong>Как настроить CertSpotter:</strong></p>
  <ol id="ZEyZ">
    <li id="Rrmf">Зарегистрироваться на <a href="https://sslmate.com/certspotter" target="_blank">sslmate.com/certspotter</a>.</li>
    <li id="ffwu">Добавить домены для мониторинга.</li>
    <li id="Y8e2">Получать уведомления о новых сертификатах (с указанием SAN и даты истечения).</li>
  </ol>
  <p id="s639"><strong>Этап 2: Мониторинг DNS-изменений</strong></p>
  <p id="KUsB">Изменения DNS-записей могут указывать на смену хостинга, добавление новых сервисов или изменение почтовой инфраструктуры.</p>
  <p id="mtga"><strong>Инструменты для мониторинга DNS:</strong></p>
  <figure id="2y9b" class="m_column">
    <img src="https://img1.teletype.in/files/c8/37/c83747d2-07e9-4d0f-b90d-d4483b1ceb0d.png" width="1001" />
  </figure>
  <p id="tx2b"><strong>Собственный скрипт для мониторинга DNS-записей(пример):</strong></p>
  <pre id="Ola2">import dns.resolver
import json
import time

def get_dns_records(domain, record_types=[&#x27;A&#x27;, &#x27;MX&#x27;, &#x27;TXT&#x27;, &#x27;NS&#x27;, &#x27;CNAME&#x27;]):
    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=&#x27;dns_state.json&#x27;):
    try:
        with open(state_file, &#x27;r&#x27;) 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] = {
                &#x27;old&#x27;: prev,
                &#x27;new&#x27;: curr
            }
    
    if changes:
        print(f&quot;DNS изменения для {domain}:&quot;)
        for rtype, change in changes.items():
            print(f&quot;  {rtype}: {change[&#x27;old&#x27;]} → {change[&#x27;new&#x27;]}&quot;)
        # здесь отправка уведомления
    
    with open(state_file, &#x27;w&#x27;) as f:
        json.dump(current, f)
    
    return changes

# Запуск
monitor_dns(&#x27;example.com&#x27;)</pre>
  <p id="6EiM"><strong>Этап 3: Мониторинг SSL-сертификатов</strong></p>
  <p id="qROE">Новые SSL-сертификаты часто появляются при запуске новых серверов или обновлении старых.</p>
  <p id="sYwt"><strong>CertSpotter</strong> (см. выше) — лучший бесплатный способ мониторинга.</p>
  <p id="1fUQ"><strong>Альтернатива: регулярный запрос к crt.sh с фильтром по дате:</strong></p>
  <pre id="QlnO">https://crt.sh/?q=%.example.com&amp;exclude=expired&amp;limit=100&amp;output=json</pre>
  <p id="PHcN"><strong>Скрипт для отслеживания сертификатов, истекающих в ближайшее время:</strong></p>
  <pre id="2KUX">import requests
from datetime import datetime, timedelta

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

expiring = get_expiring_certs(&#x27;example.com&#x27;, 30)
for cert in expiring:
    print(f&quot;Сертификат для {cert[&#x27;name&#x27;]} истекает {cert[&#x27;expires&#x27;]}&quot;)</pre>
  <p id="8u5H"><strong>Этап 4: Мониторинг изменений контента сайта</strong></p>
  <p id="0xtu">Изменения на сайте (новые страницы, обновлённый текст, новые файлы) могут указывать на новые проекты, изменения в стратегии или утечку информации.</p>
  <p id="VtFO"><strong>Инструменты для мониторинга изменений страниц:</strong></p>
  <figure id="aOaS" class="m_column">
    <img src="https://img2.teletype.in/files/1b/4e/1b4e0528-83d5-469d-a274-88b4c724f74a.png" width="1200" />
  </figure>
  <p id="HkBP"><strong>Пример использования <a href="https://changedetection.io/" target="_blank">Changedetection.io</a> (Docker):</strong></p>
  <pre id="nTLh">docker run -d --name changedetection -p 5000:5000 ghcr.io/dgtlmoon/changedetection.io</pre>
  <p id="SOTs">Затем через веб-интерфейс добавить URL для мониторинга, настроить интервал проверки и канал уведомлений.</p>
  <p id="eiRY"><strong>Собственный скрипт мониторинга контента (с хэшированием)</strong></p>
  <pre id="1Sxo">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=&#x27;url_state.json&#x27;):
    try:
        with open(state_file, &#x27;r&#x27;) 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&quot;Страница {url} изменилась!&quot;)
        # уведомление
        state[url] = current_hash
        with open(state_file, &#x27;w&#x27;) as f:
            json.dump(state, f)
        return True
    return False

# Мониторинг нескольких страниц
urls = [&#x27;https://example.com&#x27;, &#x27;https://example.com/about&#x27;]
for url in urls:
    monitor_url(url)</pre>
  <p id="VEeE"><strong>Этап 5: Мониторинг WHOIS-изменений</strong></p>
  <p id="wNf4">Изменения в WHOIS (смена владельца, регистратора, дат) могут указывать на продажу домена или смену контактов.</p>
  <p id="Y8D3"><strong>Инструменты:</strong></p>
  <ul id="9Pgx">
    <li id="rVQY"><strong>DomainTools</strong> (платный мониторинг).</li>
    <li id="MW33"><strong>WhoisXML API</strong> (есть платный мониторинг).</li>
    <li id="eAno"><strong>Собственные скрипты</strong> через <code>whois</code> и сравнение.</li>
  </ul>
  <p id="qNM9"><strong>Пример мониторинга WHOIS (с использованием python-whois):</strong></p>
  <pre id="R2Fh">import whois
import json
import time

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

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

monitor_whois(&#x27;example.com&#x27;)</pre>
  <p id="Md20"><strong>Этап 6: Мониторинг технологического стека (Wappalyzer)</strong></p>
  <p id="gmKD">Изменения в технологиях могут указывать на обновление CMS, переход на новый фреймворк.</p>
  <p id="KP0f"><strong>Метод:</strong> периодически запускать Wappalyzer CLI и сравнивать результаты.</p>
  <p id="Qv4W"><strong>Пример (через subprocess):</strong></p>
  <pre id="sI08">import subprocess
import json

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

# Сравнение результатов за разные даты</pre>
  <p id="zHqJ"><strong>Этап 7: Мониторинг через агрегаторы (SecurityTrails, Censys)</strong></p>
  <p id="SA2T">SecurityTrails предлагает функцию мониторинга (Alerts) для платных подписок. Вы можете отслеживать:</p>
  <ul id="rAqC">
    <li id="tzSd">Новые поддомены.</li>
    <li id="AxBP">Изменения в DNS-записях.</li>
    <li id="4XrC">Изменения в WHOIS.</li>
  </ul>
  <p id="aB7g"><strong>Censys</strong> позволяет отслеживать изменения в сертификатах и открытых портах.</p>
  <p id="sYIQ"><strong>Этап 8: Настройка уведомлений</strong></p>
  <p id="6X2c">После обнаружения изменений важно получать уведомления в удобном формате.</p>
  <p id="jPxS"><strong>Способы уведомлений:</strong></p>
  <ul id="ntWd">
    <li id="IRsc"><strong>Email</strong> (через <code>smtplib</code> в Python или сервисы типа SendGrid).</li>
    <li id="SRSx"><strong>Telegram Bot</strong> (см. код ниже).</li>
    <li id="6Hsq"><strong>Slack / Discord</strong> (вебхуки).</li>
    <li id="XZPw"><strong>SMS</strong> (платные сервисы).</li>
    <li id="vPJh"><strong>Pushover</strong> (мобильные уведомления).</li>
  </ul>
  <p id="7s9D"><strong>Пример уведомления через Telegram-бота:</strong></p>
  <pre id="snwl">import requests

def send_telegram_alert(token, chat_id, message):
    url = f&quot;https://api.telegram.org/bot{token}/sendMessage&quot;
    payload = {
        &#x27;chat_id&#x27;: chat_id,
        &#x27;text&#x27;: message
    }
    requests.post(url, json=payload)

# Использование
send_telegram_alert(&#x27;YOUR_BOT_TOKEN&#x27;, &#x27;YOUR_CHAT_ID&#x27;, &#x27;Обнаружены новые поддомены: dev.example.com, test.example.com&#x27;)</pre>
  <p id="6N81"><strong>Этап 9: Полный конвейер мониторинга</strong></p>
  <p id="J6t9">Для эффективного мониторинга все инструменты можно объединить в единый конвейер:</p>
  <ol id="Ux1V">
    <li id="Iug1"><strong>Ежедневный запуск</strong> (через cron или Task Scheduler).</li>
    <li id="eZlX"><strong>Проверка поддоменов</strong> (crt.sh, SecurityTrails).</li>
    <li id="zq6u"><strong>Проверка DNS</strong> (собственный скрипт).</li>
    <li id="FUvN"><strong>Проверка SSL-сертификатов</strong> (CertSpotter / crt.sh).</li>
    <li id="hFoy"><strong>Проверка контента</strong> (<a href="https://changedetection.io/" target="_blank">Changedetection.io</a> / собственный скрипт).</li>
    <li id="dZ4j"><strong>Проверка WHOIS</strong> (собственный скрипт).</li>
    <li id="DOVx"><strong>Сбор изменений в единый отчёт</strong>.</li>
    <li id="M1WK"><strong>Отправка уведомления</strong> (Telegram, Email).</li>
  </ol>
  <p id="QEu9"><strong>Пример крона для ежедневного запуска:</strong></p>
  <pre id="MkeQ">0 8 * * * /usr/bin/python3 /path/to/monitor_all.py</pre>
  <p id="r3s7"><strong>Практический пример: мониторинг компании-конкурента</strong></p>
  <p id="kRBz"><em>Задача:</em> отслеживать изменения в инфраструктуре конкурента <code>compete.com</code>.</p>
  <ol id="FVny">
    <li id="31M9"><strong>Настройка CertSpotter</strong> для <code>compete.com</code> и <code>*.compete.com</code> → получение уведомлений о новых сертификатах.</li>
    <li id="7CMW"><strong>Ежедневный скрипт для crt.sh</strong> → запись всех поддоменов, сравнение с предыдущим днём. При появлении нового отправка в Telegram.</li>
    <li id="UJoY"><strong>Мониторинг DNS</strong> → раз в неделю проверка A, MX, TXT записей. При изменении — уведомление.</li>
    <li id="Rlr9"><strong>Мониторинг сайта</strong> → <a href="https://changedetection.io/" target="_blank">Changedetection.io</a> для главной страницы и страницы <code>/careers</code> (появление новых вакансий может указывать на расширение).</li>
    <li id="zUNw"><strong>Обнаружение:</strong> спустя неделю появился поддомен <code>app.compete.com</code>. В сертификате указан AWS CloudFront. Это указывает на запуск нового веб-приложения. Мониторинг подтверждает, что сайт стал доступен.</li>
    <li id="ppFL"><strong>Вывод:</strong> компания запускает новый продукт. Информация может быть использована для анализа конкурентной среды.</li>
  </ol>
  <p id="RERN"><strong>Инструменты для мониторинга (сводная таблица)</strong></p>
  <figure id="v4eg" class="m_column">
    <img src="https://img1.teletype.in/files/82/8f/828f6cd1-af48-4243-a065-92298fa6e6fd.png" width="1196" />
  </figure>
  <ul id="Bykc">
    <li id="9WoA">Мониторинг публичных данных (DNS, сертификаты, поддомены, WHOIS) легален.</li>
    <li id="nHkY">Использование автоматизированных скриптов для частых запросов к crt.sh или другим сервисам должно соответствовать их условиям использования (не превышать лимиты).</li>
  </ul>
  <ul id="JUE2">
    <li id="pJrS">Если вы мониторите конкурента, не нарушайте законы о коммерческой тайне и не используйте методы, требующие несанкционированного доступа.</li>
  </ul>
  <p id="O9AX">Мониторинг изменений инфраструктуры — это непрерывный процесс, позволяющий быть в курсе всех изменений в цифровых активах цели. Комбинация автоматических скриптов (crt.sh, DNS, WHOIS), готовых сервисов (CertSpotter, Changedetection) и уведомлений (Telegram) создаёт систему раннего обнаружения новых поддоменов, сертификатов, DNS-записей и контента. Это позволяет оперативно реагировать на появление новых проектов, смену хостинга и другие изменения, важные для технической разведки.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Site-History-Analysis</guid><link>https://teletype.in/@specialist_infosec/Site-History-Analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Site-History-Analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Анализ истории сайта: Wayback Machine, изменения контента, скрытые страницы</title><pubDate>Sat, 27 Jun 2026 17:59:12 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/51/6f/516f6185-e099-45da-ac77-465dd4dbb7a1.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/aa/f8/aaf8fd7c-7439-4b18-a2d7-f476ccf27f73.png"></img>Веб-сайты постоянно меняются: дизайн обновляется, контент редактируется, страницы удаляются, а новые появляются. Однако интернет «помнит» многие из этих изменений благодаря архивам, таким как Wayback Machine. Для специалиста по техническому OSINT анализ истории сайта — это способ заглянуть в прошлое: восстановить удалённые страницы, найти забытые поддомены, обнаружить конфиденциальную информацию, которая была случайно опубликована, а затем удалена, а также проследить эволюцию политики и контента организации. Данная статья посвящена методам работы с веб-архивами, анализу изменений и поиску скрытых страниц.]]></description><content:encoded><![CDATA[
  <figure id="P6ZY" class="m_retina">
    <img src="https://img3.teletype.in/files/aa/f8/aaf8fd7c-7439-4b18-a2d7-f476ccf27f73.png" width="1102" />
  </figure>
  <h3 id="sbQM">Анализ истории сайта: Wayback Machine, изменения контента, скрытые страницы</h3>
  <p id="7bcm">Веб-сайты постоянно меняются: дизайн обновляется, контент редактируется, страницы удаляются, а новые появляются. Однако интернет «помнит» многие из этих изменений благодаря архивам, таким как Wayback Machine. Для специалиста по техническому OSINT анализ истории сайта — это способ заглянуть в прошлое: восстановить удалённые страницы, найти забытые поддомены, обнаружить конфиденциальную информацию, которая была случайно опубликована, а затем удалена, а также проследить эволюцию политики и контента организации. Данная статья посвящена методам работы с веб-архивами, анализу изменений и поиску скрытых страниц.</p>
  <p id="okS7"><strong>Зачем анализировать историю сайта?</strong></p>
  <figure id="0QXn" class="m_column">
    <img src="https://img2.teletype.in/files/da/43/da434446-5147-4d3f-b937-5ef373012460.png" width="1114" />
  </figure>
  <p id="ASRd"><strong>Основные архивы веба</strong></p>
  <figure id="fBRy" class="m_column">
    <img src="https://img2.teletype.in/files/1d/16/1d16ac4a-295b-4b69-93a1-f2083fbe1fa1.png" width="1145" />
  </figure>
  <p id="1fy2"><strong>Этап 1: Поиск истории сайта в Wayback Machine</strong></p>
  <p id="DsXl"><strong>Прямой доступ к архиву:</strong> <code>https://web.archive.org/web/*/https://example.com</code></p>
  <p id="vxBs"><strong>Что можно увидеть:</strong></p>
  <ul id="zGAA">
    <li id="ilH3">Календарь сохранений (синие кружки — даты, когда страница была сохранена).</li>
    <li id="qwcU">Выбор конкретной даты.</li>
    <li id="eW1e">Сравнение двух снимков (инструмент &quot;Compare&quot;).</li>
    <li id="dGXK">Доступ к сохранённым изображениям, CSS, JS (частично).</li>
  </ul>
  <p id="VBLJ"><strong>Основные параметры Wayback Machine API:</strong></p>
  <ul id="wqiE">
    <li id="zt79"><code>https://archive.org/wayback/available?url=https://example.com</code> — проверка, есть ли архив для URL.</li>
    <li id="gjES"><code>https://web.archive.org/cdx/search/cdx?url=example.com&amp;output=json</code> — список всех сохранений в JSON (для массового сбора).</li>
  </ul>
  <p id="zfY1"><strong>Пример API-запроса (Python):</strong></p>
  <pre id="yarb">import requests
import json

def get_wayback_snapshots(url):
    cdx_url = f&quot;https://web.archive.org/cdx/search/cdx?url={url}&amp;output=json&quot;
    resp = requests.get(cdx_url)
    if resp.status_code == 200:
        data = resp.json()
        if len(data) &gt; 1:
            snapshots = []
            for row in data[1:]:  # первая строка — заголовки
                timestamp = row[1]
                snapshot_url = f&quot;https://web.archive.org/web/{timestamp}/{url}&quot;
                snapshots.append({
                    &#x27;timestamp&#x27;: timestamp,
                    &#x27;url&#x27;: snapshot_url
                })
            return snapshots
    return []

snapshots = get_wayback_snapshots(&#x27;example.com&#x27;)
for s in snapshots[:5]:
    print(s[&#x27;timestamp&#x27;], s[&#x27;url&#x27;])</pre>
  <p id="cxWS"><strong>Этап 2: Поиск удалённых страниц и контента</strong></p>
  <p id="Zk9K">Один из основных способов использования архива — найти страницы, которые были удалены с сайта, но сохранились в Wayback Machine.</p>
  <p id="15wh"><strong>Методика:</strong></p>
  <ol id="LwMa">
    <li id="spP2">Определить URL-шаблоны (например, <code>/blog/</code>, <code>/docs/</code>, <code>/downloads/</code>).</li>
    <li id="dOaN">Искать в архиве конкретные URL.</li>
    <li id="U896">Использовать оператор <code>*</code> для поиска всех сохранённых страниц с определённым префиксом.</li>
  </ol>
  <p id="JwKO"><strong>Пример поиска всех файлов <code>.pdf</code> в архиве:</strong></p>
  <pre id="NFdG">https://web.archive.org/web/*/https://example.com/*.pdf</pre>
  <p id="QvhU"><strong>Поиск всех страниц в подкаталоге:</strong></p>
  <pre id="kPkI">https://web.archive.org/web/*/https://example.com/docs/*</pre>
  <p id="QqoA"><strong>Этап 3: Обнаружение скрытых страниц через архивы</strong></p>
  <p id="TrqB">Скрытые страницы — те, на которые нет ссылок с главной, но они могут существовать и быть проиндексированы архивом.</p>
  <p id="6ZJn"><strong>Где искать скрытые страницы:</strong></p>
  <ul id="7uDr">
    <li id="uemy"><code>/admin</code>, <code>/login</code>, <code>/backup</code>, <code>/test</code>, <code>/dev</code>, <code>/staging</code>, <code>/old</code>, <code>/temp</code>, <code>/private</code>.</li>
    <li id="l3PW">Панели управления: <code>/cpanel</code>, <code>/webmail</code>, <code>/plesk</code>, <code>/phpmyadmin</code>.</li>
    <li id="CIrm">Файлы конфигурации: <code>/config</code>, <code>/settings</code>.</li>
    <li id="4y0Z">Директории с исходными кодами: <code>/git</code>, <code>/svn</code>, <code>/cvs</code>.</li>
  </ul>
  <p id="Ruhd"><strong>Как искать:</strong></p>
  <ol id="xKUn">
    <li id="V5Bi">Вручную перебирать возможные пути в архиве.</li>
    <li id="3pM7">Использовать поиск по <code>*</code> или анализировать список всех сохранённых страниц через CDX API.</li>
    <li id="7Ejt">Парсить CDX-вывод и искать подозрительные пути.</li>
  </ol>
  <p id="3vey"><strong>Пример CDX-запроса для получения всех страниц сайта (включая подпапки):</strong></p>
  <pre id="5JZ7">curl &quot;https://web.archive.org/cdx/search/cdx?url=example.com/*&amp;output=json&quot; &gt; all_pages.json</pre>
  <p id="SZnY"><strong>Этап 4: Сравнение версий (diff) — что изменилось?</strong></p>
  <p id="QCZ2">Wayback Machine позволяет сравнивать два снимка страницы. Это полезно для выявления изменений в контенте, политике или структуре.</p>
  <p id="tAfx"><strong>Инструменты сравнения:</strong></p>
  <ul id="3DgV">
    <li id="YpIR"><strong>Веб-интерфейс:</strong> <code>https://web.archive.org/web/20200101000000/https://example.com</code> и <code>https://web.archive.org/web/20250101000000/https://example.com</code> → открыть в двух вкладках и сравнить.</li>
    <li id="wHvw"><strong>Сторонние утилиты:</strong> <code>wget --mirror</code> для загрузки двух архивных версий и сравнения через <code>diff</code>.</li>
  </ul>
  <p id="tJ9o"><strong>Сравнение через Python:</strong></p>
  <pre id="qnBF">import requests
import difflib

def fetch_archived_page(timestamp, url):
    archive_url = f&quot;https://web.archive.org/web/{timestamp}/{url}&quot;
    resp = requests.get(archive_url)
    return resp.text if resp.status_code == 200 else &quot;&quot;

def compare_pages(url, ts1, ts2):
    text1 = fetch_archived_page(ts1, url)
    text2 = fetch_archived_page(ts2, url)
    diff = difflib.unified_diff(text1.splitlines(), text2.splitlines())
    return &#x27;\n&#x27;.join(diff)

# Пример
changes = compare_pages(&#x27;example.com&#x27;, &#x27;20200101000000&#x27;, &#x27;20250101000000&#x27;)
print(changes[:500])  # первые 500 символов</pre>
  <p id="tmGL"><strong>Этап 5: Поиск старых robots.txt, sitemap.xml и других служебных файлов</strong></p>
  <p id="eY24"><code>robots.txt</code> и <code>sitemap.xml</code> часто меняются. В старых версиях могут содержаться пути, которые позже были удалены.</p>
  <p id="cVPJ"><strong>Пример:</strong></p>
  <pre id="spBW">https://web.archive.org/web/*/https://example.com/robots.txt
https://web.archive.org/web/*/https://example.com/sitemap.xml</pre>
  <p id="3GXx"><strong>Что можно найти:</strong></p>
  <ul id="dtuF">
    <li id="DpNk">Директории, запрещённые для индексации (например, <code>/admin/</code>, <code>/private/</code>).</li>
    <li id="fZfw">Поддомены, которые не разрешено индексировать (<code>Disallow: /subdomain/</code>).</li>
    <li id="2W8q">Карта сайта с перечнем всех страниц (удалённые, но сохранённые).</li>
  </ul>
  <p id="9NXQ"><strong>Этап 6: Поиск конфиденциальных данных в архивах</strong></p>
  <p id="E4OX">Одна из самых опасных ситуаций — случайная публикация конфиденциальных данных, которые затем были удалены, но остались в архиве.</p>
  <p id="uL3p"><strong>Что искать:</strong></p>
  <ul id="kpKY">
    <li id="Lwkj"><code>.env</code> (файлы окружения с паролями).</li>
    <li id="LLu3"><code>.git/config</code> (адреса репозиториев).</li>
    <li id="Adnr"><code>phpinfo()</code> (информация о PHP-конфигурации).</li>
    <li id="IIp0"><code>backup.sql</code> (дампы базы данных).</li>
    <li id="1i4u"><code>config.php</code>, <code>settings.php</code> (конфигурационные файлы).</li>
  </ul>
  <p id="1iQt"><strong>Как искать:</strong></p>
  <ol id="ME4N">
    <li id="6P3T">Вручную проверять типичные пути: <code>/backup</code>, <code>/tmp</code>, <code>/downloads</code>.</li>
    <li id="c83e">Использовать поиск по <code>*</code> и фильтровать по расширениям.</li>
    <li id="UZrm">Использовать инструменты парсинга архивов для массового поиска.</li>
  </ol>
  <p id="Kqiv"><strong>Пример поиска <code>.env</code> файлов:</strong></p>
  <pre id="rEkH">https://web.archive.org/web/*/https://example.com/*.env</pre>
  <p id="ti53">Wayback Machine не сохраняет все файлы (только HTML, CSS, JS), но дампы баз или бинарные файлы могут быть недоступны.</p>
  <p id="CpER"><strong>Этап 7: Анализ изменений в SSL-сертификатах через архивы</strong></p>
  <p id="VKPd">Хотя Wayback Machine не сохраняет SSL-сертификаты, история сертификатов доступна через CT-логи (см. статью 7). Однако, анализируя старые снимки сайта, можно заметить:</p>
  <ul id="kl9R">
    <li id="14rl">Когда на сайте появилась поддержка HTTPS (по редиректам).</li>
    <li id="5xzx">Когда был заменён логотип или изменилась политика безопасности (по заголовкам HTTP в сохранённых снимках, если они есть).</li>
  </ul>
  <p id="npTP"><strong>Этап 8: Использование <a href="https://archive.today/" target="_blank">Archive.today</a> для поиска удалённого контента</strong></p>
  <p id="s1lj"><a href="https://archive.today/" target="_blank">Archive.today</a> часто сохраняет страницы, которые не попали в Wayback Machine (например, из-за robots.txt). Он позволяет архивировать страницы вручную.</p>
  <p id="Fcxh"><strong>Как использовать:</strong></p>
  <ol id="4MH6">
    <li id="oWZp">Ввести URL на <a href="https://archive.today/" target="_blank">archive.today</a>.</li>
    <li id="5lPU">Если страница была сохранена, она отобразится.</li>
    <li id="rJsF">Можно найти сохранения по дате.</li>
  </ol>
  <p id="uIDZ">Нет публичного API. Только веб-интерфейс.</p>
  <p id="d4Gi"><strong>Этап 9: Автоматизированный сбор изменений с помощью Wayback Machine API</strong></p>
  <p id="1hrY">Для долгосрочного мониторинга сайта можно автоматизировать проверку новых снимков в архиве.</p>
  <p id="FyBn"><strong>Скрипт мониторинга новых версий:</strong></p>
  <pre id="Vn7e">import requests
import time

def get_latest_snapshot(url):
    # CDX API
    cdx_url = f&quot;https://web.archive.org/cdx/search/cdx?url={url}&amp;output=json&amp;limit=1&amp;sort=timestamp&quot;
    resp = requests.get(cdx_url)
    if resp.status_code == 200:
        data = resp.json()
        if len(data) &gt; 1:
            timestamp = data[1][1]
            return timestamp
    return None

def monitor_website(url, check_interval=86400):  # 1 день
    last_timestamp = None
    while True:
        latest = get_latest_snapshot(url)
        if latest and latest != last_timestamp:
            print(f&quot;Обнаружена новая версия {url} в архиве: {latest}&quot;)
            # Здесь можно обработать изменения
            last_timestamp = latest
        time.sleep(check_interval)</pre>
  <p id="xz1I"><strong>Этап 10: Поиск через CDX API для составления карты сайта</strong></p>
  <p id="MZS8">CDX API можно использовать для получения полного списка всех когда-либо сохранённых страниц сайта. Это позволяет восстановить структуру сайта даже без текущего доступа.</p>
  <p id="VY4v"><strong>Получение списка всех страниц (с ограничениями):</strong></p>
  <pre id="AtVg">curl &quot;https://web.archive.org/cdx/search/cdx?url=example.com/*&amp;output=json&amp;limit=100000&quot; &gt; all_pages.json</pre>
  <p id="sK7T"><strong>Парсинг результатов для построения карты сайта:</strong></p>
  <pre id="XXYw">import json
import re

def extract_all_paths(cdx_json_file):
    with open(cdx_json_file, &#x27;r&#x27;) as f:
        data = json.load(f)
    paths = set()
    for row in data[1:]:
        url = row[2]  # полный URL
        # извлекаем путь
        path = re.sub(r&#x27;^https?://[^/]+&#x27;, &#x27;&#x27;, url)
        paths.add(path)
    return sorted(paths)

# Пример использования
paths = extract_all_paths(&#x27;all_pages.json&#x27;)
for p in paths[:50]:
    print(p)</pre>
  <p id="adTp"><strong>Практический пример: полное исследование сайта через архивы</strong></p>
  <p id="7zyf"><em>Задача:</em> собрать максимально полную информацию о сайте <code>target.org</code> через архивы.</p>
  <ol id="aSoS">
    <li id="hiEe"><strong>Wayback Machine CDX</strong> → получаем список всех 5000 сохранённых страниц.</li>
    <li id="5kpz"><strong>Анализ путей:</strong></li>
    <ul id="iDb1">
      <li id="x9AE">Обнаружены пути <code>/admin</code>, <code>/test</code>, <code>/backup_2022</code>, <code>/temp</code>.</li>
      <li id="rr8B">Страница <code>/admin/login.html</code> существует в архиве с 2020 года.</li>
    </ul>
    <li id="OwRU"><strong>Поиск файлов:</strong></li>
    <ul id="Slfb">
      <li id="8o0K"><code>https://web.archive.org/web/20220101000000/target.org/.git/config</code> — найден конфиг репозитория.</li>
      <li id="uv0H"><code>https://web.archive.org/web/20200101000000/target.org/backup.sql</code> — дамп базы данных.</li>
    </ul>
    <li id="Vmah"><strong>Сравнение версий:</strong></li>
    <ul id="QqWT">
      <li id="ZAFX">Сравнили <code>index.html</code> в 2020 и 2024 → структура сильно изменилась, добавилась поддержка HTTPS, появился CSP.</li>
    </ul>
    <li id="g1VX"><strong>Скрытые поддомены:</strong></li>
    <ul id="8XlX">
      <li id="6AC2">На старой robots.txt найдена запись <code>Disallow: /dev/</code>. Открываем архивный URL <code>https://web.archive.org/web/20200101000000/target.org/dev/</code> → обнаруживаем тестовый сайт с открытыми ошибками PHP.</li>
    </ul>
    <li id="YBVv"><strong>Вывод:</strong> Найдены забытые тестовые страницы, конфигурационный файл и дамп базы данных. В текущей версии сайта они удалены, но остались в архиве.</li>
  </ol>
  <p id="ITAF"><strong>Инструменты для работы с архивами</strong></p>
  <figure id="8j2P" class="m_column">
    <img src="https://img1.teletype.in/files/8c/9a/8c9a77a3-3940-469d-a7ed-dcf8e2b95d43.png" width="1004" />
  </figure>
  <ul id="Fl2g">
    <li id="Euvt">Данные Wayback Machine являются публичными, их сбор легален.</li>
    <li id="4DG2">Не используйте найденные уязвимости для атак на сайт без разрешения.</li>
    <li id="vfIu">Если вы нашли конфиденциальные данные (пароли, токены) в архиве, сообщите об этом владельцу сайта через официальный канал (без распространения информации третьим лицам).</li>
    <li id="cy8b">Некоторые страны требуют удаления личных данных из архивов — уважайте такие запросы.</li>
  </ul>
  <p id="ZXD8">Анализ истории сайта через Wayback Machine и другие архивы — важный этап технического OSINT, позволяющий заглянуть в прошлое веб-ресурса. Удалённые страницы, забытые поддомены, случайно опубликованные конфиденциальные данные, старая robots.txt — всё это может быть восстановлено, если было сохранено в архиве. Комбинируя CDX API, поиск по шаблонам и ручной анализ, исследователь может восстановить почти полную ист</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Vulnerability-search-through-OSINT</guid><link>https://teletype.in/@specialist_infosec/Vulnerability-search-through-OSINT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Vulnerability-search-through-OSINT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Поиск уязвимостей через открытые источники: базы CVE, NVD, Exploit-DB и связь с версиями ПО</title><pubDate>Sat, 27 Jun 2026 16:28:23 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/90/b2/90b2d41c-87cb-450f-a82b-012a4c2e7ea7.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/6c/1c/6c1c1980-fe76-4005-a8dc-20cb2d941a65.png"></img>После того как в ходе технического OSINT выявлены версии программного обеспечения, используемого целью (веб-сервер, CMS, библиотеки, операционная система), логичный следующий шаг — выяснить, есть ли у этих версий известные уязвимости. Открытые базы данных уязвимостей (CVE, NVD, Exploit-DB, Vulners и др.) позволяют сопоставить версию ПО с известными CVE (Common Vulnerabilities and Exposures), оценить критичность и даже найти готовые эксплойты. Это помогает понять, насколько цель подвержена атакам, и приоритезировать дальнейшие действия. Данная статья посвящена методам поиска уязвимостей по версиям ПО с использованием открытых источников.]]></description><content:encoded><![CDATA[
  <figure id="zxLK" class="m_retina">
    <img src="https://img3.teletype.in/files/6c/1c/6c1c1980-fe76-4005-a8dc-20cb2d941a65.png" width="1099" />
  </figure>
  <h3 id="R5Kp">Поиск уязвимостей через открытые источники: базы CVE, NVD, Exploit-DB и связь с версиями ПО</h3>
  <p id="P50k">После того как в ходе технического OSINT выявлены версии программного обеспечения, используемого целью (веб-сервер, CMS, библиотеки, операционная система), логичный следующий шаг — выяснить, есть ли у этих версий известные уязвимости. Открытые базы данных уязвимостей (CVE, NVD, Exploit-DB, Vulners и др.) позволяют сопоставить версию ПО с известными CVE (Common Vulnerabilities and Exposures), оценить критичность и даже найти готовые эксплойты. Это помогает понять, насколько цель подвержена атакам, и приоритезировать дальнейшие действия. Данная статья посвящена методам поиска уязвимостей по версиям ПО с использованием открытых источников.</p>
  <p id="aVvw"><strong>Что такое CVE, CVSS, NVD, Exploit-DB</strong></p>
  <figure id="Sel7" class="m_column">
    <img src="https://img3.teletype.in/files/27/03/27031fce-341d-42a3-8a66-fa48f9fc69e7.png" width="1207" />
  </figure>
  <p id="0mNK"><strong>Зачем это нужно в техническом OSINT?</strong></p>
  <ol id="uM35">
    <li id="Mcyw"><strong>Оценка рисков:</strong> понять, насколько критичны уязвимости в используемом ПО.</li>
    <li id="zmRU"><strong>Приоритизация проверок:</strong> какие уязвимости следует тестировать в первую очередь.</li>
    <li id="GX1v"><strong>Обнаружение уже скомпрометированных систем:</strong> если на целевой системе есть уязвимая версия и известен активный эксплойт — она могла быть взломана.</li>
    <li id="5GxT"><strong>Помощь в легальном пентесте:</strong> знание уязвимостей позволяет сосредоточить усилия.</li>
  </ol>
  <p id="nB55">Простое наличие уязвимой версии ПО не означает, что цель автоматически скомпрометирована. Это лишь индикатор потенциальной уязвимости.</p>
  <p id="ZETQ"><strong>Этап 1: Поиск CVE по названию продукта и версии</strong></p>
  <p id="4JRm">Самый простой способ — использовать поисковые системы по CVE с фильтрацией.</p>
  <p id="wJDg"><strong>Основные базы данных:</strong></p>
  <figure id="C5Py" class="m_column">
    <img src="https://img4.teletype.in/files/b6/c3/b6c3c705-30dc-4006-a5e9-ad6126c56496.png" width="1206" />
  </figure>
  <p id="lifm"><strong>Поиск по продукту в NVD:</strong></p>
  <pre id="2ZXQ">https://nvd.nist.gov/vuln/search/results?query=nginx&amp;results_type=overview</pre>
  <p id="C40H"><strong>Поиск с версией в NVD (сложно):</strong> NVD не всегда индексирует версии, лучше использовать Vulners.</p>
  <p id="pFBh"><strong>Vulners search (пример):</strong></p>
  <pre id="lZ7b">https://vulners.com/search?query=nginx%201.18.0</pre>
  <p id="QbXa"><strong>Этап 2: Использование Vulners API для массового поиска</strong></p>
  <p id="5oYT">Vulners предоставляет бесплатный API с лимитами. Позволяет искать по CPE (Common Platform Enumeration) — стандартизированному формату описания ПО.</p>
  <p id="QBPm"><strong>Формат CPE:</strong> <code>cpe:2.3:a:nginx:nginx:1.18.0:*:*:*:*:*:*:*</code></p>
  <p id="eIOg"><strong>Упрощённый поиск через API Vulners:</strong></p>
  <pre id="xMeU">import requests
import json

VULNERS_API_KEY = &quot;YOUR_API_KEY&quot;

def search_vulnerabilities(product, version, api_key=VULNERS_API_KEY):
    &quot;&quot;&quot;
    Поиск уязвимостей по названию продукта и версии.
    &quot;&quot;&quot;
    query = f&#x27;{product} {version}&#x27;
    url = &quot;https://vulners.com/api/v3/search/lucene/&quot;
    payload = {
        &quot;query&quot;: query,
        &quot;apiKey&quot;: api_key
    }
    response = requests.post(url, json=payload)
    if response.status_code == 200:
        data = response.json()
        if &#x27;data&#x27; in data and &#x27;search&#x27; in data[&#x27;data&#x27;]:
            return data[&#x27;data&#x27;][&#x27;search&#x27;]
    return []

def get_cves_for_software(software_list):
    results = {}
    for sw in software_list:
        cves = search_vulnerabilities(sw[&#x27;name&#x27;], sw[&#x27;version&#x27;])
        results[f&quot;{sw[&#x27;name&#x27;]} {sw[&#x27;version&#x27;]}&quot;] = cves
    return results

# Пример
software = [
    {&#x27;name&#x27;: &#x27;nginx&#x27;, &#x27;version&#x27;: &#x27;1.18.0&#x27;},
    {&#x27;name&#x27;: &#x27;php&#x27;, &#x27;version&#x27;: &#x27;7.4.33&#x27;},
    {&#x27;name&#x27;: &#x27;wordpress&#x27;, &#x27;version&#x27;: &#x27;6.2&#x27;}
]
vulns = get_cves_for_software(software)
for k, v in vulns.items():
    print(f&quot;{k}: {len(v)} vulnerabilities&quot;)</pre>
  <p id="kgz4"><strong>Этап 3: Использование CIRCL CVE Search API (без ключа)</strong></p>
  <p id="13CH">CIRCL предлагает публичный API, не требующий авторизации.</p>
  <p id="JY7c"><strong>Пример запроса для поиска CVE по ключевому слову nginx:</strong></p>
  <pre id="Vk5m">curl https://cve.circl.lu/api/search/nginx</pre>
  <p id="WFew"><strong>Для извлечения информации о конкретном CVE:</strong></p>
  <pre id="PR5M">curl https://cve.circl.lu/api/cve/CVE-2021-23017</pre>
  <p id="GWOW">CIRCL не позволяет фильтровать по версии, ищет по тексту.</p>
  <p id="COUy"><strong>Этап 4: Поиск эксплойтов (Exploit-DB, Rapid7, Packet Storm)</strong></p>
  <p id="Pjl0">Наличие эксплойта повышает вероятность того, что уязвимость будет использована.</p>
  <p id="pkUV"><strong>Exploit-DB:</strong></p>
  <ul id="CHcM">
    <li id="4grd">Поиск по продукту и версии: <code>https://www.exploit-db.com/search?q=nginx+1.18.0</code></li>
    <li id="o9Dz">Можно скачать готовый код (на свой страх и риск).</li>
  </ul>
  <p id="jUWr"><strong>Rapid7 DB (Metasploit modules):</strong></p>
  <ul id="vGsd">
    <li id="VAHb">Поиск: <code>https://www.rapid7.com/db/search/?q=nginx</code></li>
  </ul>
  <p id="UEYg"><strong>Packet Storm Security:</strong></p>
  <ul id="2UzU">
    <li id="kTvR"><code>https://packetstormsecurity.com/search/?q=nginx</code></li>
  </ul>
  <p id="WfRw"><strong>Пример автоматизации через Exploit-DB (неофициальный API, лучше парсить):</strong></p>
  <pre id="tCQY">import requests
from bs4 import BeautifulSoup

def search_exploitdb(product, version):
    url = f&quot;https://www.exploit-db.com/search?q={product}+{version}&quot;
    resp = requests.get(url)
    soup = BeautifulSoup(resp.text, &#x27;html.parser&#x27;)
    # Парсинг таблицы результатов (сложно, зависит от структуры)
    # Возвращает список заголовков эксплойтов
    return []

# Ручной поиск вручную часто проще</pre>
  <p id="nMGR"><strong>Этап 5: Сопоставление версий ПО с CPE для точного поиска</strong></p>
  <p id="pqEX">Чтобы искать CVE, лучше преобразовать название и версию в CPE-формат. Это повышает точность.</p>
  <p id="TKZB"><strong>Сервис CPE Dictionary (NVD):</strong></p>
  <ul id="Ju7p">
    <li id="3Mjw"><code>https://nvd.nist.gov/products/cpe/search</code></li>
    <li id="ZJeo">API: <code>https://services.nvd.nist.gov/rest/json/cpes/2.0?keyword=nginx</code></li>
  </ul>
  <p id="Dxlm"><strong>Автоматическое определение CPE через cpe-guesser (исследовательский):</strong></p>
  <pre id="AX3P">def guess_cpe(product, version):
    # упрощённый пример
    product_lower = product.lower()
    if product_lower == &#x27;nginx&#x27;:
        return f&quot;cpe:2.3:a:nginx:nginx:{version}:*:*:*:*:*:*:*&quot;
    elif product_lower == &#x27;wordpress&#x27;:
        return f&quot;cpe:2.3:a:wordpress:wordpress:{version}:*:*:*:*:*:*:*&quot;
    # ...
    return None</pre>
  <p id="2StY"><strong>Этап 6: Анализ CVSS (критичность уязвимости)</strong></p>
  <p id="iddC">Каждому CVE присваивается оценка CVSS. Чем выше, тем критичнее.</p>
  <p id="zlfF"><strong>CVSS v3 шкала:</strong></p>
  <figure id="W7mk" class="m_column">
    <img src="https://img2.teletype.in/files/54/56/54561dd9-0302-4330-acc7-752cdb9c77ae.png" width="929" />
  </figure>
  <p id="b1Qj"><strong>Вектор CVSS</strong> (пример): <code>CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H</code> означает: сетевой доступ, низкая сложность, не требуется привилегий, полное воздействие на конфиденциальность, целостность и доступность.</p>
  <p id="8wed"><strong>Где брать CVSS:</strong> NVD, Vulners, некоторые API.</p>
  <p id="tiPI"><strong>Этап 7: Автоматизированный сбор уязвимостей для всех технологий стека</strong></p>
  <p id="MKvZ">Комбинируем результаты предыдущих статей (технологический стек) с базами уязвимостей.</p>
  <p id="xtcr"><strong>Python-скрипт для массовой проверки (на основе данных из Wappalyzer, BuiltWith):</strong></p>
  <pre id="nYk6">import requests
import time
import json

def get_cves_from_nvd(keyword, api_key=None):
    &quot;&quot;&quot;
    Поиск в NVD через API (требуется ключ, можно получить бесплатно).
    Без ключа возвращает только первые 20 результатов.
    &quot;&quot;&quot;
    url = &quot;https://services.nvd.nist.gov/rest/json/cves/2.0&quot;
    params = {
        &#x27;keywordSearch&#x27;: keyword,
        &#x27;resultsPerPage&#x27;: 10
    }
    if api_key:
        params[&#x27;apiKey&#x27;] = api_key
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = response.json()
        cves = []
        for vuln in data.get(&#x27;vulnerabilities&#x27;, []):
            cve_id = vuln[&#x27;cve&#x27;][&#x27;id&#x27;]
            cvss_score = vuln[&#x27;cve&#x27;].get(&#x27;metrics&#x27;, {}).get(&#x27;cvssMetricV31&#x27;, [{}])[0].get(&#x27;cvssData&#x27;, {}).get(&#x27;baseScore&#x27;, &#x27;N/A&#x27;)
            cves.append({&#x27;id&#x27;: cve_id, &#x27;cvss_score&#x27;: cvss_score})
        return cves
    else:
        print(f&quot;Ошибка NVD: {response.status_code}&quot;)
        return []

# Пример для nginx 1.18.0
cves = get_cves_from_nvd(&quot;nginx 1.18.0&quot;)
for cve in cves:
    print(f&quot;{cve[&#x27;id&#x27;]} (CVSS {cve[&#x27;cvss_score&#x27;]})&quot;)</pre>
  <p id="6DN6">NVD API имеет rate limit (без ключа ~5 запросов в 30 секунд). Используйте ключ или библиотеку с задержками.</p>
  <p id="qJxj"><strong>Этап 8: Поиск уязвимостей в WordPress плагинах и темах</strong></p>
  <p id="IcdP">WordPress — особая категория: уязвимости часто связаны с плагинами и темами, а не с ядром.</p>
  <p id="5pQP"><strong>Базы для WordPress:</strong></p>
  <ul id="CS5I">
    <li id="WwGP"><strong>WPScan Vulnerability Database:</strong> <code>https://wpscan.com/api</code> (есть бесплатный API с ограничениями).</li>
    <li id="il6l"><strong>Patchstack:</strong> <code>https://patchstack.com/database/</code></li>
  </ul>
  <p id="UXkG"><strong>Пример поиска через WPScan API:</strong></p>
  <pre id="hK24">def check_wpscan_plugin(plugin_slug):
    url = f&quot;https://wpscan.com/api/v3/plugins/{plugin_slug}&quot;
    response = requests.get(url)
    if response.status_code == 200:
        data = response.json()
        return data.get(&#x27;vulnerabilities&#x27;, [])
    return []</pre>
  <p id="5NJt"><strong>Этап 9: Анализ базы Known Exploited Vulnerabilities (CISA KEV)</strong></p>
  <p id="BRWA">CISA ведёт список активно эксплуатируемых уязвимостей (KEV). Если CVE есть в этом списке, оно представляет большую угрозу.</p>
  <p id="gCmT"><strong>API KEV:</strong> <a href="https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json" target="_blank">https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json</a></p>
  <pre id="65tP">def is_in_kev(cve_id):
    url = &quot;https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json&quot;
    resp = requests.get(url)
    if resp.status_code == 200:
        data = resp.json()
        for item in data[&#x27;vulnerabilities&#x27;]:
            if item[&#x27;cveID&#x27;] == cve_id:
                return True
    return False</pre>
  <p id="bddm"><strong>Этап 10: Составление отчёта об уязвимостях</strong></p>
  <p id="9HmG">Для каждой версии ПО, найденной на цели, следует создать таблицу:</p>
  <figure id="0IP1" class="m_column">
    <img src="https://img3.teletype.in/files/e4/83/e4837925-ab85-4e55-ab93-f6bc56444913.png" width="907" />
  </figure>
  <p id="70fR">Суммировать количество критических уязвимостей, наличие эксплойтов, попадание в KEV.</p>
  <p id="Yldi"><strong>Практический пример: оценка рисков для веб-сервера цели</strong></p>
  <p id="dWpj"><em>Задача:</em> для сервера nginx 1.18.0 + PHP 7.4.33 найти известные уязвимости.</p>
  <ol id="ehHE">
    <li id="0U41"><strong>Поиск через Vulners:</strong></li>
    <ul id="Xx1V">
      <li id="2h3H">nginx 1.18.0: 3 CVE, все с CVSS ниже 6.0. Эксплойтов нет.</li>
      <li id="bE77">PHP 7.4.33: 12 CVE, из них 4 с CVSS &gt; 7.0. Один эксплойт в Metasploit.</li>
    </ul>
    <li id="u1R2"><strong>Проверка CISA KEV:</strong> PHP 7.4.33 не в списке KEV.</li>
    <li id="KmQF"><strong>Вывод:</strong> основной риск — уязвимости PHP (особенно CVE-2022-31628, позволяющая удалённое выполнение кода). Рекомендуется обновить PHP до 8.x.</li>
  </ol>
  <ul id="68sC">
    <li id="8wIw">Поиск уязвимостей в открытых базах данных легален.</li>
    <li id="tJ9m">Запуск эксплойтов на целевой системе без разрешения — уголовное преступление.</li>
    <li id="1UQO">Обнаруженную уязвимость следует сообщить владельцу системы через программы Bug Bounty или координаторы (CERT).</li>
    <li id="bCtd">Не следует тестировать эксплойты на чужих системах.</li>
  </ul>
  <p id="pz1M">Поиск уязвимостей по версиям ПО — неотъемлемая часть технического OSINT. Базы CVE, NVD, Vulners, Exploit-DB и CISA KEV дают исследователю возможность оценить поверхность атаки, не прибегая к активным сканерам уязвимостей. Сопоставление версий из предыдущих статей (технологический стек, версии ПО, заголовки) с уязвимостями позволяет построить рейтинг рисков и определить приоритет для дальнейшего тестирования.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Headline-Analysis</guid><link>https://teletype.in/@specialist_infosec/Headline-Analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Headline-Analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Анализ заголовков HTTP: серверы, cookies, политики безопасности</title><pubDate>Wed, 24 Jun 2026 08:29:47 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/dd/21/dd211fb3-5814-4a2d-9527-9f9725b7a7ad.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/98/b2/98b2a327-44d0-47ce-924f-402d58919182.png"></img>HTTP-заголовки — это метаданные, которыми обмениваются клиент (браузер) и сервер при каждом запросе. Для специалиста по техническому OSINT заголовки — ценный источник информации: они раскрывают версии программного обеспечения, используемые технологии, настройки безопасности и даже особенности конфигурации. Помимо этого, заголовки безопасности (CSP, HSTS, X-Frame-Options) позволяют оценить уровень защищённости веб-приложения и выявить потенциальные уязвимости. Данная статья посвящена методам сбора и анализа HTTP-заголовков, а также извлечению разведывательной информации из них.]]></description><content:encoded><![CDATA[
  <figure id="1ash" class="m_retina">
    <img src="https://img2.teletype.in/files/98/b2/98b2a327-44d0-47ce-924f-402d58919182.png" width="1102" />
  </figure>
  <h3 id="DpJO">Анализ заголовков HTTP: серверы, cookies, политики безопасности (CSP, HSTS, X-Frame-Options и другие)</h3>
  <p id="677c">HTTP-заголовки — это метаданные, которыми обмениваются клиент (браузер) и сервер при каждом запросе. Для специалиста по техническому OSINT заголовки — ценный источник информации: они раскрывают версии программного обеспечения, используемые технологии, настройки безопасности и даже особенности конфигурации. Помимо этого, заголовки безопасности (CSP, HSTS, X-Frame-Options) позволяют оценить уровень защищённости веб-приложения и выявить потенциальные уязвимости. Данная статья посвящена методам сбора и анализа HTTP-заголовков, а также извлечению разведывательной информации из них.</p>
  <p id="KpN1"><strong>Почему HTTP-заголовки важны для технического OSINT?</strong></p>
  <figure id="gvRN" class="m_column">
    <img src="https://img2.teletype.in/files/51/e9/51e9b4d7-59e3-478b-96a2-37d55de03f24.png" width="1203" />
  </figure>
  <p id="YeYR"><strong>Этап 1: Сбор заголовков (базовые инструменты)</strong></p>
  <p id="GSEO"><strong>1. curl</strong>  — самый простой способ:</p>
  <pre id="wlFl"># Показать только заголовки ответа
curl -I https://example.com

# Показать заголовки запроса и ответа
curl -v https://example.com

# Сохранить заголовки в файл
curl -D headers.txt https://example.com</pre>
  <p id="DbkW"><strong>2. wget</strong>:</p>
  <pre id="2LVx">wget --server-response -O /dev/null https://example.com</pre>
  <p id="t82e"><strong>3. Browser DevTools</strong> (F12 → Network → выбрать запрос → Headers).</p>
  <p id="HHOD"><strong>4. Онлайн сервисы:</strong></p>
  <ul id="rcRM">
    <li id="CrJX"><strong><a href="https://securityheaders.com/" target="_blank">SecurityHeaders.com</a></strong> — проверяет наличие и корректность заголовков безопасности, выставляет оценку.</li>
    <li id="BxsH"><strong>HTTPHeaderCheck</strong> (<a href="https://httpheadercheck.com/" target="_blank">httpheadercheck.com</a>) — анализирует заголовки и даёт рекомендации.</li>
    <li id="enPC"><strong>Mozilla Observatory</strong> — глубокий анализ безопасности с рекомендациями.</li>
  </ul>
  <p id="gEnS"><strong>Этап 2: Анализ идентификационных заголовков</strong></p>
  <p id="AFdb">Эти заголовки могут выдать технологии, версии ПО, что полезно для обнаружения устаревших или уязвимых компонентов.</p>
  <p id="M6Bz"><strong><code>Server:</code></strong></p>
  <ul id="rInk">
    <li id="F2pV">Указывает тип и версию веб-сервера. Примеры: <code>nginx/1.18.0</code>, <code>Apache/2.4.41 (Ubuntu)</code>, <code>Microsoft-IIS/10.0</code>, <code>Cloudflare</code>.</li>
    <li id="aBpM">Часто скрывается администраторами (<code>Server: Apache</code>, без версии). Если версия показана — сверьте с базами уязвимостей.</li>
  </ul>
  <p id="HLI9"><strong><code>X-Powered-By:</code></strong></p>
  <ul id="dVhk">
    <li id="Dedf">Показывает технологию бэкенда. Например: <code>PHP/7.4.33</code>, <code>ASP.NET</code>, <code>Express</code>. Может дать версию языка/фреймворка.</li>
  </ul>
  <p id="vaM0"><strong><code>X-Generator:</code></strong></p>
  <ul id="znte">
    <li id="KUho">Иногда содержит название CMS или генератора контента (например, <code>WordPress 6.2</code>).</li>
  </ul>
  <p id="Sb0C"><strong><code>X-AspNet-Version:</code></strong></p>
  <ul id="jxVW">
    <li id="h7Tx">Для <a href="https://asp.net/" target="_blank">ASP.NET</a>. Пример: <code>X-AspNet-Version: 4.0.30319</code>.</li>
  </ul>
  <p id="bkEa"><strong><code>X-Powered-By-Plesk:</code></strong> (если используется панель управления хостингом).</p>
  <p id="8PST"><strong>Этап 3: Анализ cookie и сессионных заголовков</strong></p>
  <p id="XL8h">Заголовок <code>Set-Cookie</code> не только управляет сессиями, но и выдаёт технологии.</p>
  <p id="Qgd1"><strong><code>Set-Cookie:</code></strong></p>
  <ul id="ZvoF">
    <li id="cAt9"><code>PHPSESSID=...</code> → PHP (версия сессионного механизма).</li>
    <li id="W1dy"><code>JSESSIONID=...</code> → Java (JSP).</li>
    <li id="Kj7D"><code>ASPSESSIONID...</code> → <a href="https://asp.net/" target="_blank">ASP.NET</a>.</li>
    <li id="NkAq"><code>laravel_session=...</code> → Laravel (PHP-фреймворк).</li>
    <li id="9058"><code>XSRF-TOKEN</code> → часто используется в Angular, Laravel, Django.</li>
  </ul>
  <p id="uvdA"><strong>Флаги cookie (httponly, secure, samesite):</strong></p>
  <ul id="PFKG">
    <li id="KIGi"><code>HttpOnly</code> — недоступен для JavaScript (хорошо для безопасности).</li>
    <li id="y3F4"><code>Secure</code> — только через HTTPS.</li>
    <li id="MaLg"><code>SameSite=Lax/Strict</code> — защита от CSRF.</li>
  </ul>
  <p id="WJf8"><strong>Этап 4: Заголовки безопасности (Security Headers)</strong></p>
  <p id="MMxV">Оценка безопасности веб-приложения — важная часть разведки. Слабые настройки могут привести к уязвимостям (кликджекинг, XSS, перехват сессий).</p>
  <p id="LP8t"><strong>4.1. Content-Security-Policy (CSP)</strong></p>
  <p id="EDCA">CSP — белый список источников загрузки ресурсов (скриптов, стилей, изображений). Хорошо настроенный CSP сильно уменьшает риск XSS.</p>
  <p id="V39N"><strong>Анализ CSP:</strong></p>
  <ul id="iDXM">
    <li id="DFir"><code>default-src &#x27;none&#x27;</code> — жёсткая политика.</li>
    <li id="7YUL"><code>script-src &#x27;self&#x27;</code> — разрешены скрипты только с того же домена.</li>
    <li id="ryPG"><code>unsafe-inline</code>, <code>unsafe-eval</code> — опасные директивы, делают CSP бесполезным.</li>
    <li id="dFii"><code>report-uri /report-csp-violation</code> — куда отправлять отчёты о нарушениях.</li>
  </ul>
  <p id="vFsn"><strong>Ошибки:</strong></p>
  <ul id="KXIB">
    <li id="5DVA">Отсутствие CSP — распространённая проблема.</li>
    <li id="wI5u">Наличие <code>unsafe-inline</code> без nonce/hash — снижает защиту.</li>
    <li id="UYUv">Слишком широкие источники (<code>*.example.com</code>, <code>https:</code>).</li>
  </ul>
  <p id="8Fo3"><strong>4.2. HSTS (HTTP Strict Transport Security)</strong></p>
  <p id="efPa">Принудительное использование HTTPS для всех подключений к домену.</p>
  <p id="KMXW"><strong>Пример:</strong> <code>Strict-Transport-Security: max-age=31536000; includeSubDomains; preload</code></p>
  <p id="9U1Y"><strong>Анализ:</strong></p>
  <ul id="TimN">
    <li id="BZOg"><code>max-age=0</code> — отключено (опасно).</li>
    <li id="g57z"><code>includeSubDomains</code> — принудительный HTTPS для всех поддоменов.</li>
    <li id="7Xi0"><code>preload</code> — домен включён в предзагружаемый список браузеров (максимальный уровень).</li>
    <li id="02ri">Отсутствие HSTS — возможность атаки «понижения до HTTP» (SSL stripping).</li>
  </ul>
  <p id="Webn"><strong>4.3. X-Frame-Options</strong></p>
  <p id="LUTv">Защита от кликджекинга (встраивания сайта в frame).</p>
  <p id="4C47"><strong>Значения:</strong></p>
  <ul id="2HrA">
    <li id="cqOE"><code>DENY</code> — запрещено встраивание в frame.</li>
    <li id="3i2f"><code>SAMEORIGIN</code> — разрешено только с того же домена.</li>
    <li id="ojt7"><code>ALLOW-FROM uri</code> — устаревшее.</li>
    <li id="LNeN">Отсутствие заголовка — сайт можно встроить в <code>&lt;iframe&gt;</code> (угроза UI redressing).</li>
  </ul>
  <p id="0CjR"><strong>4.4. X-Content-Type-Options</strong></p>
  <p id="KbdL">Защита от MIME-тип-путаницы (MIME sniffing).</p>
  <p id="QQtS"><strong>Единственное допустимое значение:</strong> <code>nosniff</code>. Если отсутствует — браузер может выполнить script, даже если тип указан как текст.</p>
  <p id="itT6"><strong>4.5. X-XSS-Protection</strong></p>
  <p id="zy81">Старый заголовок для защиты от XSS (в основном для старых браузеров).</p>
  <p id="aqKs"><strong>Значения:</strong></p>
  <ul id="x8MK">
    <li id="Ob0H"><code>1; mode=block</code> — блокировать страницу при обнаружении XSS.</li>
    <li id="Zvbk"><code>1</code> — попытаться очистить (менее безопасно).</li>
    <li id="SMaU"><code>0</code> — отключено.</li>
  </ul>
  <p id="kdmG">В современных браузерах во многом заменён CSP, но его наличие всё же полезно.</p>
  <p id="A9T7"><strong>4.6. Referrer-Policy</strong></p>
  <p id="8xz5">Контролирует передачу referer при переходе по ссылкам.</p>
  <p id="3gks"><strong>Настройки:</strong></p>
  <ul id="zFcD">
    <li id="uoMB"><code>no-referrer</code> — вообще не передавать.</li>
    <li id="wrvk"><code>strict-origin</code> — передавать только схему и домен (при HTTPS→HTTPS).</li>
    <li id="i6jx"><code>unsafe-url</code> — всегда передавать полный URL (опасно, утечка параметров).</li>
  </ul>
  <p id="NEbS"><strong>4.7. Feature-Policy / Permissions-Policy</strong></p>
  <p id="4bsS">Ограничивает доступ к функциям браузера (камера, микрофон, геолокация). Может содержать информацию о политиках организации.</p>
  <p id="03ra"><strong>Этап 5: Заголовки, указывающие на CDN, прокси, кэширование</strong></p>
  <p id="ZXZD">Эти заголовки помогают понять, скрыт ли реальный IP сервера за CDN, используется ли балансировка, кэширование.</p>
  <p id="VjmM"><strong>Cloudflare:</strong></p>
  <ul id="lXzN">
    <li id="OvbA"><code>CF-Cache-Status</code> (HIT, MISS, EXPIRED, DYNAMIC).</li>
    <li id="wYMV"><code>CF-RAY</code>.</li>
    <li id="nm2j"><code>CF-Connection-Connecting</code>.</li>
  </ul>
  <p id="YgVj"><strong>Akamai:</strong></p>
  <ul id="xNfe">
    <li id="5SDk"><code>X-Akamai-Transformed</code>, <code>X-Akamai-Cache-Status</code>.</li>
  </ul>
  <p id="gH5T"><strong>AWS CloudFront:</strong></p>
  <ul id="kovb">
    <li id="zz51"><code>X-Amz-Cf-Id</code>, <code>X-Cache</code> (Hit from cloudfront).</li>
  </ul>
  <p id="dXlF"><strong>Varnish:</strong></p>
  <ul id="Hh6q">
    <li id="ZYin"><code>X-Varnish</code>, <code>X-Cache</code> (HIT, MISS).</li>
  </ul>
  <p id="jbhK"><strong>Этап 6: Анализ заголовков на предмет утечки внутренней информации</strong></p>
  <p id="Qhkq">Некоторые заголовки могут раскрывать внутреннюю инфраструктуру:</p>
  <ul id="d1DQ">
    <li id="Ahmz"><code>X-Backend-Server</code> — имя внутреннего сервера.</li>
    <li id="Psm6"><code>X-Debug-Token</code>, <code>X-Debug-Token-Link</code> — утечка отладочной информации.</li>
    <li id="wzCw"><code>X-Server-Name</code> — имя сервера внутри сети.</li>
    <li id="2KfV"><code>X-Forwarded-For</code> (иногда) — реальный IP клиента, но может содержать IP прокси.</li>
    <li id="bfph"><code>Via</code> — прокси-серверы (например, <code>Via: 1.1 varnish</code>).</li>
  </ul>
  <p id="wJja"><strong>Если увидели <code>X-Backend-Server: web01.internal.company.com</code> — это очень ценно: можно узнать внутреннюю структуру и возможные имена хостов.</strong></p>
  <p id="0sIS"><strong>Этап 7: Инструменты для массового сбора заголовков</strong></p>
  <p id="Ns8z"><strong>Httpx (от ProjectDiscovery)</strong> — быстрый HTTP-клиент, собирает заголовки, извлекает технологии, поддерживает вывод в JSON.</p>
  <pre id="e9ZG">httpx -u https://example.com -sc -title -tech-detect -json -o headers.json</pre>
  <p id="dKHg"><strong>HTTPX (Python-библиотека) — позволяет автоматизировать запросы:</strong></p>
  <pre id="XmTb">import httpx

def get_headers(url):
    try:
        response = httpx.get(url, follow_redirects=True, timeout=10)
        headers = dict(response.headers)
        # дополнительные данные
        headers[&#x27;_status_code&#x27;] = response.status_code
        headers[&#x27;_url&#x27;] = str(response.url)
        return headers
    except Exception as e:
        return {&#x27;_error&#x27;: str(e)}

# Пример для одного сайта
print(get_headers(&#x27;https://example.com&#x27;))</pre>
  <p id="mRGD"><strong>Этап 8: Автоматический анализ с помощью <a href="https://securityheaders.com/" target="_blank">SecurityHeaders.com</a> API</strong></p>
  <p id="wPSD"><a href="https://securityheaders.com/" target="_blank">SecurityHeaders.com</a> предоставляет API для оценки заголовков.</p>
  <pre id="qad3">curl https://securityheaders.com/?q=https://example.com&amp;hide=on</pre>
  <p id="gGpU">Ответ — HTML, но можно парсить. Оценка от A+ до F (рекомендуется A).</p>
  <p id="hECp"><strong>Пример из утилиты:</strong> можно использовать <code>curl</code> и <code>grep</code> для извлечения рейтинга.</p>
  <p id="imXk"><strong>Этап 9: Оценка качества и потенциальных уязвимостей по заголовкам</strong></p>
  <p id="lDeM"><strong>Недостатки в заголовках безопасности могут указывать на слабую защиту:</strong></p>
  <ul id="7NbQ">
    <li id="tJDo">Нет HSTS → риск с stripping (особенно для сайтов с логинами).</li>
    <li id="9i7U">Нет CSP → уязвимость XSS.</li>
    <li id="nIFu">Нет X-Frame-Options → риск кликджекинга.</li>
    <li id="Q3Tu">Наличие <code>X-Powered-By</code> с точной версией → может помочь злоумышленнику (но не является уязвимостью).</li>
  </ul>
  <p id="k0ft"><strong>Практический пример: разбор заголовков сайта с логином</strong></p>
  <p id="XEN7"><em>Задача:</em> проверить защищённость сайта <code>login.target.com</code> по заголовкам.</p>
  <ol id="XlhH">
    <li id="ht1N"><strong>Запрос заголовков:</strong>textcurl -I https://login.target.comОтвет:textHTTP/2 200 server: nginx/1.22.0 x-powered-by: PHP/7.4.33 set-cookie: PHPSESSID=abc123; path=/; HttpOnly; Secure strict-transport-security: max-age=0 x-frame-options: DENY x-content-type-options: nosniff x-xss-protection: 1; mode=block content-security-policy: default-src &#x27;self&#x27;</li>
    <li id="mYpX"><strong>Анализ:</strong></li>
    <ul id="NsrE">
      <li id="RRLK"><code>server: nginx/1.22.0</code> — версия Nginx актуальна на момент проверки.</li>
      <li id="Z6zv"><code>x-powered-by: PHP/7.4.33</code> — PHP 7.4.33 EOL? Проверить (на момент написания 7.4 достиг EOL, могут быть уязвимости).</li>
      <li id="Nv5J"><code>PHPSESSID</code> с <code>HttpOnly; Secure</code> — хорошо.</li>
      <li id="xq9B"><code>strict-transport-security: max-age=0</code> — HSTS выключен! Очень плохо для страницы логина.</li>
      <li id="GpEW">CSP: <code>default-src &#x27;self&#x27;</code> — хорошо, но лучше конкретные директивы.</li>
    </ul>
    <li id="Pfek"><strong>Рекомендации:</strong></li>
    <ul id="6md8">
      <li id="c8hx">Включить HSTS с долгим max-age.</li>
      <li id="2H4x">Обновить PHP до поддерживаемой версии.</li>
      <li id="2VGT">Расширить CSP, запретив inline-скрипты.</li>
    </ul>
  </ol>
  <p id="s28z"><strong>Этап 10: Мониторинг изменений заголовков</strong></p>
  <p id="viQH">Заголовки могут меняться со временем: администраторы могут включить HSTS, изменить версии ПО. Мониторинг изменений помогает отслеживать обновления безопасности.</p>
  <p id="H6aD"><strong>Как организовать мониторинг:</strong></p>
  <ul id="izbo">
    <li id="bRGL">Периодически запрашивать заголовки (раз в день, раз в неделю).</li>
    <li id="XZcX">Сравнивать хэши ответов (или конкретных заголовков).</li>
    <li id="yj8x">При изменении — уведомление.</li>
  </ul>
  <p id="Bolf"><strong>Python-скрипт мониторинга:</strong></p>
  <pre id="TkOU">import hashlib
import httpx
import time

def fetch_headers_hash(url):
    response = httpx.get(url, follow_redirects=True)
    # конкатенируем все заголовки в строку
    headers_str = str(sorted(response.headers.items()))
    return hashlib.sha256(headers_str.encode()).hexdigest()

def monitor(url, interval_hours=24):
    last_hash = None
    while True:
        current_hash = fetch_headers_hash(url)
        if last_hash is None:
            last_hash = current_hash
            print(f&quot;Initial hash: {current_hash}&quot;)
        elif current_hash != last_hash:
            print(f&quot;Headers changed for {url}!&quot;)
            # здесь можно отправить уведомление
            last_hash = current_hash
        time.sleep(interval_hours * 3600)</pre>
  <p id="bp9o"><strong>Этические и правовые ограничения</strong></p>
  <ul id="rxU1">
    <li id="K8mr">Сбор заголовков с помощью curl/httpx — это обычный HTTP-запрос, который не нарушает закон (аналогично посещению сайта браузером).</li>
    <li id="UXPF">Использование <a href="https://securityheaders.com/" target="_blank">SecurityHeaders.com</a> и аналогичных сервисов также легально.</li>
    <li id="Hljj">Массовый сбор заголовков (тысячи доменов) может привести к блокировке IP, если сайт расценит это как сканирование. Используйте разумные интервалы.</li>
    <li id="ncjG">Анализ заголовков безопасности не даёт права атаковать сайт. Информация используется для оценки защищённости (в рамках разрешённого тестирования).</li>
  </ul>
  <p id="23Uj">HTTP-заголовки — богатый источник информации при пассивном техническом OSINT. Идентификационные заголовки (<code>Server</code>, <code>X-Powered-By</code>) раскрывают версии ПО, что позволяет искать уязвимости. Заголовки cookie указывают на используемые технологии и фреймворки. Заголовки безопасности (CSP, HSTS, X-Frame-Options) оценивают защищённость веб-приложения. Заголовки кэширования и прокси помогают определить CDN и скрыть реальный IP. Комбинация этих данных с результатами других статей цикла даёт наиболее полную картину инфраструктуры цели.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Technological-stack-of-sites</guid><link>https://teletype.in/@specialist_infosec/Technological-stack-of-sites?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Technological-stack-of-sites?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Технологический стек сайтов: Wappalyzer, BuiltWith, определение CMS и библиотек</title><pubDate>Sat, 20 Jun 2026 06:34:15 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/08/2f/082fb125-00c7-48bd-803a-d3a971966ffb.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/59/5e/595eb634-927c-4d7f-ad88-ed0e91cd451e.png"></img>Веб-сайты редко создаются с нуля. Они собираются из компонентов: систем управления контентом (CMS), фреймворков, библиотек JavaScript, аналитических платформ, рекламных сетей и т.д. Знание технологического стека цели позволяет не только понять её архитектуру, но и выявить уязвимости (устаревшие версии WordPress, известные уязвимости jQuery), а также получить подсказки о бюджете, кадровом составе и используемых облачных сервисах. Определение стека возможно пассивно (по заголовкам, HTML-коду, паттернам) или активно (запросы к специальным файлам). Данная статья посвящена методам и инструментам идентификации технологий веб-сайтов.]]></description><content:encoded><![CDATA[
  <figure id="Tmik" class="m_retina">
    <img src="https://img2.teletype.in/files/59/5e/595eb634-927c-4d7f-ad88-ed0e91cd451e.png" width="1117" />
  </figure>
  <h3 id="W651">Технологический стек сайтов: Wappalyzer, BuiltWith, определение CMS и библиотек</h3>
  <p id="fxzi">Веб-сайты редко создаются с нуля. Они собираются из компонентов: систем управления контентом (CMS), фреймворков, библиотек JavaScript, аналитических платформ, рекламных сетей и т.д. Знание технологического стека цели позволяет не только понять её архитектуру, но и выявить уязвимости (устаревшие версии WordPress, известные уязвимости jQuery), а также получить подсказки о бюджете, кадровом составе и используемых облачных сервисах. Определение стека возможно пассивно (по заголовкам, HTML-коду, паттернам) или активно (запросы к специальным файлам). Данная статья посвящена методам и инструментам идентификации технологий веб-сайтов.</p>
  <p id="4unq"><strong>Категории технологий, которые можно определить</strong></p>
  <figure id="GWXD" class="m_column">
    <img src="https://img2.teletype.in/files/d9/10/d910516d-f8f8-4b12-ae60-67110831add4.png" width="1197" />
  </figure>
  <p id="61IJ"><strong>Этап 1: Пассивное определение через HTTP-заголовки</strong></p>
  <p id="jZvE">Самый простой метод — отправить HTTP-запрос к сайту и проанализировать заголовки ответа.</p>
  <p id="d8k5"><strong>Что дают заголовки:</strong></p>
  <ul id="DvDF">
    <li id="VHaj"><code>Server</code> — тип и версия веб-сервера (например, <code>nginx/1.18.0</code>).</li>
    <li id="Wplw"><code>X-Powered-By</code> — технология бэкенда (<code>PHP/7.4</code>, <code>ASP.NET</code>).</li>
    <li id="sOax"><code>X-CMS</code> — иногда CMS указывает себя (редко).</li>
    <li id="n9AP"><code>Set-Cookie</code> — может содержать идентификаторы CMS (например, <code>wp-settings-1</code> для WordPress).</li>
    <li id="Kbwm"><code>X-Drupal-Cache</code>, <code>X-Generator</code>, <code>X-Request-ID</code> и др.</li>
  </ul>
  <p id="Ii3c"><strong>Инструменты для просмотра заголовков:</strong></p>
  <ul id="cbEC">
    <li id="R76h"><strong>curl</strong> (командная строка): <code>curl -I https://example.com</code></li>
    <li id="8uXt"><strong>Browser DevTools</strong> (вкладка Network).</li>
    <li id="hmKM"><strong>Online сервисы:</strong> <a href="https://securityheaders.io/" target="_blank">SecurityHeaders.io</a>, HTTPHeaderCheck.</li>
  </ul>
  <p id="yM7d"><strong>Пример curl:</strong></p>
  <pre id="6k1i">curl -I https://www.example.com</pre>
  <p id="5xJh"><strong>Анализ cookies:</strong></p>
  <ul id="L3Am">
    <li id="EwdB"><code>PHPSESSID</code> → PHP.</li>
    <li id="61o6"><code>JSESSIONID</code> → Java (JSP).</li>
    <li id="GOZl"><code>ASPSESSIONID</code> → <a href="https://asp.net/" target="_blank">ASP.NET</a>.</li>
    <li id="yLFS"><code>wp-settings-*</code>, <code>wordpress_logged_in_*</code> → WordPress.</li>
    <li id="J41q"><code>laravel_session</code> → Laravel.</li>
  </ul>
  <p id="p12A"><strong>Этап 2: Автоматические детекторы (Wappalyzer, BuiltWith, WhatRuns)</strong></p>
  <p id="px3d"><strong>Wappalyzer</strong> — расширение для браузера (и CLI-инструмент), определяющее технологии по множеству сигнатур: HTML, JavaScript, заголовки, паттерны URL, meta-теги.</p>
  <p id="fHww"><strong>Как установить:</strong></p>
  <ul id="BLJZ">
    <li id="xRM2">Расширение для Chrome/Firefox (бесплатно).</li>
    <li id="IHvF">CLI-версия: <code>npm install -g wappalyzer</code>.</li>
  </ul>
  <p id="XOnb"><strong>Использование CLI:</strong></p>
  <pre id="TUdP">wappalyzer https://example.com</pre>
  <p id="Kco7"><strong>Пример вывода (сокращённо):</strong></p>
  <pre id="6CI9">{
  &quot;url&quot;: &quot;https://example.com&quot;,
  &quot;technologies&quot;: [
    {&quot;name&quot;: &quot;Nginx&quot;, &quot;version&quot;: &quot;1.18.0&quot;},
    {&quot;name&quot;: &quot;PHP&quot;, &quot;version&quot;: &quot;7.4.33&quot;},
    {&quot;name&quot;: &quot;WordPress&quot;, &quot;version&quot;: &quot;6.2&quot;},
    {&quot;name&quot;: &quot;jQuery&quot;, &quot;version&quot;: &quot;3.6.0&quot;},
    {&quot;name&quot;: &quot;Google Analytics&quot;, &quot;id&quot;: &quot;UA-12345678-1&quot;}
  ]
}</pre>
  <p id="4Y8x"><strong>BuiltWith</strong> — онлайн-сервис, который не только определяет технологии, но и показывает историю их использования, а также другие домены, использующие те же идентификаторы (например, Google Analytics ID). Платный API позволяет массовые запросы.</p>
  <p id="T8kK"><strong>Как использовать BuiltWith бесплатно:</strong></p>
  <ul id="pEry">
    <li id="HZYV">Ввести URL на <a href="https://builtwith.com/" target="_blank">builtwith.com</a>.</li>
    <li id="5VPS">Получить подробный отчёт: веб-сервер, CMS, аналитика, виджеты, хостинг, SSL-провайдер.</li>
  </ul>
  <p id="gzSP"><strong>Что можно найти через BuiltWith:</strong></p>
  <ul id="SK6p">
    <li id="Gcpo">Связанные сайты по общему Google Analytics ID или AdSense ID.</li>
    <li id="7z1E">Пересечения по хостингу, IP.</li>
    <li id="IATq">Историю изменений технологий.</li>
  </ul>
  <p id="pbFL"><strong>WhatRuns</strong> — аналог Wappalyzer, но с фокусом на библиотеки фронтенда. Есть веб-интерфейс и расширение.</p>
  <p id="9ToI"><strong>Сравнение детекторов:</strong></p>
  <figure id="j91t" class="m_column">
    <img src="https://img1.teletype.in/files/4b/0e/4b0e6579-64dc-4e6c-9354-18ff3065ef28.png" width="1010" />
  </figure>
  <p id="oYg3"><strong>Этап 3: Определение CMS по характерным путям и файлам</strong></p>
  <p id="P8Bw">Каждая CMS имеет уникальную структуру URL, файлы и мета-теги.</p>
  <p id="DltC"><strong>WordPress:</strong></p>
  <ul id="VcVS">
    <li id="uew7"><code>/wp-admin</code>, <code>/wp-content</code>, <code>/wp-includes</code></li>
    <li id="6FKR"><code>Generator</code> мета-тег: <code>&lt;meta name=&quot;generator&quot; content=&quot;WordPress X.X.X&quot;&gt;</code></li>
    <li id="wvTZ">Файл <code>/wp-login.php</code></li>
    <li id="4ga8">Robots.txt часто содержит <code>Disallow: /wp-admin/</code></li>
  </ul>
  <p id="gwFR"><strong>Drupal:</strong></p>
  <ul id="Ru0v">
    <li id="Dvlm"><code>/sites/default/files</code>, <code>/core</code>, <code>/modules</code></li>
    <li id="X3pM"><code>Generator</code> мета-тег: <code>&lt;meta name=&quot;Generator&quot; content=&quot;Drupal X (http://drupal.org)&quot;&gt;</code></li>
    <li id="Cof5">Страница <code>/user/login</code></li>
  </ul>
  <p id="yozt"><strong>Joomla:</strong></p>
  <ul id="nrEA">
    <li id="Ds4Z"><code>/administrator</code>, <code>/media</code>, <code>/components</code></li>
    <li id="yrpx">Мета-тег: <code>&lt;meta name=&quot;generator&quot; content=&quot;Joomla! - Open Source Content Management&quot;&gt;</code></li>
    <li id="5swF">Robots.txt: <code>Disallow: /administrator/</code></li>
  </ul>
  <p id="BWpq"><strong>Bitrix (1С-Битрикс):</strong></p>
  <ul id="Tyqp">
    <li id="cFBS"><code>/bitrix</code>, <code>/bitrix/admin</code></li>
    <li id="2kWJ"><code>/bitrix/tools</code>, <code>/bitrix/js</code></li>
    <li id="74HD">Мета-тег: редко указывает версию.</li>
  </ul>
  <p id="BaBX"><strong>Tilda (тильда):</strong></p>
  <ul id="AhX7">
    <li id="nRPt">URL с <code>project123456.tilda.ws</code> или кастомный домен, но в коде есть <code>//tilda.cc</code></li>
    <li id="NKj5">Блоки <code>.t396</code>, <code>.t-carousel</code></li>
  </ul>
  <p id="vW2Z"><strong>Этап 4: Определение версии CMS</strong></p>
  <p id="fWew">Версия может быть указана в:</p>
  <ul id="eTzx">
    <li id="OqrL">Meta-теге <code>generator</code> (WordPress, Drupal, иногда Joomla).</li>
    <li id="NoOV">Файле <code>readme.html</code> или <code>readme.txt</code> в корне (WordPress, Drupal).</li>
    <li id="IFVK">Странице <code>/wp-admin/</code> в HTML-комментариях (WordPress).</li>
    <li id="88Na">Специфических файлах стилей (например, <code>/wp-content/themes/twentytwenty/style.css</code> содержит <code>Version:</code>).</li>
  </ul>
  <p id="Nbtq"><strong>Пример получения версии WordPress:</strong></p>
  <pre id="MGL6">curl -s https://example.com/readme.html | grep -i &quot;Version&quot;</pre>
  <p id="oHDd">или</p>
  <pre id="EFrx">curl -s https://example.com/wp-content/themes/twentytwenty/style.css | grep -i &quot;Version:&quot;</pre>
  <p id="ivIH"><strong>Ограничения:</strong> версии могут быть скрыты или изменены.</p>
  <p id="4OzF"><strong>Этап 5: Анализ фронтенд-библиотек</strong></p>
  <p id="1bwF">Библиотеки JavaScript часто оставляют следы в глобальных объектах, версиях в исходном коде, а также в путях к файлам.</p>
  <p id="8uyX"><strong>Способы определения:</strong></p>
  <ul id="JUGp">
    <li id="Gynv"><strong>Браузерная консоль:</strong> ввести <code>jQuery().jquery</code> (если jQuery загружен), <code>React.version</code>, <code>Vue.version</code>.</li>
    <li id="h80m"><strong>Поиск в исходном коде страницы:</strong> <code>//ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js</code></li>
    <li id="krak"><strong>Проверка на уязвимости:</strong> <strong>Retire.js</strong> (расширение для браузера) или CLI.</li>
  </ul>
  <p id="93Un"><strong>Retire.js CLI:</strong></p>
  <pre id="3ILK">npm install -g retire
retire --url https://example.com</pre>
  <p id="n7l6"><strong>Этап 6: Определение хостинга и CDN</strong></p>
  <p id="P3yw"><strong>Хостинг:</strong></p>
  <ul id="TGCY">
    <li id="q7Qa"><strong>whois IP</strong> покажет организацию.</li>
    <li id="z9j5"><strong>BuiltWith</strong> в разделе &quot;Hosting&quot;.</li>
    <li id="29xO"><strong>Поиск по IP в Shodan</strong> → раздел &quot;org&quot;.</li>
  </ul>
  <p id="gsiG"><strong>CDN:</strong></p>
  <ul id="LvpT">
    <li id="4FAS">Проверить наличие заголовка <code>CF-Cache-Status</code> (Cloudflare).</li>
    <li id="TUte">Наличие <code>X-Cache</code>, <code>X-Cache-Hits</code> (Akamai, AWS CloudFront).</li>
    <li id="vpIG">CNAME записи: например, <code>cdn.example.com CNAME</code> <code>cdn.shopify.com</code>.</li>
  </ul>
  <p id="Nrw3"><strong>Список известных CDN:</strong></p>
  <ul id="5AnD">
    <li id="pLNt">Cloudflare (IP-диапазоны публикуются)</li>
    <li id="VX1V">Akamai</li>
    <li id="2B2U">Amazon CloudFront (<code>.cloudfront.net</code>)</li>
    <li id="4iB7">Fastly</li>
    <li id="NrjF">StackPath</li>
  </ul>
  <p id="Ex7X"><strong>Этап 7: Определение аналитических систем (Google Analytics, Yandex.Metrica)</strong></p>
  <p id="lnop">Идентификаторы аналитики можно использовать для поиска других сайтов, принадлежащих той же организации.</p>
  <p id="CQeq"><strong>Как найти ID:</strong></p>
  <ul id="oIVi">
    <li id="wFDp">Поиск в HTML-коде: <code>UA-12345678-1</code> (Google Analytics Universal), <code>G-XXXXXXXX</code> (GA4).</li>
    <li id="WPsj">Для Яндекс.Метрики: <code>&lt;meta name=&quot;yandex-verification&quot; content=&quot;...&quot;&gt;</code> или <code>Ya.Metrika.informer</code>.</li>
  </ul>
  <p id="kXyT"><strong>Поиск по идентификатору через BuiltWith:</strong></p>
  <ul id="NPoO">
    <li id="P1sm">Ввести <code>UA-12345678-1</code> в поисковую строку BuiltWith → список сайтов с этим ID.</li>
  </ul>
  <p id="Zt2n"><strong>Google Analytics ID может быть одинаковым для нескольких доменов одной компании.</strong></p>
  <p id="LVwz"><strong>Этап 8: Обнаружение скрытых директорий и файлов (active)</strong></p>
  <p id="YRjS">Это уже активный метод, но его можно использовать с разрешения. Инструменты: <strong>Dirb</strong>, <strong>Gobuster</strong>, <strong>FFUF</strong>.</p>
  <p id="cSgR"><strong>Пример Gobuster:</strong></p>
  <pre id="VwI4">gobuster dir -u https://example.com -w /usr/share/wordlists/dirb/common.txt</pre>
  <p id="BGJu"><strong>Что можно найти:</strong></p>
  <ul id="WoJR">
    <li id="1KyN"><code>/phpmyadmin</code>, <code>/adminer</code>, <code>/pma</code> — инструменты управления БД.</li>
    <li id="id8G"><code>/git</code>, <code>/.git/config</code> — утечка репозитория.</li>
    <li id="I8gj"><code>/backup</code>, <code>/old</code> — старые версии сайта.</li>
    <li id="uPOG"><code>/api</code> — API-эндпоинты.</li>
  </ul>
  <p id="tPRH"><strong>Важно:</strong> не сканируйте чужие сайты без разрешения.</p>
  <p id="5xBI"><strong>Этап 9: Объединение данных с другими источниками</strong></p>
  <p id="piD9">Технологический стек дополняет картину, полученную из DNS, поддоменов и сканирования портов.</p>
  <p id="KH08"><strong>Практический пример: полный разбор веб-инфраструктуры</strong></p>
  <p id="9PUx"><em>Задача:</em> охарактеризовать сайт <code>target.org</code>.</p>
  <ol id="kOin">
    <li id="8HIf"><strong>HTTP-заголовки:</strong></li>
    <ul id="kfMd">
      <li id="M41q"><code>Server: nginx/1.22.1</code></li>
      <li id="dJy0"><code>X-Powered-By: PHP/8.1.2</code></li>
      <li id="AejS"><code>Set-Cookie: PHPSESSID=...</code> → PHP.</li>
    </ul>
    <li id="x3Gj"><strong>Wappalyzer:</strong></li>
    <ul id="mURJ">
      <li id="Y7iM">CMS: Drupal 9.5</li>
      <li id="h5Fs">Фронтенд: jQuery 3.6.0, Bootstrap 4.6</li>
      <li id="ms8I">Аналитика: Google Analytics (UA-12345678-1)</li>
    </ul>
    <li id="YyFa"><strong>BuiltWith:</strong></li>
    <ul id="ifVW">
      <li id="xJQS">Хостинг: Amazon AWS (us-east-1)</li>
      <li id="UTQv">CDN: CloudFront</li>
      <li id="JbS8">SSL: Let&#x27;s Encrypt</li>
      <li id="qkSN">Ecommerce: нет.</li>
    </ul>
    <li id="pB1M"><strong>Поиск по Google Analytics ID через BuiltWith:</strong></li>
    <ul id="iXCV">
      <li id="hdx7">Найдены ещё два сайта: <code>other.target.org</code> и <code>blog.target.org</code>. Оба на Drupal, тот же хостинг.</li>
    </ul>
    <li id="qyYF"><strong>Проверка версии Drupal:</strong></li>
    <ul id="Aj0n">
      <li id="BP7D"><code>/README.txt</code> → Drupal 9.5.3.</li>
      <li id="IkK3"><code>/core/CHANGELOG.txt</code> → подтверждает.</li>
    </ul>
    <li id="EXME"><strong>Анализ фронтенда:</strong></li>
    <ul id="qIi7">
      <li id="8MPq">jQuery 3.6.0 (без уязвимостей).</li>
      <li id="kAHh">Bootstrap 4.6 (устаревший, но не критично).</li>
    </ul>
    <li id="qeWa"><strong>CDN:</strong></li>
    <ul id="8yYz">
      <li id="5vLj">IP-адрес сайта скрыт за CloudFront (проверено через <code>dig A target.org</code> → IP принадлежит AWS CloudFront).</li>
      <li id="v2lr">Но есть другие поддомены, указывающие на реальные IP (можно найти через SecurityTrails).</li>
    </ul>
    <li id="44s6"><strong>Вывод:</strong> организация использует AWS с CloudFront, Drupal 9.5, имеет связанные сайты. Версия Drupal 9.5.x имеет несколько известных уязвимостей (CVE-2023-XXXX), требуется обновление. Google Analytics ID связывает три сайта, что указывает на единую структуру.</li>
  </ol>
  <p id="eghM"><strong>Автоматизация: сбор технологического стека через API Wappalyzer</strong></p>
  <pre id="ZLkL">import json
import requests

def wappalyzer_detect(url):
    # Wappalyzer CLI (если установлен) или можно использовать их API (платно)
    # Пример через subprocess
    import subprocess
    result = subprocess.run([&#x27;wappalyzer&#x27;, url], capture_output=True, text=True)
    if result.returncode == 0:
        return json.loads(result.stdout)
    else:
        return None

def builtwith_lookup(url):
    # BuiltWith API (требуется ключ)
    api_key = &quot;YOUR_API_KEY&quot;
    endpoint = f&quot;https://api.builtwith.com/free1/api.json?KEY={api_key}&amp;LOOKUP={url}&quot;
    resp = requests.get(endpoint)
    if resp.status_code == 200:
        return resp.json()
    return None

# Пример
tech = wappalyzer_detect(&quot;https://example.com&quot;)
print(json.dumps(tech, indent=2))</pre>
  <ul id="ot9m">
    <li id="fEWy">Определение технологического стека через пассивные методы (заголовки, HTML) — легально.</li>
    <li id="GaoR">Активный поиск файлов (Dirb, Gobuster) — требует разрешения владельца.</li>
    <li id="3VTE">Использование BuiltWith для поиска по ID (Google Analytics) легально, но может быть сочтено навязчивым, если используется для массового сбора данных.</li>
  </ul>
  <p id="l7u4">Идентификация технологического стека — обязательный этап при исследовании веб-приложения. Wappalyzer и BuiltWith автоматизируют большую часть работы. Важно не только определить технологии, но и оценить версии (особенно устаревшие) и выявить связи по аналитическим идентификаторам. Эта информация может привести к обнаружению других активов организации. В связке с SSL-сертификатами, поддоменами и портами технологический стек закрывает ещё одну часть пазла внешней инфраструктуры.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/ObGrLJ_4SR6</guid><link>https://teletype.in/@specialist_infosec/ObGrLJ_4SR6?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/ObGrLJ_4SR6?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Анализ SSL/TLS сертификатов: Certificate Transparency logs, выявление скрытых хостов</title><pubDate>Sun, 14 Jun 2026 05:45:48 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a0/32/a0325faf-107a-4f8d-a30f-bca56906280f.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/1b/e6/1be6116b-e074-4d9f-b681-106e836d9f05.png"></img>SSL/TLS сертификаты — это цифровые удостоверения, которые обеспечивают шифрование соединений и подтверждают подлинность веб-сайтов. В контексте технического OSINT сертификаты становятся золотоносной жилой: они часто содержат имена доменов и поддоменов, которые не видны в DNS, а также могут раскрывать внутренние и тестовые хосты организации. Благодаря механизму Certificate Transparency (CT), каждый выданный сертификат публикуется в публичных логах, доступных для поиска. Данная статья посвящена методам анализа сертификатов, использованию CT-логов и выявлению скрытых активов.]]></description><content:encoded><![CDATA[
  <figure id="MjPB" class="m_retina">
    <img src="https://img2.teletype.in/files/1b/e6/1be6116b-e074-4d9f-b681-106e836d9f05.png" width="1091.5" />
  </figure>
  <h3 id="xojR">Анализ SSL/TLS сертификатов: Certificate Transparency logs, выявление скрытых хостов</h3>
  <p id="8l30"><strong>Введение</strong></p>
  <p id="wmz3">SSL/TLS сертификаты — это цифровые удостоверения, которые обеспечивают шифрование соединений и подтверждают подлинность веб-сайтов. В контексте технического OSINT сертификаты становятся золотоносной жилой: они часто содержат имена доменов и поддоменов, которые не видны в DNS, а также могут раскрывать внутренние и тестовые хосты организации. Благодаря механизму Certificate Transparency (CT), каждый выданный сертификат публикуется в публичных логах, доступных для поиска. Данная статья посвящена методам анализа сертификатов, использованию CT-логов и выявлению скрытых активов.</p>
  <p id="aUuG"><strong>Что такое Certificate Transparency (CT)?</strong></p>
  <p id="QigP">CT — это открытая система аудита сертификатов, созданная для обнаружения ошибочных или злонамеренно выданных сертификатов. Когда центр сертификации (CA) выпускает сертификат, он обязан отправить его в несколько публичных CT-логов. Логи неизменяемы и доступны для всех. Благодаря этому любой исследователь может найти все сертификаты, выданные для домена (или любого шаблона), включая сертификаты для внутренних поддоменов, которые никогда не публиковались в DNS.</p>
  <p id="S6oQ"><strong>Почему сертификаты ценны для OSINT?</strong></p>
  <figure id="JF4o" class="m_column">
    <img src="https://img1.teletype.in/files/c0/29/c029e897-7188-4429-95c9-3da179738e79.png" width="941" />
  </figure>
  <p id="lfvA"><strong>Основные источники CT-логов</strong></p>
  <figure id="7dpi" class="m_column">
    <img src="https://img3.teletype.in/files/2b/eb/2beb4fb7-28a6-4583-b6dd-75a4aedaeb40.png" width="944" />
  </figure>
  <p id="QqN9"><strong>Этап 1: Базовый поиск сертификатов через crt.sh</strong></p>
  <p id="igia">crt.sh (<a href="https://crt.sh" target="_blank">https://crt.sh</a>) — это общедоступный интерфейс к CT-логам. Проще всего начать с запроса:</p>
  <pre id="T5jP">https://crt.sh/?q=%.example.com</pre>
  <p id="bSPc">где <code>%</code> заменяет любой префикс. Этот запрос найдёт все сертификаты, содержащие строку <code>example.com</code> в любом поле (<code>name_value</code>).</p>
  <p id="r11O"><strong>Параметры crt.sh:</strong></p>
  <ul id="f6vF">
    <li id="tdVU"><code>q</code> — поисковый запрос (можно использовать SQL-подобные операторы).</li>
    <li id="9e4I"><code>excluded</code> — исключить мёртвые сертификаты (expired, revoked).</li>
    <li id="C1YA"><code>output</code> — формат вывода (json, csv, html).</li>
    <li id="WLaZ"><code>limit</code> — количество результатов (по умолчанию 2000).</li>
  </ul>
  <p id="HNKb"><strong>Примеры запросов:</strong></p>
  <ul id="42Py">
    <li id="LW63"><code>?q=example.com</code> — ищет точное совпадение в любом поле.</li>
    <li id="vai5"><code>?q=%.example.com</code> — ищет все поддомены.</li>
    <li id="NhV0"><code>?q=*.example.com</code> — ищет wildcard-сертификаты.</li>
    <li id="IsGN"><code>?q=example.com&amp;excluded=expired</code> — исключить истекшие.</li>
  </ul>
  <p id="97fF"><strong>Использование API crt.sh (JSON):</strong></p>
  <pre id="TPGI">https://crt.sh/?q=%.example.com&amp;output=json</pre>
  <p id="NKSz"><strong>Python-функция для получения сертификатов:</strong></p>
  <pre id="xkEZ">import requests
import json

def get_certificates(domain, exclude_expired=True):
    url = f&quot;https://crt.sh/?q=%25.{domain}&amp;output=json&quot;
    if exclude_expired:
        url += &quot;&amp;excluded=expired&quot;
    resp = requests.get(url)
    if resp.status_code == 200:
        try:
            data = resp.json()
            # crt.sh возвращает список списков, каждый подсписок — запись
            # Поля: idx, name, issuer, validity_start, validity_end, ca, cert
            certs = []
            for row in data:
                cert = {
                    &#x27;name&#x27;: row[1],
                    &#x27;issuer&#x27;: row[2],
                    &#x27;valid_from&#x27;: row[3],
                    &#x27;valid_to&#x27;: row[4],
                    &#x27;ca&#x27;: row[5],
                    &#x27;certificate&#x27;: row[6]
                }
                certs.append(cert)
            return certs
        except:
            return []
    return []

certs = get_certificates(&quot;example.com&quot;)
for c in certs:
    print(c[&#x27;name&#x27;], c[&#x27;valid_to&#x27;])</pre>
  <p id="tFr2"><strong>Этап 2: Извлечение доменов из Subject Alternative Names (SAN)</strong></p>
  <p id="7PEF">Большинство современных сертификатов используют расширение SAN (Subject Alternative Names), которое содержит список всех имён, для которых действителен сертификат. Это наиболее ценный источник поддоменов.</p>
  <p id="Ycfq"><strong>Пример записи SAN из crt.sh:</strong></p>
  <pre id="1G8I">name_value: example.com
           www.example.com
           mail.example.com
           admin.example.com
           *.example.com</pre>
  <p id="EPgt">Обратите внимание, что <code>*.example.com</code> — wildcard-сертификат, который покрывает все поддомены первого уровня. Однако с 2023 года некоторые CA начали ограничивать выдачу wildcard-сертификатов.</p>
  <p id="DXDl"><strong>Как извлечь все уникальные имена из набора сертификатов:</strong></p>
  <pre id="o1TT">def extract_domains(certificates):
    domains = set()
    for cert in certificates:
        names = cert[&#x27;name&#x27;].split(&#x27;\n&#x27;)  # часто имена разделены \n
        for name in names:
            name = name.strip().lower()
            if name and not name.startswith(&#x27;*.&#x27;):
                domains.add(name)
            elif name.startswith(&#x27;*.&#x27;):  # wildcard
                domains.add(name[2:])    # добавляем зону, но с пометкой
    return sorted(domains)</pre>
  <p id="wo9w"><strong>Этап 3: Поиск по части имени (через SQL-запросы crt.sh)</strong></p>
  <p id="38Em">crt.sh поддерживает прямые SQL-запросы (язык PostgreSQL). Это позволяет делать сложные поиски, например:</p>
  <pre id="rbnv">https://crt.sh/?q=SELECT name_value FROM certificate_identity WHERE name_value LIKE &#x27;%.example.com%&#x27; AND name_value NOT LIKE &#x27;%.%.%&#x27;</pre>
  <p id="NFAF">Этот запрос найдёт только поддомены первого уровня (без точек в средней части).</p>
  <p id="wOmq"><strong>Полезные SQL-шаблоны:</strong></p>
  <ul id="TcBV">
    <li id="frXq">Все сертификаты, выданные определённым CA: <code>q=SELECT * FROM certificate WHERE issuer LIKE &#x27;%Let%27s Encrypt%&#x27;</code></li>
    <li id="iNYW">Сертификаты, истекающие в ближайшие 30 дней: <code>q=SELECT name_value, not_after FROM certificate WHERE not_after &lt; NOW() + interval &#x27;30 days&#x27; AND name_value LIKE &#x27;%.example.com&#x27;</code></li>
  </ul>
  <p id="NyhP"><strong>Этап 4: Выявление скрытых хостов через сертификаты</strong></p>
  <p id="p2O6">Скрытые хосты — это внутренние или тестовые поддомены, которые не разрешаются в DNS публично, но для них был выпущен сертификат (например, <code>dev-db.internal.example.com</code>). Такой сертификат будет в CT-логах, даже если DNS-запрос к <code>dev-db.internal.example.com</code> не вернёт IP.</p>
  <p id="GPmO"><strong>Почему это возможно?</strong></p>
  <ul id="FW6w">
    <li id="pbp4">Сертификат мог быть выпущен до того, как поддомен был удалён из DNS.</li>
    <li id="a0c9">Внутренние серверы могут иметь сертификаты для своих внутренних имён, но по ошибке они стали публичными.</li>
    <li id="SOaf">Некоторые организации используют общие сертификаты для многих внутренних серверов, и эти сертификаты попадают в CT.</li>
  </ul>
  <p id="bk8k"><strong>Как найти такие хосты:</strong></p>
  <ol id="e0KH">
    <li id="xioQ">Выполните поиск <code>%.example.com</code> в crt.sh.</li>
    <li id="ZkTk">Извлеките все имена.</li>
    <li id="KAZA">Для каждого имени выполните DNS-запрос A/AAAA. Если запрос не возвращает IP, но имя выглядит правдоподобно — это скрытый хост.</li>
    <li id="q6sI">Проверьте IP через Shodan/Censys — возможно, сертификат был выдан для IP-адреса, который сейчас неактивен.</li>
  </ol>
  <p id="EyqI"><strong>Python-скрипт для обнаружения скрытых хостов:</strong></p>
  <pre id="rsDc">import dns.resolver
import requests

def check_dns(domain):
    try:
        answers = dns.resolver.resolve(domain, &#x27;A&#x27;)
        return [str(r) for r in answers]
    except:
        return []

# Получить все имена из сертификатов
certs = get_certificates(&quot;example.com&quot;)
domains = extract_domains(certs)

hidden = []
for domain in domains:
    ips = check_dns(domain)
    if not ips:
        print(f&quot;Скрытый хост (не резолвится): {domain}&quot;)
        hidden.append(domain)
    else:
        print(f&quot;{domain} -&gt; {ips}&quot;)

print(f&quot;Найдено скрытых хостов: {len(hidden)}&quot;)</pre>
  <p id="GxP3"><strong>Этап 5: Анализ времени действия сертификата</strong></p>
  <p id="3Ayf">Дата истечения сертификата может указывать на то, насколько активно используется хост. Сертификаты, которые истекают, обычно обновляются, если хост жив. Если сертификат истёк давно, а новых нет — хост, вероятно, выведен из эксплуатации.</p>
  <p id="DauU"><strong>Применение:</strong></p>
  <ul id="llOp">
    <li id="VK4g">Найти старые сертификаты для <code>old-site.example.com</code>, чтобы восстановить историю.</li>
    <li id="deiY">Определить закономерности обновления сертификатов (например, каждые 90 дней — Let&#x27;s Encrypt).</li>
    <li id="ZPHT">Обнаружить сертификаты с очень длинным сроком действия (могут быть самоподписными или тестовыми).</li>
  </ul>
  <p id="3u2s"><strong>Этап 6: Поиск сертификатов по серийному номеру</strong></p>
  <p id="JOQO">Если у вас есть серийный номер сертификата (например, из утечки файла), можно найти его в CT-логах и получить связанные домены.</p>
  <p id="c56S"><strong>Поиск в crt.sh по серийному номеру:</strong></p>
  <pre id="arJZ">https://crt.sh/?q=serial_number_string</pre>
  <p id="Ouq5"><strong>Серийные номера обычно шестнадцатеричные.</strong> Этот метод полезен, если вы нашли сертификат на сервере (через OpenSSL) и хотите узнать, какие ещё домены есть в том же сертификате.</p>
  <p id="5Wx7"><strong>Этап 7: Интеграция с Shodan/Censys для поиска по хэшу сертификата</strong></p>
  <p id="GthK">Shodan и Censys позволяют искать устройства по хэшу сертификата (SHA1 или SHA256). Это позволяет найти все серверы в интернете, использующие тот же сертификат (или тот же ключ).</p>
  <p id="39dr"><strong>Shodan фильтр <code>ssl.cert.sha256</code>:</strong></p>
  <pre id="lw9K">ssl.cert.sha256:5f5a5f5a5f5a5f5a5f5a5f5a5f5a5f5a5f5a5f5a</pre>
  <p id="Pt6g">Так можно обнаружить все серверы организации, использующие единый сертификат.</p>
  <p id="pTwP"><strong>Censys аналогично:</strong></p>
  <pre id="L0vE">services.tls.certificate.leaf_fingerprint_sha256: &lt;hash&gt;</pre>
  <p id="Q30c"><strong>Этап 8: Мониторинг новых сертификатов (CertSpotter)</strong></p>
  <p id="Gvcs">CertSpotter (<a href="https://sslmate.com/certspotter/" target="_blank">https://sslmate.com/certspotter/</a>) — это сервис, который отслеживает CT-логи и уведомляет вас о появлении новых сертификатов для указанных доменов. Он особенно полезен для мониторинга инфраструктуры конкурентов или собственной.</p>
  <p id="n3vg"><strong>Как использовать:</strong></p>
  <ul id="51eF">
    <li id="4YDK">Бесплатный аккаунт позволяет добавить до 10 доменов.</li>
    <li id="qfmP">При обнаружении нового сертификата приходит email.</li>
    <li id="Gnoi">Можно также использовать API для автоматической обработки.</li>
  </ul>
  <p id="gDK6"><strong>Этап 9: Обнаружение сертификатов, связанных с организацией</strong></p>
  <p id="2Gz5">Если вы знаете юридическое название организации (Organization field в сертификате), можно найти все сертификаты, выпущенные на это имя (даже если домены не связаны явно).</p>
  <p id="oMF5"><strong>Поиск в crt.sh по организации:</strong></p>
  <pre id="5VdG">https://crt.sh/?q=O%3DExample%20Inc</pre>
  <p id="8hAv"><strong>Пример:</strong> <code>O=Google Trust Services</code> найдёт сертификаты Google.</p>
  <p id="XgaJ"><strong>Осторожно:</strong> поле O не всегда заполняется, особенно для сертификатов Let&#x27;s Encrypt (там только O=Let&#x27;s Encrypt).</p>
  <p id="x5wr"><strong>Практический пример: полное исследование компании через сертификаты</strong></p>
  <p id="mRYA"><em>Задача:</em> найти все домены, связанные с компанией <code>acme.com</code>, включая тестовые поддомены и внутренние хосты.</p>
  <ol id="cGLv">
    <li id="fhxn"><strong>crt.sh для <code>%.acme.com</code></strong> → 120 сертификатов, 350 уникальных имён.</li>
    <li id="pxBp"><strong>Очистка:</strong> убрать дубликаты, домены, не заканчивающиеся на <code>acme.com</code> (убрать сторонние).</li>
    <li id="TBse"><strong>DNS-проверка:</strong> 80 имён резолвятся в IP, 270 — нет (скрытые).</li>
    <li id="T6hL"><strong>Среди скрытых</strong> находим <code>test.acme.com</code>, <code>staging.api.acme.com</code>, <code>jenkins.acme.com</code>.</li>
    <li id="AX1a"><strong>Проверка Shodan</strong> для <code>jenkins.acme.com</code> (хотя IP не резолвится, возможно, сертификат есть на каком-то IP). Shodan: <code>ssl.cert.subject.CN:jenkins.acme.com</code> → находим IP <code>198.51.100.45</code> с открытым 8080.</li>
    <li id="SfbO"><strong>Анализ:</strong> Jenkins сервер доступен по IP, но не имеет DNS-записи. Уязвимость.</li>
    <li id="EBvr"><strong>Исторические сертификаты:</strong> старый сертификат <code>old.acme.com</code> истёк в 2022, но в логах есть. Его IP <code>203.0.113.88</code> уже не доступен.</li>
    <li id="fVce"><strong>Вывод:</strong> обнаружены забытые, но активные серверы, требующие внимания.</li>
  </ol>
  <p id="6ufo"><strong>Автоматизация мониторинга через crt.sh API</strong></p>
  <pre id="LIXK">import requests
import time
import hashlib

def monitor_new_certs(domain, last_check_file):
    # загружаем последний известный хэш
    try:
        with open(last_check_file, &#x27;r&#x27;) as f:
            last_hash = f.read().strip()
    except:
        last_hash = &#x27;&#x27;
    
    url = f&quot;https://crt.sh/?q=%25.{domain}&amp;output=json&quot;
    resp = requests.get(url)
    if resp.status_code == 200:
        data = resp.json()
        # вычисляем хэш от всего содержимого (как дешёвый способ детектировать изменения)
        content_str = json.dumps(data)
        new_hash = hashlib.sha256(content_str.encode()).hexdigest()
        if new_hash != last_hash:
            print(f&quot;Обнаружены новые сертификаты для {domain}&quot;)
            # здесь можно отправить уведомление
            with open(last_check_file, &#x27;w&#x27;) as f:
                f.write(new_hash)
        else:
            print(&quot;Нет изменений&quot;)</pre>
  <p id="BmG5"></p>
  <ul id="dbAC">
    <li id="IQSg">Данные CT-логов публичны. Их сбор полностью легален.</li>
    <li id="REYp">Не пытайтесь получить информацию о сертификатах, используя уязвимости (это не требуется — всё открыто).</li>
    <li id="TWXy">Даже если вы нашли внутренний поддомен, не пытайтесь взломать его без разрешения владельца. Используйте информацию только для защиты или информирования организации.</li>
  </ul>
  <p id="vLOC">Анализ SSL/TLS сертификатов через CT-логи — один из самых мощных методов пассивного технического OSINT. Позволяет обнаруживать поддомены, которые не видны в DNS, включая тестовые, внутренние и исторические хосты. Основные инструменты — crt.sh, CertSpotter, Censys. Комбинация извлечения доменов из сертификатов, проверки DNS-резолвинга и дальнейшего сканирования (Shodan) позволяет выявить скрытую инфраструктуру организации.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Port-scanning</guid><link>https://teletype.in/@specialist_infosec/Port-scanning?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Port-scanning?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Сканирование портов и сервисов: Nmap, массовое сканирование, интерпретация результатов</title><pubDate>Tue, 09 Jun 2026 06:21:10 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/59/67/59674a41-00e9-4b28-a6ee-980d3dafed76.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/31/e5/31e5064f-72e2-4a28-934e-d5a4451de774.png"></img>Сканирование портов — это процесс проверки сетевых портов на целевой системе для определения, какие сетевые службы (веб-сервер, SSH, FTP, база данных и т.д.) запущены и доступны. Это один из самых информативных, но и наиболее «активных» методов технического OSINT. В отличие от пассивной разведки (DNS, WHOIS, сертификаты), сканирование портов напрямую взаимодействует с целью, оставляя следы в логах. Поэтому критически важно различать легальное сканирование (с разрешения владельца, в рамках пентеста или исследования собственной инфраструктуры) и несанкционированное (противозаконное).]]></description><content:encoded><![CDATA[
  <figure id="GHqY" class="m_column">
    <img src="https://img4.teletype.in/files/31/e5/31e5064f-72e2-4a28-934e-d5a4451de774.png" width="2199" />
  </figure>
  <h3 id="j5Ff">Сканирование портов и сервисов: Nmap, массовое сканирование, интерпретация результатов</h3>
  <p id="bdvN">Сканирование портов — это процесс проверки сетевых портов на целевой системе для определения, какие сетевые службы (веб-сервер, SSH, FTP, база данных и т.д.) запущены и доступны. Это один из самых информативных, но и наиболее «активных» методов технического OSINT. В отличие от пассивной разведки (DNS, WHOIS, сертификаты), сканирование портов напрямую взаимодействует с целью, оставляя следы в логах. Поэтому критически важно различать легальное сканирование (с разрешения владельца, в рамках пентеста или исследования собственной инфраструктуры) и несанкционированное (противозаконное).</p>
  <p id="d1ns">Данная статья описывает методы и инструменты сканирования портов, а также способы получения аналогичной информации <strong>пассивно</strong> через публичные базы (Shodan, Censys). Акцент будет сделан на интерпретации результатов и на том, как использовать эти данные для составления картины инфраструктуры.</p>
  <p id="CX2A"><strong>Активное vs пассивное сканирование</strong></p>
  <figure id="xTTO" class="m_column">
    <img src="https://img2.teletype.in/files/d8/b9/d8b9827b-2dc4-44ad-aa80-039d095c3f80.png" width="946" />
  </figure>
  <p id="Um4R">для разведки без риска сначала используйте Shodan/Censys. Только при наличии письменного разрешения (или на собственной инфраструктуре) переходите к активному Nmap.</p>
  <p id="GN2P"><strong>Этап 1: Пассивное сканирование через Shodan</strong></p>
  <p id="6O4E">Shodan — поисковая система по интернет-подключенным устройствам. Она постоянно сканирует весь интернет по многим портам (80, 443, 22, 21, 25, 3389, 3306, 5900 и т.д.) и сохраняет баннеры (ответы сервисов). Вы можете искать по IP, домену, организации, порту, географической локации и многим другим фильтрам.</p>
  <p id="uacP"><strong>Поиск по IP в Shodan:</strong></p>
  <pre id="QuhO">https://www.shodan.io/host/8.8.8.8</pre>
  <p id="DsbB"><strong>Что покажет Shodan:</strong></p>
  <ul id="B6kL">
    <li id="CdGD">Открытые порты (с номером и названием службы).</li>
    <li id="Kdzc">Баннер (HTTP заголовки, версия SSH, сообщение FTP).</li>
    <li id="X8iN">Страна, город, ASN, организация.</li>
    <li id="O36e">История изменений (даты сканирований, если подписка).</li>
  </ul>
  <p id="9Lpd"><strong>Пример фильтрации:</strong></p>
  <pre id="1xQi">hostname:example.com                     # все IP, связанные с example.com
port:443 org:&quot;Google&quot;                    # порт 443 у организаций, содержащих Google
ssl.cert.subject.CN:&quot;*.example.com&quot;      # сертификаты</pre>
  <p id="oAK9"><strong>Shodan API (Python):</strong></p>
  <pre id="yCDn">import shodan

api = shodan.Shodan(&#x27;YOUR_API_KEY&#x27;)
host = api.host(&#x27;8.8.8.8&#x27;)
for item in host[&#x27;data&#x27;]:
    print(f&quot;Port {item[&#x27;port&#x27;]}: {item.get(&#x27;banner&#x27;, &#x27;&#x27;)[:100]}&quot;)</pre>
  <p id="pdoE"><strong>Censys</strong> — альтернатива Shodan, с фокусом на сертификаты и глубокую информацию о портах. Интерфейс сложнее, но часто даёт больше данных.</p>
  <p id="2uAt"><strong>Этап 2: Активное сканирование с Nmap (с разрешения!)</strong></p>
  <p id="XYxg">Nmap (Network Mapper) — стандарт де-факто для активного сканирования портов. Он поддерживает десятки техник сканирования (TCP SYN, TCP connect, UDP, NULL, FIN и т.д.), определение служб, версий, ОС и скриптовые проверки.</p>
  <p id="IjXF"><strong>Основные типы сканов:</strong></p>
  <figure id="Xt3l" class="m_column">
    <img src="https://img3.teletype.in/files/6b/ed/6bed2897-f173-4caf-9fd3-a8da8f3c3c0e.png" width="941" />
  </figure>
  <p id="6EGn"><strong>Базовые команды Nmap:</strong></p>
  <pre id="i8SN"># Сканирование топ-1000 портов TCP
nmap example.com

# Сканирование определённого диапазона портов
nmap -p 22,80,443,8080 example.com

# Сканирование всех портов (медленно!)
nmap -p- example.com

# Определение версий служб (баннеры)
nmap -sV example.com

# Использование скриптового движка (безопасные скрипты)
nmap -sC example.com

# Сохранение результатов в файл
nmap -oA scan_results example.com</pre>
  <p id="z8yR"><strong>Пример сканирования с определением служб и скриптов:</strong></p>
  <pre id="JEzq">nmap -sV -sC -p- --min-rate 1000 -T4 example.com</pre>
  <p id="t58H"><em>Примечание:</em> <code>--min-rate 1000</code> и <code>-T4</code> ускоряют сканирование, но могут вызвать срабатывание IDS. Для легальных тестов это допустимо, для разведки — нежелательно.</p>
  <p id="J2Xs"><strong>Продвинутые техники Nmap:</strong></p>
  <ul id="ZVWQ">
    <li id="8zTu"><strong>Сканирование подсети:</strong> <code>nmap 192.0.2.0/24</code></li>
    <li id="ZWi6"><strong>Сканирование из файла со списком IP:</strong> <code>nmap -iL hosts.txt</code></li>
    <li id="UO8Z"><strong>Использование специальных профайлов для времени</strong> (для скрытности): <code>-T0</code> (очень медленно) или <code>-T1</code> (параноидальный).</li>
  </ul>
  <p id="zKnh"><strong>Этап 3: Массовое сканирование (masscan, Zmap)</strong></p>
  <p id="Kp4p">Для сканирования больших диапазонов IP (например, всей сети /16) используют массовые сканеры. Они не определяют версии служб, а только проверяют, открыт ли порт.</p>
  <figure id="UBEB" class="m_column">
    <img src="https://img4.teletype.in/files/3c/59/3c59038c-395d-4fc5-97aa-4b661c4e59ce.png" width="947" />
  </figure>
  <p id="97BT"><strong>Пример masscan:</strong></p>
  <pre id="XBmp">masscan 192.0.2.0/24 -p80,443,22 --rate=10000</pre>
  <p id="4aHO">массовое сканирование легко обнаруживается и может быть расценено как атака.</p>
  <p id="5URe"><strong>Этап 4: Интерпретация результатов сканирования</strong></p>
  <p id="43bT">Результат сканирования (например, из Nmap или Shodan) — это перечень портов и служб. Что делать дальше?</p>
  <p id="0yYw"><strong>Таблица портов и типовых служб:</strong></p>
  <figure id="sS5h" class="m_original">
    <img src="https://img1.teletype.in/files/cd/45/cd450bc6-9c11-4031-b3ab-b87c6de70086.png" width="706" />
  </figure>
  <p id="B5wc"><strong>Особые случаи:</strong></p>
  <ul id="ufBT">
    <li id="mGcV"><strong>Порт 8080, 8443, 8000</strong> — часто альтернативные веб-порты (панели администрирования, прокси).</li>
    <li id="rOQd"><strong>Порты с нестандартными службами</strong> (например, SSH на 2222) — попытка скрыть сервис.</li>
    <li id="pEmQ"><strong>Большое количество открытых портов</strong> может указывать на отсутствие файрвола или наличие docker-контейнеров.</li>
  </ul>
  <p id="xe1w"><strong>Этап 5: Анализ баннеров</strong></p>
  <p id="HtCw">Баннер — это текстовая строка, которую сервер отправляет при подключении (например, HTTP заголовок <code>Server: nginx/1.18.0</code>). Из баннера можно узнать версию ПО, что важно для оценки уязвимостей.</p>
  <p id="Pefm"><strong>Примеры:</strong></p>
  <ul id="jLtx">
    <li id="TdkS"><code>SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5</code> → уязвимости OpenSSH 8.2.</li>
    <li id="ErvN"><code>220 ProFTPD 1.3.5 Server</code> → старая версия ProFTPD (много уязвимостей).</li>
    <li id="AMIi"><code>HTTP/1.1 200 OK</code> → баннер неинформативен (скрыт).</li>
  </ul>
  <p id="NN83"><strong>Инструменты для анализа баннеров:</strong></p>
  <ul id="4nHf">
    <li id="mKtk"><strong>WhatWeb</strong> — определяет CMS, технологии по HTTP баннерам.</li>
    <li id="bu3N"><strong>Wappalyzer</strong> (расширение для браузера) — удобно для быстрого анализа веб-сайтов.</li>
    <li id="RjKg"><strong>Httpx</strong> (от ProjectDiscovery) — быстрый HTTP-клиент для массового извлечения баннеров.</li>
  </ul>
  <p id="aBGu"><strong>Этап 6: Скриптовые проверки (NSE)</strong></p>
  <p id="XTkS">Скриптовый движок Nmap содержит сотни скриптов для обнаружения уязвимостей, брутфорса, сбора информации.</p>
  <p id="9uL3"><strong>Категории скриптов:</strong></p>
  <ul id="2DIl">
    <li id="SFFs"><code>safe</code> — не опасные, не нарушающие работу сервиса.</li>
    <li id="wAD3"><code>intrusive</code> — могут вызвать сбои или оставить следы.</li>
    <li id="54aH"><code>vuln</code> — проверяют на известные уязвимости.</li>
    <li id="UdJL"><code>brute</code> — подбор паролей.</li>
  </ul>
  <p id="KK7U"><strong>Пример безопасного скрипта:</strong></p>
  <pre id="YF1W">nmap --script=http-title,http-headers,ssl-cert -p 443 example.com</pre>
  <p id="Xtew"><strong>Этап 7: Мониторинг изменений портов</strong></p>
  <p id="0V91">Инфраструктура меняется: открываются новые порты, закрываются старые. Важно отслеживать эти изменения.</p>
  <p id="R9OE"><strong>Методы:</strong></p>
  <ul id="KU8d">
    <li id="BP49">Периодическое сканирование с сохранением результатов в файл.</li>
    <li id="yAWj">Использование Shodan (есть история сканирований, но не для всех портов).</li>
    <li id="k1tT">Censys — предоставляет снимки на разные даты.</li>
  </ul>
  <p id="URm9"><strong>Автоматизация сбора данных через Shodan API:</strong></p>
  <pre id="0adD">import shodan
import time

api = shodan.Shodan(&#x27;YOUR_API_KEY&#x27;)
domains = [&#x27;example.com&#x27;, &#x27;target.org&#x27;]
for domain in domains:
    try:
        results = api.search(f&#x27;hostname:{domain}&#x27;)
        for result in results[&#x27;matches&#x27;]:
            print(f&quot;{domain}: {result[&#x27;ip_str&#x27;]} port {result[&#x27;port&#x27;]} - {result.get(&#x27;data&#x27;,&#x27;&#x27;)[:80]}&quot;)
        time.sleep(1)  # не превышать rate limit
    except Exception as e:
        print(e)</pre>
  <p id="lYEF"><strong>Этап 8: Обнаружение ложных срабатываний</strong></p>
  <ul id="iA6E">
    <li id="EU4T">Некоторые порты могут быть открыты, но фильтроваться файрволом (Nmap покажет <code>filtered</code> или <code>closed</code>).</li>
    <li id="A1xp">Порты, отображаемые как открытые в Shodan, могут быть уже закрыты (данные устарели).</li>
    <li id="x6Ku">Облачные провайдеры часто перенаправляют трафик через глобальные балансировщики (порты могут быть открыты на всех IP одновременно).</li>
  </ul>
  <p id="mrAG"><strong>Практический пример: анализ инфраструктуры по портам</strong></p>
  <p id="RjYE"><em>Задача:</em> проанализировать открытые порты домена <code>target.org</code>.</p>
  <ol id="t5wS">
    <li id="eZBj"><strong>Shodan:</strong> по IP <code>203.0.113.20</code> найдены порты 80, 443, 22, 8080.</li>
    <ul id="dHz4">
      <li id="efWg"><code>80</code> → HTTP (nginx/1.18.0).</li>
      <li id="Aihq"><code>443</code> → HTTPS, сертификат для <code>target.org</code>.</li>
      <li id="I8rX"><code>22</code> → SSH, баннер <code>OpenSSH 8.2</code>.</li>
      <li id="kmxL"><code>8080</code> → панель управления <code>Jenkins</code>.</li>
    </ul>
    <li id="Y4hB"><strong>Nmap (с разрешения):</strong></li>
    <ul id="W3jE">
      <li id="bx3Z"><code>nmap -sV -p 22,80,443,8080 -sC target.org</code></li>
      <li id="WwKF">На порту 8080 Jenkins версия 2.277 (уязвимая, возможно CVE-2024-23897).</li>
      <li id="nZHv">На порту 22 слабые алгоритмы шифрования (можно попробовать брутфорс).</li>
    </ul>
    <li id="BEcS"><strong>Анализ:</strong> Jenkins доступен из интернета (потенциальная уязвимость). SSH устаревший. Веб-сервер требует проверки на веб-уязвимости.</li>
    <li id="EQXW"><strong>Рекомендация:</strong> закрыть порт 8080 для внешнего доступа, обновить SSH.</li>
  </ol>
  <p id="62Ij"></p>
  <ul id="DETu">
    <li id="i7n6"><strong>Никогда не сканируйте чужие системы без письменного разрешения.</strong> Даже SYN-сканирование может быть расценено как попытка взлома.</li>
    <li id="6xo7">Для обучения используйте собственные VPS, локальные виртуальные машины, или специальные площадки (HackTheBox, TryHackMe).</li>
    <li id="mntn">Если вам нужны данные о публичных системах для исследования — используйте Shodan, Censys, BinaryEdge.</li>
    <li id="kLmn">В некоторых странах несанкционированное сканирование портов является уголовным преступлением.</li>
  </ul>
  <p id="7XAK">Сканирование портов и служб — мощный метод технического OSINT, но он должен применяться с осторожностью и только на законных основаниях. Пассивные источники (Shodan, Censys) дают почти ту же информацию без риска. Активное сканирование (Nmap) — для глубокого анализа по разрешению. Интерпретация результатов требует знаний о типовых портах, службах и уязвимостях. В связке с поддоменами и DNS это позволяет картировать внешнюю поверхность атаки.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Analysis-of-IP-addresses-and-ASN</guid><link>https://teletype.in/@specialist_infosec/Analysis-of-IP-addresses-and-ASN?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Analysis-of-IP-addresses-and-ASN?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Анализ IP-адресов и ASN: геолокация, владельцы, соседние сети, BGP</title><pubDate>Mon, 08 Jun 2026 18:50:10 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/3a/b2/3ab221b9-7bc9-437a-a09d-bd62099e79cb.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/39/c0/39c06254-4baa-482f-a929-94ade4f02a39.png"></img>IP-адреса — это «координаты» устройств в интернете. Зная IP-адрес сервера цели, можно определить его географическое положение, узнать, какому интернет-провайдеру или хостинговой компании он принадлежит, выявить другие сайты, находящиеся на том же сервере, и даже восстановить структуру сетевой инфраструктуры организации через BGP-маршрутизацию. Анализ IP и ASN (автономных систем) — важнейший этап технического OSINT, позволяющий перейти от доменных имен к физическим сетям и их владельцам.]]></description><content:encoded><![CDATA[
  <figure id="WI5D" class="m_retina">
    <img src="https://img4.teletype.in/files/39/c0/39c06254-4baa-482f-a929-94ade4f02a39.png" width="1099" />
  </figure>
  <h3 id="H9wm">Анализ IP-адресов и ASN: геолокация, владельцы, соседние сети, BGP</h3>
  <p id="joxl">IP-адреса — это «координаты» устройств в интернете. Зная IP-адрес сервера цели, можно определить его географическое положение, узнать, какому интернет-провайдеру или хостинговой компании он принадлежит, выявить другие сайты, находящиеся на том же сервере, и даже восстановить структуру сетевой инфраструктуры организации через BGP-маршрутизацию. Анализ IP и ASN (автономных систем) — важнейший этап технического OSINT, позволяющий перейти от доменных имен к физическим сетям и их владельцам.</p>
  <p id="xjvx"><strong>Что такое ASN и зачем он нужен?</strong></p>
  <p id="0Ujf">ASN (Autonomous System Number) — это уникальный номер, присваиваемый автономной системе (Autonomous System, AS). Автономная система — это совокупность IP-сетей (подсетей) под единым административным управлением (например, Ростелеком, МГТС, Amazon AWS, Google). Организации, имеющие собственные IP-диапазоны и публично объявляющие о них через BGP, получают ASN.</p>
  <p id="nuXd"><strong>Ценность ASN для технического OSINT:</strong></p>
  <ul id="TAgB">
    <li id="O6NE">Зная ASN цели, можно получить все IP-диапазоны, которые принадлежат организации (полная картина её «цифровой земли»).</li>
    <li id="i1CA">Можно обнаружить соседние подсети (соседние AS) — потенциальных партнёров или транзитных провайдеров.</li>
    <li id="DpT7">Выявить изменения (появление новых подсетей, выбытие старых) через мониторинг BGP.</li>
  </ul>
  <p id="QIiK"><strong>Этап 1: Базовый анализ IP-адреса</strong></p>
  <p id="7XNU">Самый простой способ начать анализ IP — использовать онлайн-сервисы или утилиты командной строки.</p>
  <p id="gZPK"><strong>Что можно узнать по IP:</strong></p>
  <ul id="9QNW">
    <li id="RgFM"><strong>Геолокация</strong> (страна, регион, город, иногда координаты) — не всегда точная, основывается на базах данных организаций.</li>
    <li id="gvMR"><strong>Провайдер / хостинг-компания</strong> (название, контакты).</li>
    <li id="bxjT"><strong>ASN</strong> (номер автономной системы, которой принадлежит IP).</li>
    <li id="hCCQ"><strong>Тип IP</strong> (провайдерский, хостинговый, прокси, VPN, Tor exit node).</li>
    <li id="VeNb"><strong>История IP</strong> (к каким доменам привязывался ранее).</li>
  </ul>
  <p id="7diq"><strong>Инструменты быстрого анализа IP:</strong></p>
  <figure id="cbMo" class="m_column">
    <img src="https://img1.teletype.in/files/4a/ca/4aca1140-6a61-4fff-9f48-5bdee65b4792.png" width="1212" />
  </figure>
  <p id="Oohd"><strong>Команды:</strong></p>
  <pre id="lNtb"># whois по IP
whois 8.8.8.8

# curl к ipinfo.io
curl ipinfo.io/8.8.8.8
curl ipinfo.io/8.8.8.8/json

# dig для обратного DNS (PTR)
dig -x 8.8.8.8 +short</pre>
  <p id="X2CV"><strong>Пример ответа <a href="https://ipinfo.io/" target="_blank">ipinfo.io</a>:</strong></p>
  <pre id="gWtO">{
  &quot;ip&quot;: &quot;8.8.8.8&quot;,
  &quot;hostname&quot;: &quot;dns.google&quot;,
  &quot;city&quot;: &quot;Mountain View&quot;,
  &quot;region&quot;: &quot;California&quot;,
  &quot;country&quot;: &quot;US&quot;,
  &quot;loc&quot;: &quot;37.4056,-122.0775&quot;,
  &quot;org&quot;: &quot;AS15169 Google LLC&quot;,
  &quot;postal&quot;: &quot;94043&quot;,
  &quot;timezone&quot;: &quot;America/Los_Angeles&quot;
}</pre>
  <p id="sJ23"><strong>Этап 2: ASN и BGP — что скрывается за номером AS?</strong></p>
  <p id="g76k">Каждый IP принадлежит какой-то автономной системе (AS). Узнав ASN, можно запросить BGP-информацию: какие IP-диапазоны анонсирует эта AS (то есть какие адреса принадлежат организации), а также с кем эта AS граничит (пировые связи, транзитные провайдеры).</p>
  <p id="p5WT"><strong>Инструменты для получения ASN по IP:</strong></p>
  <figure id="m5lY" class="m_column">
    <img src="https://img4.teletype.in/files/f3/81/f381f91c-8b90-4b1a-8554-95753f30e727.png" width="1227" />
  </figure>
  <p id="sMsH"><strong>Пример через Team Cymru:</strong></p>
  <pre id="hat7">dig +short 8.8.8.8.origin.asn.cymru.com TXT
# результат: &quot;15169 | 8.8.8.0/24 | US | arin | 1992-12-01&quot;</pre>
  <p id="Y7VE"><strong>Этап 3: Получение всех IP-диапазонов AS</strong></p>
  <p id="jhTC">Зная ASN, можно скачать все подсети (CIDR-блоки), которые эта AS объявляет в BGP. Это даст полную картину всех IP-адресов, находящихся под контролем организации (включая те, что не связаны напрямую с доменом).</p>
  <p id="6rjA"><strong>Где взять данные:</strong></p>
  <ul id="JR6x">
    <li id="FywI"><strong><a href="https://bgp.he.net/" target="_blank">BGP.he.net</a></strong> — по ASN отображает список подсетей.</li>
    <li id="3MfU"><strong>RIPE Stat</strong> — API для получения маршрутов AS.</li>
    <li id="5AFS"><strong>CAIDA</strong> — архив BGP.</li>
    <li id="MuXb"><strong>Radb</strong> (<a href="https://whois.radb.net/" target="_blank">whois.radb.net</a>) — база маршрутов.</li>
  </ul>
  <p id="rz9a"><strong>Пример через <a href="https://whois.radb.net/" target="_blank">whois.radb.net</a>:</strong></p>
  <pre id="6KVn">whois -h whois.radb.net -- &#x27;-i origin AS15169&#x27; | grep -Eo &#x27;([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]+&#x27;</pre>
  <p id="Dca0"><strong><a href="https://bgp.he.net/" target="_blank">BGP.he.net</a> API (пример):</strong></p>
  <pre id="pdU4">curl https://bgp.he.net/AS15169
# нужно парсить HTML, есть неофициальное API</pre>
  <p id="hT5m"><strong>Python-функция (через Team Cymru):</strong></p>
  <pre id="dFGo">import requests

def get_ip_routes_by_asn(asn):
    url = f&quot;https://api.cymon.io/bgp/routes/origin/{asn}&quot;
    # можно использовать альтернативные сервисы
    # более простой: whois -h whois.radb.net -- &#x27;-i origin AS15169&#x27;</pre>
  <p id="7oG5"><strong>Этап 4: Поиск соседних доменов на том же IP (Reverse IP Lookup)</strong></p>
  <p id="PEJQ">Один IP-адрес может хостить множество доменов (shared hosting, виртуальные серверы). Если цель использует невыделенный IP, то можно найти другие домены, связанные с той же инфраструктурой.</p>
  <p id="Mm7J"><strong>Инструменты Reverse IP:</strong></p>
  <figure id="l9jZ" class="m_column">
    <img src="https://img1.teletype.in/files/0b/dd/0bdd4606-700c-4b7d-8ab3-d136997c8bc0.png" width="1209" />
  </figure>
  <p id="vyPa"><strong>SecurityTrails API пример:</strong></p>
  <pre id="2UeW">curl -H &quot;APIKEY: YOUR_KEY&quot; https://api.securitytraits.com/v1/domain/8.8.8.8/domain</pre>
  <p id="YvWb"><strong>Ограничения:</strong> на shared-хостинге могут быть тысячи доменов, большинство не связано с целью. Используйте фильтрацию (похожие тематики, SSL-сертификаты, даты создания).</p>
  <p id="ooP9"><strong>Этап 5: Анализ BGP-пиров (соседних AS)</strong></p>
  <p id="zIiX">Смотря на BGP-таблицы, можно увидеть, между какими AS существует прямое сетевое соединение (пиринг). Это может указывать на деловые отношения, транзитный трафик или использование CDN.</p>
  <p id="lvU9"><strong>Инструменты:</strong></p>
  <ul id="Qqvo">
    <li id="KwKO"><strong><a href="https://bgp.he.net/" target="_blank">BGP.he.net</a></strong> → страница AS, раздел “Peers” (соседние AS).</li>
    <li id="0CGj"><strong>BGPView</strong> → альтернативный визуализатор.</li>
    <li id="Jq6d"><strong>CAIDA AS Rank</strong> — ранжирование AS по количеству пиров.</li>
  </ul>
  <p id="jrdp"><strong>Анализ пиров:</strong></p>
  <ul id="nqJR">
    <li id="BLQ5">Если AS цели пирится с крупным облачным провайдером (AWS, Google Cloud), часть инфраструктуры может быть там.</li>
    <li id="9Hub">Если пирится с AS, принадлежащим провайдеру DDoS-защиты (Cloudflare, Akamai), то сайт использует их услуги.</li>
  </ul>
  <p id="5JRy"><strong>Этап 6: Геолокация IP — методы и ограничения</strong></p>
  <p id="VEor">Геолокация по IP основана на базах данных (MaxMind, IP2Location), которые не всегда точны (особенно для мобильных сетей, VPN, облаков). Следует относиться к ней как к ориентиру, а не к истине.</p>
  <p id="fdis"><strong>Как повысить точность:</strong></p>
  <ul id="DuHz">
    <li id="fgZ5">Сравнить несколько баз: <a href="https://ipinfo.io/" target="_blank">ipinfo.io</a>, MaxMind, IP2Location.</li>
    <li id="90SY">Использовать обратный DNS (PTR) — иногда содержит географические указатели (например, <code>hosting-in-moscow.example.com</code>).</li>
    <li id="qsLE">Проверить сертификаты (в них может быть указан юридический адрес).</li>
    <li id="jZLD">Запросить BGP-локацию (определённые AS имеют географическую привязку, но не точную).</li>
  </ul>
  <p id="1SON"><strong>Инструменты для сравнения геолокации:</strong></p>
  <ul id="AsJJ">
    <li id="8e5N"><strong>IP2Location</strong> (разные версии).</li>
    <li id="2ccL"><strong>DB-IP</strong>.</li>
    <li id="m4iX"><strong>GeoIP Tool</strong> (<a href="https://geoiptool.com/" target="_blank">geoiptool.com</a>).</li>
  </ul>
  <p id="DkIy"><strong>Этап 7: История IP (предыдущие домены, предыдущие владельцы)</strong></p>
  <p id="8qbd">IP-адреса переходят от одного сервера к другому, меняются владельцы блоков. История IP позволяет найти, какие домены ранее были привязаны к этому адресу, и восстановить старые конфигурации.</p>
  <p id="saCx"><strong>Источники истории IP:</strong></p>
  <ul id="bLPI">
    <li id="5kcZ"><strong>SecurityTrails Historical IP</strong> (показывает домены, привязанные к IP в прошлом).</li>
    <li id="WwDl"><strong><a href="https://viewdns.info/" target="_blank">ViewDNS.info</a> IP History</strong> (ограничен).</li>
    <li id="XKhA"><strong>Censys</strong> — сохраняет снимки IP-сканирований (порты, сертификаты) за разные даты.</li>
    <li id="c2CC"><strong>Wayback Machine</strong> для страниц, доступных по IP.</li>
  </ul>
  <p id="3iTI"><strong>Этап 8: Выявление cloud-сервисов и CDN</strong></p>
  <p id="6ayH">Многие IP-адреса принадлежат облачным платформам. Идентификация облачного провайдера может помочь сузить географию или определить используемые сервисы.</p>
  <p id="i434"><strong>Как определить облачный IP:</strong></p>
  <ul id="WgE4">
    <li id="DMBx"><code>whois</code> покажет организацию (например, &quot;AWS&quot;, &quot;Microsoft Corporation&quot;, &quot;Google Cloud&quot;).</li>
    <li id="vy36">Сравнить ASN со списками облачных AS (например, AS15169 — Google, AS14618 — AWS, AS8075 — Microsoft).</li>
    <li id="3Q8m">Специальные списки: (например, <code>https://raw.githubusercontent.com/cloudflare/ip-list/master/cloudflare.ipv4</code> для Cloudflare).</li>
  </ul>
  <p id="AUrQ"><strong>Практический пример: анализ инфраструктуры домена</strong></p>
  <p id="zi0n"><em>Задача:</em> проанализировать IP-адреса домена <code>target.com</code>.</p>
  <ol id="B0D2">
    <li id="xH8B"><strong>DNS-запрос A</strong> → <code>target.com</code> -&gt; <code>192.0.2.10</code>.</li>
    <li id="dBrC"><strong>whois 192.0.2.10</strong> → организация <code>Example Hosting Ltd.</code>, страна <code>US</code>.</li>
    <li id="YbMO"><strong><a href="https://ipinfo.io/" target="_blank">ipinfo.io</a></strong> → <code>&quot;org&quot;: &quot;AS65535 Example Hosting&quot;, &quot;city&quot;: &quot;New York&quot;</code>.</li>
    <li id="jNOH"><strong>Reverse IP (SecurityTrails)</strong> → на том же IP еще 50 доменов, в основном мелкие сайты. Shared-хостинг.</li>
    <li id="bIhK"><strong>ASN</strong> → <code>AS65535</code>. Через <a href="https://bgp.he.net/" target="_blank">BGP.he.net</a> получаем все подсети этой AS: <code>192.0.2.0/24</code>, <code>198.51.100.0/24</code>, ...</li>
    <li id="M1zI"><strong>Поиск других IP в этих подсетях</strong>, которые могут принадлежать цели.</li>
    <li id="3Q9W"><strong>BGP-пиры</strong> → ASN цели соединен с AS15169 (Google). Возможно, сайт использует Google Cloud CDN.</li>
    <li id="XvRw"><strong>История IP</strong> → 2 года назад IP был <code>203.0.113.55</code>, который принадлежал другой AS (предыдущий хостинг).</li>
    <li id="rmtr"><strong>Вывод</strong>: цель использует shared-хостинг у Example Hosting; старый сервер больше не активен; через Google Cloud, вероятно, используется кэширование.</li>
  </ol>
  <p id="zqmN"><strong>Автоматизация сбора данных по IP и ASN (Python)</strong></p>
  <pre id="4XDT">import requests
import ipaddress

def ip_info(ip):
    resp = requests.get(f&quot;https://ipinfo.io/{ip}/json&quot;)
    return resp.json() if resp.status_code == 200 else None

def get_asn(ip):
    info = ip_info(ip)
    org = info.get(&quot;org&quot;, &quot;&quot;)
    if org.startswith(&quot;AS&quot;):
        asn = org.split()[0][2:]  # &quot;AS15169&quot; -&gt; &quot;15169&quot;
        return asn
    return None

def get_prefixes_by_asn(asn):
    # через whois.radb.net (упрощённо)
    import subprocess
    cmd = f&quot;whois -h whois.radb.net -- &#x27;-i origin AS{asn}&#x27; | grep -Eo &#x27;([0-9]+\\.){3}[0-9]+/[0-9]+&#x27;&quot;
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
    return result.stdout.splitlines()

# Пример
ip = &quot;8.8.8.8&quot;
print(ip_info(ip))
asn = get_asn(ip)
print(f&quot;ASN: {asn}&quot;)
prefixes = get_prefixes_by_asn(asn)
print(f&quot;Prefixes: {prefixes[:5]}...&quot;)</pre>
  <p id="xXoB"></p>
  <ul id="jnLC">
    <li id="oOTu">WHOIS по IP, DNS-запросы, BGP-данные — это публичные данные. Их сбор безопасен и легален.</li>
    <li id="2f8J">Массовый reverse DNS или перебор IP-диапазонов без разрешения может считаться активным сканированием, если выполняется в больших объёмах. Используйте осторожно и с уважением к чужой инфраструктуре.</li>
    <li id="j0TX">Сервисы типа SecurityTrails имеют условия использования, запрещающие массовые автоматические запросы без оплаты.</li>
  </ul>
  <p id="AkYr"></p>
  <p id="qz5g">Анализ IP и ASN позволяет преобразовать сетевую инфраструктуру организации в карту подсетей, обнаружить скрытые активы и соседние ресурсы, определить географическое расположение и используемые облачные провайдеры. Ключевые инструменты: whois, <a href="https://ipinfo.io/" target="_blank">ipinfo.io</a>, <a href="https://bgp.he.net/" target="_blank">BGP.he.net</a>, SecurityTrails. В сочетании с данными о поддоменах и DNS это даёт практически полную картину внешней поверхности атаки.</p>
  <p id="bQaD">В следующей статье цикла мы рассмотрим <strong>сканирование портов и сервисов</strong> — активный этап, который требует особой осторожности, а также освоим инструменты Nmap, массовое сканирование и Shodan.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Subdomain-Search</guid><link>https://teletype.in/@specialist_infosec/Subdomain-Search?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Subdomain-Search?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Поиск поддоменов: инструменты и методы</title><pubDate>Sun, 07 Jun 2026 18:09:02 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/4f/a9/4fa9c58d-2df8-4bfc-b98b-885190b4190f.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/c5/b3/c5b36f43-a8a7-41b0-a8af-3804519a4def.png"></img>Поддомены — это «входные двери» в инфраструктуру организации. Часто основные сервисы располагаются на поддоменах типа www.example.com, mail.example.com, vpn.example.com, а забытые поддомены (test.example.com, dev.example.com) могут быть уязвимы или раскрывать внутреннюю структуру. Поиск поддоменов — ключевой этап технического OSINT, позволяющий обнаружить скрытые активы, не связанные напрямую с основным доменом. Данная статья посвящена методам и инструментам пассивного поиска поддоменов.]]></description><content:encoded><![CDATA[
  <figure id="DftG" class="m_retina">
    <img src="https://img1.teletype.in/files/c5/b3/c5b36f43-a8a7-41b0-a8af-3804519a4def.png" width="1099" />
  </figure>
  <h3 id="Tw21">Поиск поддоменов: инструменты и методы </h3>
  <p id="0hzP">Поддомены — это «входные двери» в инфраструктуру организации. Часто основные сервисы располагаются на поддоменах типа <code>www.example.com</code>, <code>mail.example.com</code>, <code>vpn.example.com</code>, а забытые поддомены (<code>test.example.com</code>, <code>dev.example.com</code>) могут быть уязвимы или раскрывать внутреннюю структуру. Поиск поддоменов — ключевой этап технического OSINT, позволяющий обнаружить скрытые активы, не связанные напрямую с основным доменом. Данная статья посвящена методам и инструментам пассивного поиска поддоменов.</p>
  <p id="NJ3o"><strong>Почему поддомены важны для разведки?</strong></p>
  <figure id="1Mdp" class="m_retina">
    <img src="https://img1.teletype.in/files/4f/74/4f74782c-d6fa-455a-8bb0-b1485eea9d1e.png" width="634" />
  </figure>
  <p id="eyMs"><strong>Классификация методов поиска поддоменов</strong></p>
  <figure id="5xFd" class="m_column">
    <img src="https://img4.teletype.in/files/f6/80/f68006f6-5840-4e79-8b7a-37ae5213c99f.png" width="1284" />
  </figure>
  <p id="8llH"><strong>Этап 1: Поиск через сертификаты (Certificate Transparency Logs)</strong></p>
  <p id="ESnA">Современные SSL/TLS сертификаты публикуются в публичные логи Certificate Transparency (CT). Каждый выданный сертификат (включая те, что для поддоменов) появляется в этих логах. Это наиболее надежный пассивный источник поддоменов.</p>
  <p id="2s6A"><strong>Инструменты CT-логов:</strong></p>
  <figure id="58Bj" class="m_column">
    <img src="https://img2.teletype.in/files/90/5a/905a83a6-ee0e-4bfd-9520-934afd55470c.png" width="1282" />
  </figure>
  <p id="WLge"><strong>Использование crt.sh:</strong></p>
  <ul id="3PdA">
    <li id="DvI1">Веб-интерфейс: <code>https://crt.sh/?q=%25.example.com</code> (где <code>%25</code> — это URL-кодированный символ <code>%</code>, означающий &quot;любые символы перед .<a href="https://example.com/" target="_blank">example.com</a>&quot;).</li>
    <li id="bbKj">API: <code>https://crt.sh/?q=.example.com&amp;output=json</code></li>
  </ul>
  <p id="xK3Z"><strong>Пример API-запроса (Python):</strong></p>
  <pre id="s0sj">import requests
import json

def get_subdomains_from_crt(domain):
    url = f&quot;https://crt.sh/?q=%25.{domain}&amp;output=json&quot;
    response = requests.get(url)
    if response.status_code == 200:
        data = response.json()
        subdomains = set()
        for entry in data:
            name = entry.get(&#x27;name_value&#x27;, &#x27;&#x27;)
            if name.endswith(f&#x27;.{domain}&#x27;) or name == domain:
                subdomains.add(name)
        return sorted(subdomains)
    else:
        return []

subs = get_subdomains_from_crt(&#x27;example.com&#x27;)
print(subs)</pre>
  <p id="jYXR">crt.sh возвращает много дублей, мёртвые сертификаты, включает домены, принадлежащие другим организациям (если сертификат содержит несколько имен). Требуется пост-обработка.</p>
  <p id="zbj2"><strong>Этап 2: Поиск через DNS-историю</strong></p>
  <p id="JpHZ">Исторические DNS-записи содержат поддомены, которые уже могли быть удалены, но все еще могут указывать на активные IP.</p>
  <p id="wlR4"><strong>Инструменты:</strong></p>
  <ul id="gSnc">
    <li id="6nWH"><strong>SecurityTrails</strong> — позволяет искать поддомены по домену и видеть историю.</li>
    <li id="GDQR"><strong>DNSdumpster</strong> — отображает все поддомены, найденные из разных источников.</li>
    <li id="dyF8"><strong><a href="https://viewdns.info/" target="_blank">ViewDNS.info</a> (Reverse IP lookup)</strong> — показывает домены на одном IP, что может косвенно выявить поддомены.</li>
  </ul>
  <p id="xdTw"><strong>SecurityTrails API (пример):</strong></p>
  <pre id="uR0e">curl -H &quot;APIKEY: YOUR_KEY&quot; https://api.securitytrails.com/v1/domain/example.com/subdomains</pre>
  <p id="2XyE"><strong>Этап 3: Активный DNS-брутфорс (словарный перебор)</strong></p>
  <p id="GxRT">Перебор возможных имен поддоменов с использованием словаря (или генерация на основе правил). Это активный метод, так как генерирует множество DNS-запросов к резолверам цели или к публичным DNS.</p>
  <p id="dR2C"><strong>Плюсы:</strong> находит поддомены, которые не попали в сертификаты или историю.<br /><strong>Минусы:</strong> шумный, может быть расценен как атака, требует хорошего словаря.</p>
  <p id="35xV"><strong>Инструменты брутфорса:</strong></p>
  <ul id="GqDr">
    <li id="pZjW"><strong>Sublist3r</strong> — комбинирует пассивные источники + брутфорс.</li>
    <li id="jTdP"><strong>Amass</strong> — мощный фреймворк (пассивный + активный).</li>
    <li id="KKy3"><strong>dnsrecon</strong> — включает брутфорс и AXFR.</li>
    <li id="cceC"><strong>dnsenum</strong> — классика.</li>
    <li id="i5bz"><strong>Gobuster</strong> с модулем dns.</li>
  </ul>
  <p id="k0Hj"><strong>Пример использования Sublist3r:</strong></p>
  <pre id="KpEG">sublist3r -d example.com -o subdomains.txt</pre>
  <pre id="O8UD">amass enum -passive -d example.com -o subdomains.txt</pre>
  <p id="itE1"><strong>Активный брутфорс с Amass:</strong></p>
  <pre id="ORgF">amass enum -active -d example.com -brute -w wordlist.txt</pre>
  <p id="WgUy"><strong>Словари для брутфорса:</strong></p>
  <ul id="eq86">
    <li id="ZYeo"><strong>SecLists/Discovery/DNS/<code>subdomains-top1million-5000.txt</code></strong> — популярный.</li>
    <li id="JFj2"><strong><code>commonspeak2-wordlists</code></strong>.</li>
    <li id="0N5d">Собственные списки, сформированные из известных поддоменов (например, www, mail, remote, vpn, dev, test, staging, api, admin, portal, blog, shop, support, ftp, ns1, mx1).</li>
  </ul>
  <p id="Rd7h"><strong>Этап 4: Поиск через поисковые системы</strong></p>
  <p id="Zr6E">Использование операторов поиска для нахождения страниц, индексированных на поддоменах.</p>
  <p id="XKnm"><strong>Google Search:</strong></p>
  <pre id="M3e5">site:*.example.com
site:example.com -www</pre>
  <p id="t9Cg"><strong>Bing / Yandex</strong> — аналогично.</p>
  <p id="fEXC"><strong>Особенности:</strong> находит только проиндексированные поисковиком поддомены; часто дает неполный результат.</p>
  <p id="NQI4"><strong>Этап 5: Поиск через ASN и IP-диапазоны</strong></p>
  <p id="Rqco">Если известен ASN (автономная система) цели или диапазон IP-адресов, можно выполнить обратный поиск PTR-записей для всех IP в диапазоне.</p>
  <p id="BtuV"><strong>Метод:</strong></p>
  <ol id="1kIB">
    <li id="PyVM">Определить ASN цели (через <code>whois</code> IP или <a href="https://bgp.he.net/" target="_blank">BGP.he.net</a>).</li>
    <li id="r8AI">Получить список IP-диапазонов этого ASN (из базы RIPE/ARIN).</li>
    <li id="SAcF">Выполнить массовый reverse DNS-запрос (но осторожно, чтобы не перегружать сеть). Инструменты: <code>dnsrecon -r</code>, <code>massdns</code>, собственные скрипты.</li>
  </ol>
  <p id="LB26"><strong>Пассивный вариант:</strong> использовать сервис Censys (ранее — Project Sonar), который публикует данные reverse DNS сканирований.</p>
  <p id="7odj"><strong>Этап 6: Поиск в репозиториях кода (GitHub, GitLab)</strong></p>
  <p id="gF3s">В коде, конфигурационных файлах, документации часто встречаются поддомены.</p>
  <p id="J0zR"><strong>GitHub поиск:</strong></p>
  <pre id="VRPg">*.example.com extension:conf
&quot;example.com&quot; path:config</pre>
  <p id="UNDN"><strong>Инструменты:</strong></p>
  <ul id="G170">
    <li id="GuNR"><strong>GitHub Code Search</strong> (веб).</li>
    <li id="oFUt"><strong>TruffleHog</strong> (поиск секретов, может найти и поддомены).</li>
    <li id="hMgc"><strong>GitRob</strong> / <strong>GitGrab</strong> — поиск по организациям.</li>
  </ul>
  <p id="iQ4A"><strong>Этап 7: Комплексные фреймворки для поддоменов</strong></p>
  <figure id="33og" class="m_column">
    <img src="https://img3.teletype.in/files/28/13/2813162f-7bdd-4c4a-aed9-a80cb0fc6c7e.png" width="1284" />
  </figure>
  <p id="4b1l">Для полного покрытия использовать комбинацию: <strong>Amass</strong> (пассивный режим) + <strong>Subfinder</strong> + <strong>crt.sh</strong> + <strong>SecurityTrails</strong> (если есть ключ).</p>
  <p id="IFyN"><strong>Этап 8: Обработка и фильтрация результатов</strong></p>
  <p id="3fkG">Список поддоменов обычно содержит:</p>
  <ul id="NyyA">
    <li id="LUUz">Дубликаты.</li>
    <li id="Cl7t">Поддомены, не относящиеся к цели (например, из общих сертификатов).</li>
    <li id="n81V">Некорректные записи (звездочки, wildcards).</li>
  </ul>
  <p id="ipqg"><strong>Фильтрация:</strong></p>
  <pre id="cO1Z">def clean_subdomains(raw_list, target_domain):
    cleaned = set()
    for sub in raw_list:
        sub = sub.strip().lower().rstrip(&#x27;.&#x27;)
        if sub.endswith(target_domain) and sub != target_domain:
            # Убрать wildcard (*)
            if sub.startswith(&#x27;*.&#x27;):
                sub = sub[2:]
            cleaned.add(sub)
    return sorted(cleaned)</pre>
  <p id="DLE3"><strong>Валидация:</strong> для каждого поддомена выполнить DNS-запрос (A или AAAA), чтобы убедиться, что он резолвится в IP.</p>
  <p id="4t72"><strong>Этап 9: Визуализация и анализ поддоменов</strong></p>
  <p id="WzgR">После сбора поддоменов полезно:</p>
  <ul id="mvmw">
    <li id="7wry">Сгруппировать их по IP-адресам (один IP — несколько поддоменов).</li>
    <li id="5Wti">Выявить общие подсети.</li>
    <li id="Khif">Обнаружить поддомены, указывающие на облачные сервисы (AWS, Azure, GCP).</li>
    <li id="pxAa">Построить граф связей.</li>
  </ul>
  <p id="XmUO"><strong>Инструменты визуализации:</strong></p>
  <ul id="ro1u">
    <li id="zWve"><strong>Aquatone</strong> — создает скриншоты поддоменов, отображает сгруппированные по IP.</li>
    <li id="PgVx"><strong>EyeWitness</strong> — аналогично.</li>
    <li id="nh9k"><strong>Gephi</strong> — для графа связей.</li>
  </ul>
  <p id="dQGc"><strong>Практический пример: поиск поддоменов <code>example.org</code></strong></p>
  <ol id="xxQb">
    <li id="UCEc"><strong>crt.sh</strong> → найдено 45 поддоменов, включая <code>admin.example.org</code>, <code>dev-api.example.org</code>, <code>test.example.org</code>.</li>
    <li id="pRYV"><strong>Subfinder</strong> → добавил <code>mail.example.org</code>, <code>remote.example.org</code>, <code>vpn.example.org</code>.</li>
    <li id="ENCA"><strong>Amass (пассивный)</strong> → нашел <code>grafana.internal.example.org</code>, <code>jenkins.example.org</code>.</li>
    <li id="kFTq"><strong>DNSdumpster</strong> → подтвердил большинство и добавил <code>ftp.example.org</code>.</li>
    <li id="IZF9"><strong>Проверка через DNS:</strong> <code>dev-api.example.org</code> разрешается в <code>203.0.113.89</code>, <code>jenkins.example.org</code> — в <code>198.51.100.22</code>.</li>
    <li id="jahU"><strong>Анализ IP:</strong> оба IP принадлежат одному хостинг-провайдеру, но разным подсетям. <code>jenkins.example.org</code> имеет открытый порт 8080 (Jenkins), что является потенциально критичным.</li>
    <li id="6EhF"><strong>Вывод:</strong> обнаружен Jenkins-сервер, доступный из интернета, который можно проверить на наличие уязвимостей.</li>
  </ol>
  <p id="nQ9h"><strong>Автоматизация сбора поддоменов (Python-скрипт-агрегатор)</strong></p>
  <pre id="ZCVY">import subprocess
import requests

def get_subdomains(domain):
    subs = set()
    # crt.sh
    url = f&quot;https://crt.sh/?q=%25.{domain}&amp;output=json&quot;
    resp = requests.get(url)
    if resp.status_code == 200:
        for entry in resp.json():
            name = entry.get(&#x27;name_value&#x27;, &#x27;&#x27;)
            if name.endswith(domain):
                subs.add(name)
    # Subfinder (запуск внешней команды)
    result = subprocess.run([&#x27;subfinder&#x27;, &#x27;-d&#x27;, domain, &#x27;-silent&#x27;], capture_output=True, text=True)
    for line in result.stdout.split():
        subs.add(line.strip())
    return sorted(subs)

domains = get_subdomains(&#x27;example.com&#x27;)
for d in domains:
    print(d)</pre>
  <p id="Ldzm"></p>
  <p id="dLSs"><strong>Пассивный поиск</strong> (crt.sh, SecurityTrails, DNS-история) легален и безопасен.</p>
  <p id="w6KD"><strong>Активный брутфорс</strong> может генерировать тысячи запросов к DNS-серверам цели, что может быть расценено как атака или нарушение условий хостинга. </p>
  <p id="t7ms">Использование публичных резолверов (8.8.8.8) для брутфорса предпочтительнее, чем запросы напрямую к NS цели, но все равно генерирует сетевой трафик.</p>
  <p id="zm5H">Поиск поддоменов — многоэтапный процесс, требующий комбинации пассивных источников (crt.sh, SecurityTrails, DNS-история) и аккуратного активного брутфорса. Самые мощные инструменты — Amass и Subfinder. Полученный список поддоменов необходимо очистить, провалидировать и проанализировать (выявить IP, открытые порты, технологии). Это позволит составить полную карту внешней инфраструктуры организации.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/6vXd2ZTrp7v</guid><link>https://teletype.in/@specialist_infosec/6vXd2ZTrp7v?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/6vXd2ZTrp7v?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>DNS-разведка: whois, dig, nslookup, история DNS, reverse DNS</title><pubDate>Wed, 03 Jun 2026 19:52:38 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/1d/fa/1dfa20c3-27d6-4ad8-bb06-eb232c82cfd8.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/74/19/7419a89d-0202-4e51-b9d7-78b270a99eda.png"></img>DNS (Domain Name System) — это «телефонная книга» интернета, преобразующая доменные имена в IP-адреса и обратно. Для специалиста по техническому OSINT DNS является одним из самых информативных источников: записи DNS раскрывают инфраструктуру организации, ее почтовые серверы, поддомены, политики безопасности и даже историю изменений. Данная статья посвящена методам DNS-разведки с использованием открытых инструментов и баз данных.]]></description><content:encoded><![CDATA[
  <figure id="pI1j" class="m_retina">
    <img src="https://img4.teletype.in/files/74/19/7419a89d-0202-4e51-b9d7-78b270a99eda.png" width="1099" />
  </figure>
  <h3 id="DnaD">DNS-разведка: whois, dig, nslookup, история DNS, reverse DNS</h3>
  <p id="veT0"></p>
  <p id="3HZz">DNS (Domain Name System) — это «телефонная книга» интернета, преобразующая доменные имена в IP-адреса и обратно. Для специалиста по техническому OSINT DNS является одним из самых информативных источников: записи DNS раскрывают инфраструктуру организации, ее почтовые серверы, поддомены, политики безопасности и даже историю изменений. Данная статья посвящена методам DNS-разведки с использованием открытых инструментов и баз данных.</p>
  <p id="jc0E"><strong>Почему DNS-разведка важна?</strong></p>
  <figure id="tnY1" class="m_original">
    <img src="https://img1.teletype.in/files/06/61/06611365-ae59-49b4-9cd7-1c40cda2472d.png" width="947" />
  </figure>
  <p id="cnFp"><strong>Этап 1: WHOIS — кто владелец домена или IP?</strong></p>
  <p id="6VrM">WHOIS-запрос возвращает регистрационные данные домена (или IP-диапазона). Хотя многие регистраторы скрывают персональные данные за PrivacyGuard, многое остается доступным.</p>
  <p id="UQEZ"><strong>Что можно узнать из WHOIS:</strong></p>
  <ul id="UD5J">
    <li id="YX5C"><strong>Дата регистрации домена</strong> (дата создания).</li>
    <li id="nlIc"><strong>Дата окончания регистрации</strong> (можно оценить, активен ли домен).</li>
    <li id="lo3F"><strong>Регистратор</strong> (например, GoDaddy, Namecheap, <a href="https://reg.ru/" target="_blank">REG.RU</a>).</li>
    <li id="pyLe"><strong>DNS-серверы</strong> (NS записи).</li>
    <li id="gUx1"><strong>Контактная информация</strong> (имя, email, телефон, адрес — если не скрыта).</li>
    <li id="gnX0"><strong>Для IP-блока:</strong> организация-владелец, страна, диапазон.</li>
  </ul>
  <p id="1nuN"><strong>Инструменты WHOIS:</strong></p>
  <figure id="a4kj" class="m_original">
    <img src="https://img4.teletype.in/files/f8/69/f8696a4d-4976-4cc2-bc61-84fbcb9f5edd.png" width="947" />
  </figure>
  <p id="9WHE"><strong>Пример командной строки:</strong></p>
  <pre id="awBn">whois example.com
whois 8.8.8.8</pre>
  <p id="lufl"><strong>Этап 2: Базовые DNS-записи (dig, nslookup)</strong></p>
  <p id="0ZH7"><code>dig</code> (Linux/macOS) и <code>nslookup</code> (Windows, Linux) — основные утилиты для прямых DNS-запросов.</p>
  <p id="YFaq"><strong>Примеры dig:</strong></p>
  <pre id="nMGA">dig example.com A               # A запись (IPv4)
dig example.com AAAA            # AAAA запись (IPv6)
dig example.com MX              # MX записи (почта)
dig example.com TXT             # TXT записи
dig example.com NS              # NS записи
dig example.com CNAME           # CNAME записи
dig example.com SOA             # SOA запись

# Указание конкретного DNS-сервера
dig @8.8.8.8 example.com A

# Краткий вывод (+short)
dig example.com A +short</pre>
  <p id="gzjl"><strong>Пример nslookup:</strong></p>
  <pre id="srdM">nslookup example.com
set type=MX
example.com</pre>
  <p id="9s8K"><strong>Использование публичных DNS-серверов:</strong></p>
  <ul id="6oE7">
    <li id="cA0E"><code>8.8.8.8</code> (Google Public DNS)</li>
    <li id="a1vy"><code>1.1.1.1</code> (Cloudflare)</li>
    <li id="5bp3"><code>9.9.9.9</code> (Quad9)</li>
    <li id="09hl"><code>77.88.8.8</code> (Яндекс DNS)</li>
  </ul>
  <p id="SOHi"><strong>Этап 3: История DNS (DNS History)</strong></p>
  <p id="nU9p">Записи DNS меняются: серверы переезжают, поддомены создаются и удаляются. История DNS позволяет найти старые IP, забытые поддомены, предыдущих хостинг-провайдеров.</p>
  <p id="Nxtz"><strong>Инструменты истории DNS:</strong></p>
  <figure id="EG3r" class="m_original">
    <img src="https://img2.teletype.in/files/d3/24/d324aa0e-f959-46a4-8e6b-936183f8c3fa.png" width="942" />
  </figure>
  <p id="eGk9"><strong>Пример использования SecurityTrails:</strong></p>
  <pre id="pPmC"># Через веб-интерфейс: https://securitytrails.com/domain/example.com/history
# Через API (требуется ключ)
curl -H &quot;APIKEY: YOUR_KEY&quot; https://api.securitytrails.com/v1/history/example.com/a</pre>
  <p id="QD0c"><strong>Что можно найти:</strong></p>
  <ul id="FpJg">
    <li id="a8oN">Старые IP-адреса, где ранее хостился домен.</li>
    <li id="1K9C">Удаленные поддомены (иногда забытые, но все еще разрешающиеся).</li>
    <li id="l0oe">Смену DNS-провайдера.</li>
  </ul>
  <p id="JGmp"><strong>Этап 4: Reverse DNS (PTR запись)</strong></p>
  <p id="yi09">Reverse DNS преобразует IP-адрес в доменное имя. Часто используется почтовыми серверами для проверки подлинности.</p>
  <p id="rzh3"><strong>Поиск PTR записи:</strong></p>
  <pre id="8NYT">dig -x 8.8.8.8 +short        # Результат: dns.google.
nslookup 8.8.8.8</pre>
  <p id="p6VR"><strong>Для диапазона IP:</strong> можно выполнить обратный поиск по всем IP в подсети (но массовые запросы могут быть заблокированы).</p>
  <p id="o5hm"><strong>Применение в OSINT:</strong></p>
  <ul id="QYXN">
    <li id="MZc7">Подтверждение, что IP действительно принадлежит организации.</li>
    <li id="9HWC">Поиск других доменов, указывающих на тот же IP (не всегда, только если PTR корректно настроен).</li>
  </ul>
  <p id="8ErV"><strong>Этап 5: DNS-трассировка (поиск всех поддоменов)</strong></p>
  <p id="pLVu">Базовые DNS-запросы не дают список поддоменов. Для их поиска используются другие методы (подробнее в статье 3). Но базово:</p>
  <ul id="DptH">
    <li id="XgYA"><strong>NS записи</strong> → указывают на DNS-серверы, но не перечисляют поддомены.</li>
    <li id="Lubw"><strong>Зонная передача (AXFR)</strong> — редкий случай, когда DNS-сервер разрешает выгрузку всей зоны. Проверить:bashdig @ns.example.com example.com AXFR</li>
  </ul>
  <p id="Ezul"><strong>Этап 6: DNS-записи и безопасность (SPF, DKIM, DMARC)</strong></p>
  <p id="FoSt">TXT записи часто содержат политики безопасности почты.</p>
  <p id="brt3"><strong>SPF (Sender Policy Framework):</strong> перечисляет IP, которые могут отправлять почту от имени домена.</p>
  <pre id="94mt">dig example.com TXT | grep &quot;v=spf1&quot;</pre>
  <p id="wbTs">Пример: <code>v=spf1 include:_spf.google.com ~all</code> → используется Google Workspace.</p>
  <p id="QeFO"><strong>DKIM (DomainKeys Identified Mail):</strong> цифровая подпись писем.</p>
  <pre id="ULXv">dig selector._domainkey.example.com TXT</pre>
  <p id="uck4"><strong>DMARC (Domain-based Message Authentication, Reporting &amp; Conformance):</strong> указывает, что делать с письмами, не прошедшими SPF/DKIM.</p>
  <pre id="RoV3">dig _dmarc.example.com TXT</pre>
  <p id="JsLR"><strong>Ценность для OSINT:</strong></p>
  <ul id="Pnh6">
    <li id="IuWI">Определение используемых почтовых провайдеров (Google, Microsoft, Яндекс, <a href="https://mail.ru/" target="_blank">Mail.ru</a>).</li>
    <li id="no6r">Выявление устаревших или неправильных конфигураций.</li>
    <li id="OPKS">Возможный email для отчетов (в DMARC).</li>
  </ul>
  <p id="pcMZ"><strong>Этап 7: DNS-серверы и CDN</strong></p>
  <p id="Yxto">CNAME записи часто указывают на CDN (Cloudflare, Akamai, Amazon CloudFront). Это маскирует реальный IP-адрес сервера.</p>
  <p id="8G5J"><strong>Как определить CDN:</strong></p>
  <ul id="6KxJ">
    <li id="q0Pp">A запись ведет на IP, принадлежащий CDN (проверить WHOIS).</li>
    <li id="JM7b">CNAME на <code>xxx.cloudfront.net</code>, <code>xxx.cdn.cloudflare.net</code> и т.д.</li>
  </ul>
  <p id="TIaw"><strong>Этап 8: Анализ DNS без командной строки — онлайн-сервисы</strong></p>
  <figure id="of4d" class="m_original">
    <img src="https://img3.teletype.in/files/a9/9f/a99f49c8-e81b-4a8b-80a9-5033fa11a051.png" width="946" />
  </figure>
  <p id="pWmI"><strong>Практический пример: разведка по домену</strong></p>
  <p id="Bvyb"><em>Задача:</em> собрать информацию о домене <code>target.org</code>.</p>
  <ol id="cPes">
    <li id="X2kI"><strong>WHOIS</strong> → регистратор Namecheap, дата создания 2010-05-01, дата окончания 2026-05-01, DNS-серверы <code>ns1.namecheap.com</code>, контакты скрыты.</li>
    <li id="W30y"><strong>DNS-записи (dig)</strong>:</li>
    <ul id="QSZd">
      <li id="qSOo"><code>A</code> → <code>192.0.2.10</code></li>
      <li id="8NZT"><code>MX</code> → <code>mail.target.org</code> (приоритет 10)</li>
      <li id="MqnM"><code>TXT</code> → <code>v=spf1 a mx include:spf.protection.outlook.com -all</code> (использует Office 365)</li>
      <li id="ElRJ"><code>NS</code> → <code>ns1.namecheap.com</code>, <code>ns2.namecheap.com</code></li>
      <li id="iMJ8"><code>CNAME</code> (www) → <code>target.org</code> (тот же IP)</li>
    </ul>
    <li id="XOQz"><strong>Reverse DNS для IP 192.0.2.10</strong> → <code>web.target.org</code>.</li>
    <li id="oaZh"><strong>SPF-анализ</strong> → используются серверы Office 365. Предположительно, целевая организация использует Microsoft 365.</li>
    <li id="in7E"><strong>История DNS (SecurityTrails)</strong>:</li>
    <ul id="Dlew">
      <li id="hxIV">2 года назад A-запись была <code>203.0.113.55</code> (другой хостинг).</li>
      <li id="QvY5">Был поддомен <code>dev.target.org</code>, сейчас не разрешается.</li>
    </ul>
    <li id="ZIs5"><strong>DNSdumpster</strong> → находит дополнительные поддомены: <code>mail.target.org</code>, <code>remote.target.org</code>, <code>vpn.target.org</code>.</li>
    <li id="zhkO"><strong>Вывод</strong>: инфраструктура включает веб-сервер на <code>192.0.2.10</code>, почту на Office 365, VPN-поддомен. Ранее использовался другой хостинг.</li>
  </ol>
  <p id="PMWO"><strong>Инструменты для автоматизации DNS-запросов (Python)</strong></p>
  <pre id="svvl">import dns.resolver

def query_dns(domain, record_type):
    try:
        answers = dns.resolver.resolve(domain, record_type)
        return [str(r) for r in answers]
    except Exception as e:
        return None

domain = &quot;example.com&quot;
for rtype in [&quot;A&quot;, &quot;MX&quot;, &quot;TXT&quot;, &quot;NS&quot;]:
    records = query_dns(domain, rtype)
    print(f&quot;{rtype}: {records}&quot;)</pre>
  <p id="FqGE"><strong>ограничения</strong></p>
  <ul id="GeeS">
    <li id="riKQ">DNS-запросы — это публичные данные. Их сбор не является активным сканированием и обычно разрешен.</li>
    <li id="YN6e">Однако массовые запросы к DNS-серверу могут быть расценены как атака (DDoS). Используйте задержки, авторитетные публичные резолверы.</li>
    <li id="xwv5">Некоторые сервисы (SecurityTrails) имеют условия использования, запрещающие автоматизированный массовый сбор без подписки.</li>
  </ul>
  <p id="7vJj"></p>
  <p id="7cFZ">DNS-разведка — фундамент технического OSINT. WHOIS дает информацию о владельце и датах, dig/nslookup — текущие записи. История DNS и reverse DNS расширяют картину прошлых конфигураций. SPF/DKIM/DMARC раскрывают используемые почтовые сервисы. Владение этими методами позволяет бесконтактно составить детальную карту инфраструктуры домена.</p>
  <p id="maKE">В следующей статье цикла мы рассмотрим более сложный этап — <strong>поиск поддоменов</strong>, включая инструменты Amass, Sublist3r, crt.sh и техники перебора.</p>

]]></content:encoded></item></channel></rss>