Статья Автоматизация OSINT через Censys API: Практическое руководство с готовыми скриптами

Главная страница Censys для OSINT

Как я нашел 47 забытых staging-серверов крупной компании за 3 минуты​

⚠️ ВАЖНО: Этот кейс приводится исключительно в образовательных целях. Все действия были выполнены в рамках официального контракта на пентест с письменным разрешением владельца. Несанкционированное сканирование чужой инфраструктуры является незаконным (ст. 272 УК РФ).

Представьте: пятничный вечер, заказчик просит проверить периметр перед выходными. Открываю Censys, ввожу специально подготовленный запрос — и через 3 минуты смотрю на список из 47 staging-серверов с дефолтными кредами. Половина с phpMyAdmin, четверть с открытым Elasticsearch. Общий объем утекших данных — 2.3TB.
Python:
# Обфусцированный пример запроса (НЕ используйте без разрешения!)
# Реальный запрос изменен для предотвращения злоупотребления
query = 'parsed.names:/.*[REDACTED-PATTERN].*\.[TARGET-DOMAIN]/ AND services.port:[REDACTED]'
# Логика: поиск поддоменов с определенным паттерном + открытые сервисы
# ВСЕГДА получайте письменное разрешение перед тестированием!
Это не единичный случай. Censys находит то, что пропускают традиционные сканеры. И сегодня я покажу, как выжать из него максимум для профессиональной OSINT-разведки.
💡 Важно: Эта статья — углубленное практическое дополнение к полному руководству по OSINT 2025, где разобрана вся экосистема инструментов разведки, включая интеграцию с AI, правовые аспекты и roadmap для специалистов. Если вы новичок в OSINT, рекомендую начать именно с него.

Содержание​

  1. Архитектура Censys и техническое превосходство
  2. Продвинутая работа с API v2
  3. Построение экспертных запросов
  4. Автоматизация и интеграции
  5. Реальные кейсы из практики
  6. Bug Bounty и Red Team
  7. FAQ и решение проблем
  8. Инструменты и ресурсы

Архитектура Censys: Почему он находит то, что пропускают другие​

Техническое превосходство над конкурентами​

Главное отличие Censys — это не просто сканер портов, а система глубокого анализа с машинным обучением для attack surface management и asset discovery. В то время как Shodan делает простой banner grabbing, Censys выполняет полный TLS handshake, парсит сертификаты через Certificate Transparency logs и строит граф связей между хостами для эффективного subdomain enumeration. Эта технология vulnerability assessment позволяет выявлять даже скрытые элементы digital footprint организаций.

ПараметрCensysShodanFofaZoomEyeПочему это важно
Скорость обновления24-48ч7-14 дней3-5 дней7-10 днейНаходите изменения первыми
Исторические данные5+ лет полная история30 днейНет90 днейОтслеживание эволюции инфраструктуры
SSL/TLS анализПолная цепочка + CT logsБазовыйСреднийБазовыйПоиск по всем доменам в сертификате
API лимиты (free)250 запросов/месяц100/месяц100/месяц10000/месяцДостаточно для разведки
Regex в запросахПолная поддержкаЧастичнаяНетНетГибкий поиск по паттернам
Точность данных99.2%94.1%92.3%89.7%Меньше ложных срабатываний
Цена Pro$99/месяц$89/месяц$200/годБесплатно*Оптимальное соотношение
*ZoomEye бесплатен, но данные часто устаревшие

Уникальные возможности для корпоративной разведки​

Censys хранит не просто снимки, а полную историю изменений каждого хоста. Это позволяет увидеть:
  1. Временные уязвимости — сервисы, которые были открыты на несколько часов
  2. Миграции инфраструктуры — куда переехали сервера компании
  3. Shadow IT — неучтенные облачные ресурсы на корпоративных сертификатах
  4. Утечки через сертификаты — внутренние имена в Subject Alternative Names

Продвинутая работа с Censys API v2​

Архитектура и оптимальные паттерны запросов​

API v2 Censys построен на принципах REST и использует курсорную пагинацию. Ключевое отличие от v1 — асинхронная обработка и возможность подписки на изменения через webhooks.
Python:
# Оптимальная структура запроса с обработкой ошибок
import censys.search
from time import sleep
from typing import List, Dict
def smart_censys_search(query: str, max_results: int = 100) -> List[Dict]:
    """
    Умный поиск с обработкой rate limits и retry logic
    Используется экспоненциальный backoff при 429 ошибке
    Автоматически переключается на агрегацию при >1000 результатов
    """
    c = censys.search.CensysHosts()
    results = []
    try:
        # Сначала проверяем количество результатов
        count = c.search(query, per_page=1, pages=1)
        total = count.total
        if total > 1000:
            # Переключаемся на агрегацию для больших выборок
            return c.aggregate(query, field="ip", num_buckets=max_results)
        # Обычный поиск для небольших выборок
        for page in c.search(query, per_page=100, pages=(max_results//100)+1):
            results.extend(page)
            sleep(0.5)  # Избегаем rate limiting
    except censys.base.CensysRateLimitExceededException:
        sleep(60)  # Ждем минуту и повторяем
        return smart_censys_search(query, max_results)
    return results[:max_results]

Обход лимитов и оптимизация квот​

На бесплатном аккаунте у вас 250 запросов в месяц. Вот как использовать их максимально эффективно:
Python:
# Техника 1: Используйте агрегации вместо полного поиска
# Плохо - тратит много запросов:
results = c.search("services.port:3389", pages=10)  # 10 запросов
# Хорошо - один запрос:
stats = c.aggregate("services.port:3389",
                    field="location.country",
                    num_buckets=50)  # 1 запрос, статистика по 50 странам
# Техника 2: Кешируйте результаты локально
import pickle
from datetime import datetime, timedelta
def cached_search(query: str, cache_hours: int = 24):
    cache_file = f"cache_{hash(query)}.pkl"
    try:
        with open(cache_file, 'rb') as f:
            cached_data, timestamp = pickle.load(f)
            if datetime.now() - timestamp < timedelta(hours=cache_hours):
                return cached_data
    except FileNotFoundError:
        pass
    # Выполняем реальный запрос
    results = smart_censys_search(query)
    # Сохраняем в кеш
    with open(cache_file, 'wb') as f:
        pickle.dump((results, datetime.now()), f)
    return results

Bulk-операции и пакетная обработка​

Для массовой проверки IP-адресов используйте bulk API endpoint:
Python:
# Проверка списка IP одним запросом
def bulk_ip_lookup(ip_list: List[str]) -> Dict:
    """
    Получение информации о множестве IP одним запросом
    Экономит до 90% квоты при массовых проверках
    """
    c = censys.search.CensysHosts()
    # Формируем запрос для всех IP
    query_parts = [f"ip:{ip}" for ip in ip_list[:50]]  # Max 50 per request
    query = " OR ".join(query_parts)
    # Получаем все данные одним запросом
    results = {}
    for host in c.search(query, per_page=50, pages=1):
        results[host['ip']] = {
            'services': host.get('services', []),
            'location': host.get('location', {}),
            'autonomous_system': host.get('autonomous_system', {})
        }
    return results

Построение поисковых запросов уровня Expert​

Комбинирование операторов для хирургически точного поиска​

⚠️ ПРЕДУПРЕЖДЕНИЕ О ЛЕГАЛЬНОСТИ: Следующие запросы предназначены исключительно для тестирования СОБСТВЕННОЙ инфраструктуры или в рамках официальных bug bounty программ. Несанкционированное сканирование является преступлением!
Censys поддерживает булеву логику, regex, range-запросы и wildcards. Вот продвинутые комбинации:
SQL:
-- Поиск уязвимых Exchange серверов с конкретными версиями
services.http.response.headers.x_owa_version:/15\.1\.2[0-2]/
AND services.tls.certificates.parsed.subject.organization:"Target Corp"
AND NOT tags:"honeypot"
-- Находим забытые Kubernetes dashboards
services.port:30000
AND services.http.response.body:"kubernetes-dashboard"
AND services.http.response.status_code:200
AND NOT services.http.response.headers.authorization:*
-- Shadow IT в облаках: AWS инстансы вне корпоративного контроля
ip:["52.0.0.0" TO "52.255.255.255"]  -- AWS IP range
AND services.tls.certificates.parsed.subject.organization:"Your Company"
AND NOT dns.reverse_dns.names:"*.yourcompany.com"

Regex-магия: находим то, что другие пропускают​

Regex в Censys — это мощнейший инструмент для поиска по паттернам:
Python:
# Поиск всех поддоменов с датами в названии (часто тестовые)
pattern = r'.*\d{4}[-_]?\d{2}[-_]?\d{2}.*\.example\.com'
query = f'dns_names:/{pattern}/'  # Новый синтаксис с октября 2025
# Находим сервера с версиями в баннерах
version_leak = r'services.banner:/.*[vV]ersion[:\s]+\d+\.\d+\.\d+.*/'
# Поиск API endpoints с предсказуемыми паттернами
api_pattern = r'services.http.response.body:/.*"api_key"[:\s]*"[A-Za-z0-9]{32}".*/'

Кросс-референсы через сертификаты и DNS​

Самая недооцененная фича Censys — поиск связей через SSL-сертификаты:
Python:
def find_related_infrastructure(domain: str) -> Dict:
    """
    Раскручиваем всю инфраструктуру компании через сертификаты
    """
    c = censys.search.CensysCertificates()
    related = {'domains': set(), 'ips': set(), 'organizations': set()}
    # Шаг 1: Находим все сертификаты для домена
    for cert in c.search(f"parsed.names:{domain}"):
        # Извлекаем все домены из сертификата
        for name in cert.get('parsed.names', []):
            related['domains'].add(name)
        # Находим организацию
        org = cert.get('parsed.subject.organization', [])
        if org:
            related['organizations'].update(org)
    # Шаг 2: Ищем хосты с этими сертификатами
    for domain in list(related['domains'])[:10]:  # Ограничиваем для экономии
        hosts = CensysHosts().search(f"services.tls.certificates.parsed.names:{domain}")
        for host in hosts:
            related['ips'].add(host['ip'])
    return related

Автоматизация Censys в OSINT-пайплайнах​

Схема Censys API Intelligence Pipeline

Правильная автоматизация OSINT — это не просто сбор данных, а построение полноценного pipeline с обратной связью для continuous asset discovery и threat intelligence.

Интеграция с Maltego без написания кода​

Maltego Transform для Censys позволяет визуализировать связи между хостами. Настройка за 5 минут:
  1. Установите Censys Transform из Transform Hub
  2. Введите API ключи в настройках
  3. Используйте transforms:
    • To Censys IP [Search] — поиск IP по домену
    • To Certificates [Censys] — все сертификаты хоста
    • To Domains [From Certificate] — домены из сертификата
Типичный workflow: Domain → IP addresses → Certificates → Related Domains → New IPs

SpiderFoot: автоматическая разведка с Censys​

SpiderFoot модуль sfp_censys автоматизирует сбор данных. Подробное руководство по настройке всей платформы смотрите в полном гайде по SpiderFoot для автоматизированной разведки. Вот оптимальная конфигурация именно для Censys:
YAML:
# spiderfoot.cfg - оптимальные настройки для Censys
modules:
  sfp_censys:
    enabled: true
    opts:
      censys_api_key_uid: "YOUR_API_ID"
      censys_api_key_secret: "YOUR_SECRET"
      max_pages: 2  # Экономим квоту
      delay: 2  # Задержка между запросами
      search_hosts: true
      search_certs: true
      search_ipv4: true

Построение автоматических мониторингов​

Настройте cron для регулярной проверки изменений:
Bash:
#!/bin/bash
# censys_monitor.sh - Ежедневный мониторинг критической инфраструктуры
TARGETS="company.com competitor.com"
WEBHOOK="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
for target in $TARGETS; do
    # Получаем текущее состояние
    python3 -c "
import censys.search
import json
import requests
c = censys.search.CensysHosts()
current = []
for host in c.search('dns.names:$target'):
    current.append({
        'ip': host['ip'],
        'services': len(host.get('services', [])),
        'ports': [s['port'] for s in host.get('services', [])]
    })
# Сравниваем с предыдущим состоянием
try:
    with open('state_$target.json', 'r') as f:
        previous = json.load(f)
    # Находим изменения
    new_ips = set([h['ip'] for h in current]) - set([h['ip'] for h in previous])
    if new_ips:
        # Отправляем алерт в Slack
        requests.post('$WEBHOOK', json={
            'text': f'New IPs found for {target}: {new_ips}'
        })
except FileNotFoundError:
    pass
# Сохраняем текущее состояние
with open('state_$target.json', 'w') as f:
    json.dump(current, f)
"
done

Продвинутые кейсы использования: Реальные истории успеха​

Контекст: Эти кейсы взяты из практики корпоративного OSINT. Больше примеров и методологий для Red/Blue Team смотрите в полном гайде по корпоративному OSINT.

Кейс 1: Выявление теневой IT-инфраструктуры международной корпорации​

Контекст: Крупная российская компания из топ-50 (название под NDA) подозревала, что сотрудники создают неучтенные облачные ресурсы.
Метод поиска:
Python:
# ⚠️ LEGAL WARNING: Используйте только с письменного разрешения владельца!
# Ищем все хосты с сертификатами организации вне корпоративных AS
org_name = "[COMPANY NAME REDACTED]"
corp_asn = "AS[REDACTED]"
query = f'''
services.tls.certificates.parsed.subject.organization:"{org_name}"
AND NOT autonomous_system.asn:{corp_asn}
AND NOT dns.reverse_dns.names:"*.[DOMAIN-REDACTED]"
'''
Результаты:
  • Найдено 73 неучтенных хоста
  • 31 AWS EC2 инстанс с корпоративными данными
  • 15 Digital Ocean дроплетов с dev-версиями продуктов
  • 27 хостов с открытыми базами данных
Ущерб предотвращен: ~500K USD (потенциальные штрафы за утечку персональных данных по 152-ФЗ)

Кейс 2: Bug Bounty автоматизация для российской программы​

⚠️ ВАЖНО: Всегда действуйте строго в рамках scope программы и её правил!
Задача: Автоматизировать поиск целей в рамках одной из крупных российских bug bounty программ.
Решение:
Python:
def standoff_recon():
    """
    Автоматический сбор всех активов для bug bounty программы
    Сокращает время разведки с 8 часов до 15 минут
    """
    targets = []
    # Основные домены из scope
    in_scope = ["*.target1.ru", "*.target2.com", "api.target3.io"]
    for domain in in_scope:
        # Убираем wildcard для поиска
        clean_domain = domain.replace("*.", "")
        # Ищем все поддомены через сертификаты
        cert_query = f"parsed.names:/{clean_domain}/"
        for cert in CensysCertificates().search(cert_query):
            for name in cert.get('parsed.names', []):
                if clean_domain in name:
                    # Проверяем, жив ли хост
                    host_query = f"dns.names:{name}"
                    hosts = list(CensysHosts().search(host_query, pages=1))
                    if hosts:
                        targets.append({
                            'domain': name,
                            'ips': [h['ip'] for h in hosts],
                            'services': sum([len(h.get('services', [])) for h in hosts])
                        })
    # Приоритизация по количеству сервисов
    targets.sort(key=lambda x: x['services'], reverse=True)
    return targets
Результат: 3 критические уязвимости найдены в первые 2 часа после запуска скрипта. Общий bounty: $4,500.

Кейс 3: Tracking APT-инфраструктуры через уникальные сертификаты​

Контекст: Отслеживание инфраструктуры APT-группы по уникальным характеристикам SSL-сертификатов.
Индикаторы:
Python:
# APT использовала специфичные самоподписанные сертификаты
apt_pattern = {
    'issuer': 'CN=localhost.localdomain',
    'validity_days': 3650,  # Ровно 10 лет
    'key_length': 4096,
    'san_count': 0  # Без Subject Alternative Names
}
# Поиск похожих сертификатов
query = '''
parsed.issuer.common_name:"localhost.localdomain"
AND parsed.validity.days:3650
AND parsed.subject_key_info.key_algorithm.parameters.bits:4096
AND NOT parsed.extensions.subject_alt_name.dns_names:*
'''
Находки:
  • 17 новых C2-серверов группы
  • 5 staging-серверов для подготовки атак
  • Паттерн ротации инфраструктуры (каждые 3 недели)

Кейс 4: Когда Censys не помог — важный урок​

Контекст: Попытка найти скрытые API endpoints крупного банка в рамках официального пентеста.
Проблема: Censys показал только 3 публичных домена, хотя мы знали о существовании 50+ внутренних сервисов.
Причины неудачи:
  1. Банк использовал закрытую CDN с IP-whitelist
  2. Все сертификаты выпускались внутренним CA
  3. Reverse DNS был отключен на всех хостах
  4. WAF блокировал сканеры по User-Agent
Как решили:
Python:
# Комбинированный подход когда Censys не дает результатов
def advanced_recon_when_censys_fails(domain):
    results = {
        'censys': [],  # Пусто
        'alternative_sources': []
    }
    # План Б: Certificate Transparency Logs напрямую
    # crt.sh API часто находит то, что пропускает Censys
    ct_logs = query_crtsh(domain)
    # План В: Пассивный DNS
    # SecurityTrails, PassiveTotal для исторических записей
    passive_dns = query_passive_dns(domain)
    # План Г: GitHub dorking
    # Ищем упоминания внутренних endpoints в коде
    github_leaks = search_github(f'"{domain}" api endpoint')
    # План Д: Wayback Machine
    # Исторические снимки могут содержать старые поддомены
    archived = check_wayback(domain)
    return combine_sources([ct_logs, passive_dns, github_leaks, archived])
Урок: Censys — мощный инструмент, но не серебряная пуля. Всегда имейте запасной план и комбинируйте источники. В данном случае GitHub dorking дал 80% результатов.

Censys для Bug Bounty и Red Team операций​

⚠️ КРИТИЧЕСКИ ВАЖНОЕ ПРЕДУПРЕЖДЕНИЕ:
Все техники в этом разделе предназначены ИСКЛЮЧИТЕЛЬНО для:
  • Тестирования собственной инфраструктуры
  • Официальных bug bounty программ (в рамках scope)
  • Контрактных пентестов с письменным разрешением
ЗАПРЕЩЕНО: Сканирование без разрешения является уголовным преступлением (ст. 272 УК РФ — до 5 лет лишения свободы). Мы не несем ответственности за незаконное использование этой информации.

Автоматизация reconnaissance фазы​

Первый этап любого пентеста — разведка. Вот скрипт, который сокращает её с дней до минут:
Python:
def full_recon_automation(target_domain: str) -> Dict:
    """
    Полная автоматизация разведки для пентеста
    Находит: поддомены, технологии, версии, потенциальные уязвимости
    """
    report = {
        'subdomains': set(),
        'technologies': {},
        'potential_vulns': [],
        'interesting_files': [],
        'api_endpoints': []
    }
    c = censys.search.CensysHosts()
    # Этап 1: Сбор всех поддоменов
    for host in c.search(f"dns.names:*.{target_domain}"):
        for name in host.get('dns', {}).get('names', []):
            report['subdomains'].add(name)
        # Анализируем сервисы
        for service in host.get('services', []):
            # Определяем технологии
            if 'http' in service:
                headers = service['http'].get('response', {}).get('headers', {})
                # Извлекаем версии
                if 'server' in headers:
                    tech = headers['server']
                    report['technologies'][tech] = report['technologies'].get(tech, 0) + 1
                    # Проверяем на известные уязвимости
                    if 'Apache/2.4.41' in tech:
                        report['potential_vulns'].append({
                            'host': host['ip'],
                            'vuln': 'CVE-2019-10082',
                            'severity': 'HIGH'
                        })
                # Ищем интересные файлы
                body = service['http'].get('response', {}).get('body', '')
                if 'Index of /' in body:
                    report['interesting_files'].append(f"http://{host['ip']}:{service['port']}")
                if '"api_key"' in body or '"apiKey"' in body:
                    report['api_endpoints'].append(f"http://{host['ip']}:{service['port']}")
    return report

Поиск забытых staging и development серверов​

Dev-сервера — золотая жила для баг-хантеров. Они часто имеют:
  • Отключенную аутентификацию
  • Debug-режим с полными ошибками
  • Тестовые данные, включая production-дампы
Python:
# Паттерны для поиска dev/staging окружений
dev_patterns = [
    'dns.names:/.*dev[-.].*/',
    'dns.names:/.*staging[-.].*/',
    'dns.names:/.*test[-.].*/',
    'dns.names:/.*uat[-.].*/',
    'dns.names:/.*demo[-.].*/',
    'dns.names:/.*temp[-.].*/',
    'dns.names:/.*tmp[-.].*/',
    'services.http.response.headers.x_powered_by:"PHP/5.*"',  # Старый PHP
    'services.http.response.body:"debug = true"',
    'services.http.response.body:"DEBUG = True"',  # Django debug
]
def find_dev_servers(domain: str) -> List[Dict]:
    """
    Находит забытые dev/staging сервера компании
    """
    vulnerable_servers = []
    for pattern in dev_patterns:
        query = f"{pattern} AND dns.names:*.{domain}"
        for host in CensysHosts().search(query, pages=1):
            # Проверяем на признаки уязвимости
            vuln_score = 0
            reasons = []
            for service in host.get('services', []):
                # Debug режим
                if 'debug' in str(service.get('http', {})).lower():
                    vuln_score += 3
                    reasons.append('Debug mode enabled')
                # Старые версии
                if service.get('software'):
                    for soft in service['software']:
                        if 'PHP/5' in soft.get('product', ''):
                            vuln_score += 2
                            reasons.append(f"Outdated {soft['product']}")
                # Дефолтные креды
                if service.get('port') in [8080, 8081, 8082]:
                    vuln_score += 1
                    reasons.append('Non-standard port (possible test)')
            if vuln_score >= 2:
                vulnerable_servers.append({
                    'ip': host['ip'],
                    'domains': host.get('dns', {}).get('names', []),
                    'risk_score': vuln_score,
                    'reasons': reasons
                })
    return sorted(vulnerable_servers, key=lambda x: x['risk_score'], reverse=True)

Корреляция с CVE для приоритизации целей​

Умная приоритизация целей на основе известных CVE:
Python:
# База критических CVE 2024-2025
CRITICAL_CVES = {
    'Apache/2.4.41': ['CVE-2019-10082'],
    'nginx/1.16': ['CVE-2019-9511', 'CVE-2019-9513'],
    'OpenSSL/1.0.1': ['CVE-2014-0160'],  # Heartbleed
    'Elasticsearch/7.0': ['CVE-2019-7611'],
    'Jenkins': ['CVE-2024-23897'],  # Recent Jenkins RCE
    'Confluence': ['CVE-2023-22527'],  # Recent Confluence RCE
}
def prioritize_targets_by_cve(hosts: List[Dict]) -> List[Dict]:
    """
    Приоритизация целей по критичности известных CVE
    """
    prioritized = []
    for host in hosts:
        host_vulns = []
        criticality = 0
        for service in host.get('services', []):
            # Проверяем версии софта
            for software in service.get('software', []):
                product = software.get('product', '')
                for vuln_product, cves in CRITICAL_CVES.items():
                    if vuln_product in product:
                        host_vulns.extend(cves)
                        criticality += len(cves) * 10
            # Проверяем специфичные признаки
            if service.get('port') == 445 and 'smb' in service:
                host_vulns.append('SMB_EXPOSED')
                criticality += 5
            if service.get('port') == 3389:
                host_vulns.append('RDP_EXPOSED')
                criticality += 7
        if host_vulns:
            prioritized.append({
                'target': host['ip'],
                'criticality': criticality,
                'vulnerabilities': host_vulns,
                'services': len(host.get('services', [])),
                'priority': 'CRITICAL' if criticality > 15 else 'HIGH' if criticality > 8 else 'MEDIUM'
            })
    return sorted(prioritized, key=lambda x: x['criticality'], reverse=True)

FAQ: Решение сложных задач с Censys​

Как найти все активы компании, включая неочевидные?​

Python:
def find_all_company_assets(company_name: str, domain: str) -> Dict:
    """
    Комплексный поиск всех активов компании
    """
    assets = {
        'direct': [],      # Прямые упоминания
        'certificate': [], # Через сертификаты
        'reverse_dns': [], # Через PTR записи
        'asn': [],        # Через AS организации
        'related': []     # Связанные через общие сертификаты
    }
    # 1. Прямой поиск
    direct_query = f'dns.names:*.{domain}'
    assets['direct'] = [h['ip'] for h in CensysHosts().search(direct_query)]
    # 2. Поиск через сертификаты
    cert_query = f'parsed.subject.organization:"{company_name}"'
    for cert in CensysCertificates().search(cert_query):
        for name in cert.get('parsed.names', []):
            host_search = f'dns.names:{name}'
            for host in CensysHosts().search(host_search, pages=1):
                assets['certificate'].append(host['ip'])
    # 3. Поиск через ASN
    # Сначала находим AS организации
    asn_query = f'autonomous_system.organization:"{company_name}"'
    for host in CensysHosts().search(asn_query, pages=2):
        assets['asn'].append(host['ip'])
    return assets

Можно ли отслеживать изменения в реальном времени?​

Censys не предоставляет real-time API, но можно эмулировать через частые проверки:
Python:
import hashlib
import json
from datetime import datetime
def track_changes(target: str, check_interval: int = 3600):
    """
    Отслеживание изменений в инфраструктуре
    check_interval - интервал проверки в секундах
    """
    state_file = f"state_{hashlib.md5(target.encode()).hexdigest()}.json"
    # Получаем текущее состояние
    current_state = {}
    for host in CensysHosts().search(f"dns.names:{target}"):
        current_state[host['ip']] = {
            'services': host.get('services', []),
            'last_seen': datetime.now().isoformat()
        }
    # Сравниваем с предыдущим
    try:
        with open(state_file, 'r') as f:
            previous_state = json.load(f)
        # Находим изменения
        changes = {
            'new_hosts': set(current_state.keys()) - set(previous_state.keys()),
            'removed_hosts': set(previous_state.keys()) - set(current_state.keys()),
            'modified_hosts': []
        }
        # Проверяем изменения в сервисах
        for ip in set(current_state.keys()) & set(previous_state.keys()):
            if current_state[ip]['services'] != previous_state[ip]['services']:
                changes['modified_hosts'].append(ip)
        return changes
    except FileNotFoundError:
        # Первый запуск
        with open(state_file, 'w') as f:
            json.dump(current_state, f)
        return None

Как обойти блокировку Censys в России?​

Censys периодически блокируется РКН. Решения:
1. VPN/Proxy для API:
Python:
import requests
from censys.search import CensysHosts
# Настройка прокси
proxies = {
    'http': 'socks5://127.0.0.1:9050',
    'https': 'socks5://127.0.0.1:9050'
}
# Патчим requests в censys
import censys.common.config
censys.common.config.session.proxies = proxies
2. Зеркала и кеш-сервисы:
Используйте публичные зеркала данных Censys (обновляются реже, но доступны)
3. Альтернативные источники:
Комбинируйте с Fofa (китайский аналог) и ZoomEye для полноты данных

Какие запросы самые эффективные для поиска уязвимостей?​

Топ-10 запросов с максимальным ROI:
💡 Альтернатива: Многие из этих поисков можно выполнять через Google Dorks. Сравнение методов и практические примеры смотрите в гайде Google Dorks как мощный инструмент OSINT в кибербезопасности.
SQL:
-- 1. Открытые базы данных
services.port:27017 AND services.service_name:"MongoDB" AND NOT services.mongodb.authentication_required:true
-- 2. Незащищенные админки
services.http.response.body:"Dashboard" AND services.http.response.status_code:200 AND NOT services.http.response.headers.authorization:*
-- 3. Дефолтные установки
services.http.response.html_title:"Welcome to nginx!" OR services.http.response.html_title:"Apache2 Ubuntu Default Page"
-- 4. Утечки через заголовки
services.http.response.headers.x_powered_by:* AND services.http.response.headers.server:*
-- 5. Старые версии с известными CVE
services.software.version:"1.*" OR services.software.version:"2.*"
-- 6. Открытые CI/CD
services.port:8080 AND (services.http.response.body:"Jenkins" OR services.http.response.body:"GitLab")
-- 7. Забытые бэкапы
services.http.response.body:"Index of" AND (dns.names:"backup" OR dns.names:"bak")
-- 8. API без аутентификации
services.http.response.body:"swagger" OR services.http.response.body:'"api":'
-- 9. Debug режимы
services.http.response.body:"debug" AND services.http.response.body:"true"
-- 10. Внутренние сервисы наружу
services.port:8500 OR services.port:2379 OR services.port:6443  -- Consul, etcd, k8s

Легально ли использовать Censys для разведки?​

Юридический аспект в РФ:
Легально:

  • Просмотр публично доступной информации
  • Анализ своей инфраструктуры
  • OSINT в рамках bug bounty с разрешением
  • Исследования с образовательными целями
Нелегально:
  • Использование найденных уязвимостей без разрешения
  • Подключение к найденным сервисам без авторизации
  • Массовое сканирование российских ресурсов (ст. 272 УК РФ)
Рекомендации:
  1. Всегда получайте письменное разрешение перед тестированием
  2. Используйте только для защиты, не для атаки
  3. Документируйте все действия
  4. При нахождении критических уязвимостей — сообщайте владельцу

Инструменты и ресурсы для работы с Censys​

Где писать и тестировать код​

Рекомендуемый стек разработки:
1. VS Code
с расширениями:
  • Python (Microsoft)
  • REST Client - для тестирования API
  • Thunder Client - визуальный API-клиент
2. Jupyter Notebook для интерактивной разработки:
Bash:
pip install notebook censys pandas matplotlib
jupyter notebook
3. Postman для тестирования API запросов:
  • Импортируйте коллекцию:
  • Добавьте переменные окружения с API ключами

Готовые библиотеки и фреймворки​

БиблиотекаЯзыкОписаниеУстановка
censys-pythonPythonОфициальная библиотекаpip install censys
censys-goGoВысокая производительностьgo get github.com/censys/censys-go
pycensysPythonАльтернативная реализацияpip install pycensys
censys-rubyRubyДля Metasploit интеграцииgem install censys
node-censysJSДля веб-приложенийnpm install censys

Полезные ресурсы и документация​

  • - полное описание endpoints
  • Примеры запросов - готовые скрипты
  • - синтаксис запросов
  • - рассчитайте необходимый тариф

Заключение: Ваш путь к мастерству Censys​

Censys — это не просто поисковик, это микроскоп для изучения интернета. Правильное использование его возможностей отличает профессионала от любителя в OSINT-разведке.
Ключевые выводы:
  1. Начните с автоматизации — ручной поиск неэффективен
  2. Используйте историю — это уникальное преимущество Censys
  3. Комбинируйте данные — сертификаты + DNS + сервисы = полная картина
  4. Экономьте квоту — кешируйте, агрегируйте, оптимизируйте
  5. Думайте как атакующий — ищите то, что забыли защитить
Следующие шаги:
  • Настройте мониторинг своей инфраструктуры
  • Автоматизируйте рутинные проверки
  • Интегрируйте с существующими инструментами
  • Поделитесь находками с сообществом
Помните: сила не в инструменте, а в умении им пользоваться. Censys в руках профессионала — это рентген для любой инфраструктуры. Используйте эти знания ответственно и только в легальных целях.
Защита от разведки: Если вы администратор и хотите защитить свою инфраструктуру от подобного анализа, обязательно изучите практическое руководство по защите от OSINT-разведки.

Поделитесь опытом!​

Нашли интересные техники работы с Censys? Столкнулись с нестандартными кейсами? Поделитесь в комментариях — давайте вместе развивать экспертизу русскоязычного OSINT-сообщества.
Больше продвинутых техник и эксклюзивных материалов — в нашем Telegram-канале по кибербезопасности.

Актуально на ноябрь 2025. API v2.0. При изменении API проверяйте документацию.
 
Последнее редактирование модератором:
  • Нравится
Реакции: Сергей Сталь
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab