June 27

Поиск уязвимостей через открытые источники: базы CVE, NVD, Exploit-DB и связь с версиями ПО

Поиск уязвимостей через открытые источники: базы CVE, NVD, Exploit-DB и связь с версиями ПО

После того как в ходе технического OSINT выявлены версии программного обеспечения, используемого целью (веб-сервер, CMS, библиотеки, операционная система), логичный следующий шаг — выяснить, есть ли у этих версий известные уязвимости. Открытые базы данных уязвимостей (CVE, NVD, Exploit-DB, Vulners и др.) позволяют сопоставить версию ПО с известными CVE (Common Vulnerabilities and Exposures), оценить критичность и даже найти готовые эксплойты. Это помогает понять, насколько цель подвержена атакам, и приоритезировать дальнейшие действия. Данная статья посвящена методам поиска уязвимостей по версиям ПО с использованием открытых источников.

Что такое CVE, CVSS, NVD, Exploit-DB

Зачем это нужно в техническом OSINT?

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

Простое наличие уязвимой версии ПО не означает, что цель автоматически скомпрометирована. Это лишь индикатор потенциальной уязвимости.

Этап 1: Поиск CVE по названию продукта и версии

Самый простой способ — использовать поисковые системы по CVE с фильтрацией.

Основные базы данных:

Поиск по продукту в NVD:

https://nvd.nist.gov/vuln/search/results?query=nginx&results_type=overview

Поиск с версией в NVD (сложно): NVD не всегда индексирует версии, лучше использовать Vulners.

Vulners search (пример):

https://vulners.com/search?query=nginx%201.18.0

Этап 2: Использование Vulners API для массового поиска

Vulners предоставляет бесплатный API с лимитами. Позволяет искать по CPE (Common Platform Enumeration) — стандартизированному формату описания ПО.

Формат CPE: cpe:2.3:a:nginx:nginx:1.18.0:*:*:*:*:*:*:*

Упрощённый поиск через API Vulners:

import requests
import json

VULNERS_API_KEY = "YOUR_API_KEY"

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

def get_cves_for_software(software_list):
    results = {}
    for sw in software_list:
        cves = search_vulnerabilities(sw['name'], sw['version'])
        results[f"{sw['name']} {sw['version']}"] = cves
    return results

# Пример
software = [
    {'name': 'nginx', 'version': '1.18.0'},
    {'name': 'php', 'version': '7.4.33'},
    {'name': 'wordpress', 'version': '6.2'}
]
vulns = get_cves_for_software(software)
for k, v in vulns.items():
    print(f"{k}: {len(v)} vulnerabilities")

Этап 3: Использование CIRCL CVE Search API (без ключа)

CIRCL предлагает публичный API, не требующий авторизации.

Пример запроса для поиска CVE по ключевому слову nginx:

curl https://cve.circl.lu/api/search/nginx

Для извлечения информации о конкретном CVE:

curl https://cve.circl.lu/api/cve/CVE-2021-23017

CIRCL не позволяет фильтровать по версии, ищет по тексту.

Этап 4: Поиск эксплойтов (Exploit-DB, Rapid7, Packet Storm)

Наличие эксплойта повышает вероятность того, что уязвимость будет использована.

Exploit-DB:

  • Поиск по продукту и версии: https://www.exploit-db.com/search?q=nginx+1.18.0
  • Можно скачать готовый код (на свой страх и риск).

Rapid7 DB (Metasploit modules):

  • Поиск: https://www.rapid7.com/db/search/?q=nginx

Packet Storm Security:

  • https://packetstormsecurity.com/search/?q=nginx

Пример автоматизации через Exploit-DB (неофициальный API, лучше парсить):

import requests
from bs4 import BeautifulSoup

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

# Ручной поиск вручную часто проще

Этап 5: Сопоставление версий ПО с CPE для точного поиска

Чтобы искать CVE, лучше преобразовать название и версию в CPE-формат. Это повышает точность.

Сервис CPE Dictionary (NVD):

  • https://nvd.nist.gov/products/cpe/search
  • API: https://services.nvd.nist.gov/rest/json/cpes/2.0?keyword=nginx

Автоматическое определение CPE через cpe-guesser (исследовательский):

def guess_cpe(product, version):
    # упрощённый пример
    product_lower = product.lower()
    if product_lower == 'nginx':
        return f"cpe:2.3:a:nginx:nginx:{version}:*:*:*:*:*:*:*"
    elif product_lower == 'wordpress':
        return f"cpe:2.3:a:wordpress:wordpress:{version}:*:*:*:*:*:*:*"
    # ...
    return None

Этап 6: Анализ CVSS (критичность уязвимости)

Каждому CVE присваивается оценка CVSS. Чем выше, тем критичнее.

CVSS v3 шкала:

Вектор CVSS (пример): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H означает: сетевой доступ, низкая сложность, не требуется привилегий, полное воздействие на конфиденциальность, целостность и доступность.

Где брать CVSS: NVD, Vulners, некоторые API.

Этап 7: Автоматизированный сбор уязвимостей для всех технологий стека

Комбинируем результаты предыдущих статей (технологический стек) с базами уязвимостей.

Python-скрипт для массовой проверки (на основе данных из Wappalyzer, BuiltWith):

import requests
import time
import json

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

# Пример для nginx 1.18.0
cves = get_cves_from_nvd("nginx 1.18.0")
for cve in cves:
    print(f"{cve['id']} (CVSS {cve['cvss_score']})")

NVD API имеет rate limit (без ключа ~5 запросов в 30 секунд). Используйте ключ или библиотеку с задержками.

Этап 8: Поиск уязвимостей в WordPress плагинах и темах

WordPress — особая категория: уязвимости часто связаны с плагинами и темами, а не с ядром.

Базы для WordPress:

  • WPScan Vulnerability Database: https://wpscan.com/api (есть бесплатный API с ограничениями).
  • Patchstack: https://patchstack.com/database/

Пример поиска через WPScan API:

def check_wpscan_plugin(plugin_slug):
    url = f"https://wpscan.com/api/v3/plugins/{plugin_slug}"
    response = requests.get(url)
    if response.status_code == 200:
        data = response.json()
        return data.get('vulnerabilities', [])
    return []

Этап 9: Анализ базы Known Exploited Vulnerabilities (CISA KEV)

CISA ведёт список активно эксплуатируемых уязвимостей (KEV). Если CVE есть в этом списке, оно представляет большую угрозу.

API KEV: https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json

def is_in_kev(cve_id):
    url = "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"
    resp = requests.get(url)
    if resp.status_code == 200:
        data = resp.json()
        for item in data['vulnerabilities']:
            if item['cveID'] == cve_id:
                return True
    return False

Этап 10: Составление отчёта об уязвимостях

Для каждой версии ПО, найденной на цели, следует создать таблицу:

Суммировать количество критических уязвимостей, наличие эксплойтов, попадание в KEV.

Практический пример: оценка рисков для веб-сервера цели

Задача: для сервера nginx 1.18.0 + PHP 7.4.33 найти известные уязвимости.

  1. Поиск через Vulners:
    • nginx 1.18.0: 3 CVE, все с CVSS ниже 6.0. Эксплойтов нет.
    • PHP 7.4.33: 12 CVE, из них 4 с CVSS > 7.0. Один эксплойт в Metasploit.
  2. Проверка CISA KEV: PHP 7.4.33 не в списке KEV.
  3. Вывод: основной риск — уязвимости PHP (особенно CVE-2022-31628, позволяющая удалённое выполнение кода). Рекомендуется обновить PHP до 8.x.
  • Поиск уязвимостей в открытых базах данных легален.
  • Запуск эксплойтов на целевой системе без разрешения — уголовное преступление.
  • Обнаруженную уязвимость следует сообщить владельцу системы через программы Bug Bounty или координаторы (CERT).
  • Не следует тестировать эксплойты на чужих системах.

Поиск уязвимостей по версиям ПО — неотъемлемая часть технического OSINT. Базы CVE, NVD, Vulners, Exploit-DB и CISA KEV дают исследователю возможность оценить поверхность атаки, не прибегая к активным сканерам уязвимостей. Сопоставление версий из предыдущих статей (технологический стек, версии ПО, заголовки) с уязвимостями позволяет построить рейтинг рисков и определить приоритет для дальнейшего тестирования.