Поиск уязвимостей через открытые источники: базы 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: Поиск CVE по названию продукта и версии
Самый простой способ — использовать поисковые системы по CVE с фильтрацией.
https://nvd.nist.gov/vuln/search/results?query=nginx&results_type=overview
Поиск с версией в NVD (сложно): NVD не всегда индексирует версии, лучше использовать Vulners.
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)
Наличие эксплойта повышает вероятность того, что уязвимость будет использована.
- Поиск по продукту и версии:
https://www.exploit-db.com/search?q=nginx+1.18.0 - Можно скачать готовый код (на свой страх и риск).
Rapid7 DB (Metasploit modules):
Пример автоматизации через 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-формат. Это повышает точность.
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 (пример): 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 — особая категория: уязвимости часто связаны с плагинами и темами, а не с ядром.
- 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 найти известные уязвимости.
- Поиск через Vulners:
- nginx 1.18.0: 3 CVE, все с CVSS ниже 6.0. Эксплойтов нет.
- PHP 7.4.33: 12 CVE, из них 4 с CVSS > 7.0. Один эксплойт в Metasploit.
- Проверка CISA KEV: PHP 7.4.33 не в списке KEV.
- Вывод: основной риск — уязвимости PHP (особенно CVE-2022-31628, позволяющая удалённое выполнение кода). Рекомендуется обновить PHP до 8.x.
- Поиск уязвимостей в открытых базах данных легален.
- Запуск эксплойтов на целевой системе без разрешения — уголовное преступление.
- Обнаруженную уязвимость следует сообщить владельцу системы через программы Bug Bounty или координаторы (CERT).
- Не следует тестировать эксплойты на чужих системах.
Поиск уязвимостей по версиям ПО — неотъемлемая часть технического OSINT. Базы CVE, NVD, Vulners, Exploit-DB и CISA KEV дают исследователю возможность оценить поверхность атаки, не прибегая к активным сканерам уязвимостей. Сопоставление версий из предыдущих статей (технологический стек, версии ПО, заголовки) с уязвимостями позволяет построить рейтинг рисков и определить приоритет для дальнейшего тестирования.