Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
badBANANA-threat-observatory — Обсерватория threat intelligence, агрегирующая потоки данных CISA KEV, ThreatFox, URLhaus и MalwareBazaar, с поиском, отслеживанием изменений и экспортом в STIX/CSV/JSONL. | Kitploit
Инструменты/GitLabGitLab/gnomeman/badbanana-threat-observatory
Оборонительные ИнструментыУправление индикаторами компрометации (IOC)OSINT (Разведка открытых источников)Фиды и агрегаторы угрозАнализ уязвимостейСбор информацииРазведка угроз
GitLabgnomeman/badbanana-threat-observatory

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

badBANANA-threat-observatory

Обсерватория threat intelligence, агрегирующая потоки данных CISA KEV, ThreatFox, URLhaus и MalwareBazaar, с поиском, отслеживанием изменений и экспортом в STIX/CSV/JSONL.

РепозиторийСайт
7 ч 34 мин назадЕщё не проверено

badBANANA // ОБСЕРВАТОРИЯ УГРОЗ

Глаз обсерватории badBANANA

Система наблюдения за угрозами, основанная на доказательствах (evidence-first), которая хранит текущее состояние источников, события материальных изменений и операционную телеметрию выборки в семантически раздельном виде. Отсутствующие, устаревшие, отключённые или недоступные данные остаются наглядно отсутствующими. Интерфейс никогда не подставляет демонстрационные записи или предполагаемую атрибуцию.

Текущий релиз ужесточает обработку дат доказательств и состояния подтверждения на устройстве, делает все важные ошибки чтения наглядно отличимыми от успешных нулевых состояний, стабилизирует корреляционные запросы, а также усиливает панель доказательств, ограниченные фильтры расследования, интерпретацию источников, мобильное управление и учёт экспорта. Каждая анимированная метка воспроизведения по-прежнему соответствует сохранённому событию NEW, UPDATED или REMOVED; это не декоративный сетевой трафик.

Продакшн-представления

Представление связей Pulse обсерватории угроз badBANANA

Pulse — связи между источниками, работоспособность источников и анализ текущего состояния.

Повтор переходов Replay обсерватории угроз badBANANA

Replay — ограниченная страницей реконструкция сохранённых переходов NEW, UPDATED и REMOVED.

Дополнительные живые поверхности включают приблизительную географию публичной IP-инфраструктуры и собственные представления доказательств URLhaus / MalwareBazaar. Эти поверхности намеренно не представлены плейсхолдерами или дублирующими скриншотами в этом README.

Продакшн-снимки — это скриншоты с живой Обсерватории v1.2.0, сохраняющие исходные данные. Они обрезаны и изменены по размеру/сжаты для презентации; отображаемые доказательства, временные метки, счётчики, значения IOC и состояния интерфейса не регенерируются и не заменяются.

Рабочее развёртывание

  • Продакшн: https://badbanana-threat-observatory.badbanana6969.workers.dev
  • Текущий исходный код: https://github.com/GnomeMan4201/badBANANA-threat-observatory/tree/main
  • Замороженный исходный код v1.2.0: https://github.com/GnomeMan4201/badBANANA-threat-observatory/tree/release/v1.2.0

Продакшн-Worker работает на базе Cloudflare D1. Учётные данные каналов остаются серверными секретами Cloudflare Worker и никогда не требуются в браузере.

Статус релиза

  • Версия: 1.2.0
  • Среда выполнения: Node.js 22.13.0 или новее
  • Развёртывание: Next.js на Cloudflare Workers через vinext и плагин Cloudflare Vite
  • Постоянное хранение: Cloudflare D1 с явно обозначенной деградацией до памяти изолята
  • Аудит зависимостей продакшена: принудительно в CI на высоком уровне серьёзности

Режим приёма данных

Это развёртывание работает в режиме demand-driven. Репозиторий теперь нацелен напрямую на стандартные Cloudflare Workers; плановые триггеры намеренно не включены в v1.2.0, поэтому приложение не заявляет о непрерывном сборе данных. Будущий планировщик сможет вызывать ту же операцию runIngestionCycle() после отдельной проверки корректности и операционной верификации.

Браузер отправляет явный ограниченный запрос обслуживания при первом использовании и каждые пять минут, пока открыт:

root@kitploit:~
POST /api/ingest
        ↓
runIngestionCycle()
        ↓
configuration → TTL → backoff → D1 lease → fetch → normalize → validate
        ↓
snapshot cache + current observations + material events + cycle statistics

Обычные чтения раздельны и локальны:

root@kitploit:~
GET /api/observations → D1 current state, scoped before pagination
GET /api/search       → D1 current state, scoped before pagination
GET /api/kev          → D1 current CISA catalog
GET /api/events       → D1 material change ledger
GET /api/geo          → local observations + bounded cached IP enrichment

Ни один из этих GET-маршрутов не вызывает адаптер источника. Если этот проект позже получит реально поддерживаемый планировщик, он сможет вызывать ту же операцию runIngestionCycle() без создания второй реализации обновления.

Охват источников

Охват отображается для каждого источника. Ограниченные API никогда не представляются как полные каталоги.

Модель хранения

Привязка DB владеет отдельными наборами данных:

  • threat_source_cache и threat_source_cache_chunks: последний проверенный снимок по каждому источнику, хранящийся в чанках с ключом поколения.
  • observations: последнее нормализованное текущее состояние по каждой стабильной идентичности источника. Оно сохраняет первичный приём, последнее наблюдение источника, последнее материальное изменение, текущий хэш, количество ревизий и последний результат приёма.
  • observation_events: значимые события-доказательства NEW, UPDATED и обоснованные REMOVED. Предыдущие и текущие нормализованные полезные нагрузки, хэши и детерминированные диффы полей делают предыдущие состояния реконструируемыми.
  • source_fetch_log: ограниченная телеметрия попыток выборки без тел ответов или учётных данных.
  • source_ingest_cycles: ограниченные счётчики по каждому обновлению для полученных, валидных, отклонённых, новых, обновлённых, неизменённых и удалённых записей.
  • source_refresh_lease: краткосрочные аренды на базе D1 для каждого источника, предотвращающие дублирование обновлений вышестоящих источников одновременными изолятами.

Определения схемы времени выполнения находятся в db/schema.ts. Инициализация добавляет новые столбцы текущего состояния в существующую таблицу observations перед созданием зависимых индексов.

Семантика состояния и хранения

Эти вопросы намеренно различны:

  1. Что источник говорит сейчас? На это отвечают observations и проверенный снимок источника.
  2. Что badBANANA наблюдала в течение этого окна времени источника? /api/observations?window=... фильтрует текущие наблюдения по вышестоящему observedAt.
  3. Что изменилось между наблюдениями? На это отвечают observation_events и /api/revisions.

Текущее состояние не выдаётся за семидневную таблицу истории. Журнал материальных событий хранится семь дней. Телеметрия выборки и циклов хранится два дня и ограничена 200 строками на источник. Текущие наблюдения, не относящиеся к каталогу и не появлявшиеся в течение семи дней, удаляются. CISA остаётся актуальной, потому что каждый успешный ответ — это полный каталог; строки, удалённые из этого каталога, остаются доступными в течение 30 дней до удаления. Только отсутствие в CISA в настоящее время может создать событие REMOVED, поскольку её адаптер получает полный актуальный каталог. Отсутствие в ограниченных результатах ThreatFox, URLhaus или MalwareBazaar не рассматривается как удаление.

Неизменённое наблюдение продвигает текущие lastObservedInSnapshotAt/lastIngestedAt, но не создаёт событие и не увеличивает revisionCount. lastChangedAt переживает последующие неизменённые наблюдения.

Рабочее пространство аналитика CISA

Представление Exploited разделяет:

  • Текущий каталог KEV: полное проверенное текущее состояние, независимое от временного окна панели.
  • Недавний KEV: записи, чей dateAdded CISA с точностью до дня попадает в явный диапазон TODAY, 7D или 30D. Окна Обсерватории с точностью меньше суток никогда не представляются как точность CISA.

Текущий каталог поддерживает серверный поиск, фильтры по вендору, продукту, недавно добавленным, причастности к программам-вымогателям, дате добавления и пагинацию на основе непрозрачного курсора. Он отображает CVE, вендора, продукт, название уязвимости, дату добавления, срок выполнения, причастность к программам-вымогателям и требуемое действие. Он не выдумывает оценки CVSS.

Журнал изменений и ревизии

Хэши содержимого покрывают нормализованные поля доказательств, а не служебные записи Обсерватории. Изменённый хэш создаёт событие UPDATED с предыдущей нормализованной полезной нагрузкой, новой нормализованной полезной нагрузкой, предыдущим/новым хэшами и детерминированным диффом по:

  • названию
  • семейству вредоносного ПО
  • типу угрозы
  • уверенности
  • первому/последнему наблюдению источника
  • тегам
  • ссылке
  • нормализованным ключам метаданных

Панель происхождения (provenance) запрашивает /api/revisions?id=... и раскрывает текущий хэш, последнее материальное изменение, количество ревизий, сохранённые события и диффы на уровне полей. Нестабильные временные метки приёма данных не появляются в диффах содержимого.

Панель также раскрывает версионированный след доказательств для каждой принятой записи: принятые нормализованные поля, необязательные поля, оставшиеся отсутствующими, преобразования только для отображения, основу классификации и основу стабильной идентичности. Этот след описывает только сохранённые доказательства. Отклонённые значения из вышестоящих источников не сохраняются и никогда не получают синтетические идентичности Обсерватории. Отклонения представлены отдельно как агрегированные счётчики по циклам с ограниченными кодами полей и причин; старые циклы, собранные до этой схемы, помечаются как не имеющие разбивки, а не реконструируются.

Раздел Recent Events показывает только материальные изменения. Он не порождает сотни неизменённых строк SEEN после полного обновления CISA. Эти наблюдения обобщаются в статистике циклов источников.

Локальная сводка на устройстве

Представление Briefing по умолчанию сравнивает сохранённый журнал материальных событий с версионированным курсором подтверждения, хранящимся только в текущем браузере. Первое использование и очищенное хранилище помечаются как исходный базовый уровень, а не как новая активность. Если сохранённый курсор предшествует сохранённому журналу, интерфейс сообщает, что полную дельту доказать невозможно.

Подтверждение никогда не изменяет и не удаляет серверные события. Курсор можно экспортировать и импортировать в виде JSON для намеренного переноса между устройствами; он не представлен как состояние, синхронизированное с учётной записью, и сгенерированный идентификатор устройства никогда не отправляется на сервер.

Итоги Briefing описывают текущую возвращённую страницу журнала и помечены как показанные/ограниченные страницей. Они не представлены как итоги по всему сохранённому журналу.

Импортированные временные метки подтверждения строго проверяются и приводятся к каноническому виду UTC ISO-8601 перед сохранением или сравнением. Хранилище браузера рассматривается как необязательное: заблокированное или неработающее локальное хранилище выдаёт компактную встроенную ошибку и никогда не приводит к сбою Briefing.

Экспорт, подчинённый политике

Рабочее пространство Export форматирует уже загруженную проверенную видимую страницу как CSV, JSONL, STIX 2.1, обезвреженный (defanged) текст или манифест доказательств, содержащий применённую политику и доступные хэши записей. Активный локальный поиск и охват источников переносятся в Export. Пустой список разрешённых источников экспортирует ноль записей. STIX представляет CVE из CISA как объекты Vulnerability, а проверенные хэши файлов — включая значения SHA-256 из MalwareBazaar — как объекты Indicator. Счётчики выбранных, выпущенных и неподдерживаемых записей различаются; неподдерживаемые записи раскрываются в метаданных пакета, а не молча отбрасываются. Export не выполняет никакого сбора из вышестоящих источников. Отсутствующая уверенность остаётся отсутствующей, меж-источниковые разногласия остаются отдельными записями, а удалённые события журнала никогда молча не попадают в экспорт текущего состояния. Эти артефакты — транспорты доказательств, а не рекомендации для блокировки на межсетевых экранах.

Backoff и конкурентность

Просроченные источники используют ограниченные задержки повторных попыток в 1, 2, 5, 15 и 30 минут. Действительный больший Retry-After уважается до одного часа. Во время backoff действительный предыдущий снимок обслуживается как устаревший; пустой неудачный источник остаётся офлайн.

Перед выборкой подходящий источник получает краткосрочную условную аренду D1. Другой изолят не может заменить держателя с неистёкшим сроком, поэтому выполняется только одно обновление. Если D1 недоступна, система явно сообщает о деградированном режиме только со снимками и аренде в памяти изолята; этот запасной вариант не описывается как распределённый.

Пагинация

Текущие наблюдения, рабочие пространства по источникам, локальный поиск, каталог CISA, материальные события и ревизии записей используют ограниченные серверные запросы с курсорами. Ограничения источника и типа применяются до сортировки и пагинации. Курсоры кодируют стабильный кортеж сортировки, проходят проверку длины/символов/схемы и при некорректном формате завершаются с ошибкой HTTP 400. Браузер никогда не получает полный семидневный набор данных только для локальной пагинации.

Безопасность ссылок и IOC

  • IOC-URL обезврежены (defanged) по умолчанию и никогда не отображаются как якоря.
  • Ссылки должны разбираться как HTTP или HTTPS.
  • Известные собственные страницы источников CISA и abuse.ch могут открываться обычным образом.
  • Произвольные сторонние HTTP(S) ссылки помечаются как внешние, отображают своё имя хоста и предлагают поведение только-копирования.
  • Октеты IPv4, структура IPv6, порты, домены, URL и хэши строго проверяются.
  • MalwareBazaar остаётся только-метаданными; никакие образцы не загружаются и не обслуживаются.
  • Все вышестоящие URL фиксируются на стороне сервера; никакой API не проксирует пользовательские пункты назначения.

Ограничение частоты запросов

Ограничитель API — это счётчик фиксированного окна в памяти, ограниченный изолятом Worker. Он точно описывается как защита уровня изолята с максимальными усилиями (best-effort), а не глобально авторитетное ограничение частоты Cloudflare. Обычные чтения ограничены 120 запросами в минуту на один сообщённый IP-адрес клиента; приём данных имеет отдельный сегмент на шесть запросов в минуту, а география — отдельный сегмент на двенадцать запросов в минуту. Записи D1 не добавляются к каждому чтению просто для завышения этой меры контроля.

API

  • POST /api/ingest — явный цикл обслуживания по требованию; учитывает TTL, backoff и аренды D1.
  • GET /api/observations?window=24h&scope=urlhaus&limit=100&cursor=... — страничное локальное окно текущего состояния; допустимые scope: all, urlhaus, malwarebazaar и infrastructure.
  • GET /api/search?q=indicator&window=24h&scope=urlhaus&limit=100&cursor=... — страничный ограниченный локальный поиск; ноль обращений к вышестоящим источникам.
  • GET /api/kev?limit=50&q=...&vendor=...&product=...&ransomware=known&addedSince=YYYY-MM-DD&cursor=... — полный актуальный каталог CISA.
  • GET /api/events?limit=50&cursor=... — журнал материальных событий.
  • GET /api/revisions?id=...&limit=50&cursor=... — текущая запись плюс сохранённые ревизии.
  • GET /api/correlations?id=... — одноранговые записи (peers) текущего состояния на уровне набора данных с точным совпадением индикатора.

Окружение и развёртывание

Локальная разработка Cloudflare читает серверные учётные данные из .dev.vars. Скопируйте .dev.vars.example в .dev.vars и заполните только те каналы, которые вы уполномочены использовать:

root@kitploit:~
THREATFOX_AUTH_KEY=
URLHAUS_AUTH_KEY=
MALWAREBAZAAR_AUTH_KEY=

Продакшн-учётные данные должны храниться как секреты Cloudflare Worker, никогда не фиксироваться в исходном коде и не быть переменными GitHub, доступными клиенту. Приложение обращается к ним только через поверхность привязок рантайма Workers. Они никогда не должны появляться в NEXT_PUBLIC_*, клиентских компонентах, HTML, логах, фикстурах или зафиксированных файлах.

Репозиторий нацелен напрямую на стандартные Cloudflare Workers. wrangler.jsonc — источник истины конфигурации Worker и объявляет черновую привязку D1 с именем DB. Wrangler 4 автоматически предоставляет этот ресурс D1 при первом аутентифицированном развёртывании и сохраняет привязку связанной при последующих развёртываниях. Никакой идентификатор D1, зависящий от учётной записи, не фиксируется.

Команды разработки и продакшена:

root@kitploit:~
npm ci
npm run dev
npm run build
npm run preview
# authenticated Cloudflare session / CI only
npm run deploy

Проверка GitHub Actions выполняется при каждом pull request и push в main. Продакшн-развёртывание намеренно ручное через workflow deploy production и требует секретов репозитория с именами CLOUDFLARE_API_TOKEN и CLOUDFLARE_ACCOUNT_ID. Это предотвращает автоматическую публикацию непроверенной ветки или неполной настройки учётных данных.

Проверка

root@kitploit:~
npm ci
npm audit --omit=dev --audit-level=high
npm audit --audit-level=high
npm test
npm run lint

npm test — поддерживаемая точка входа тестов: она выполняет полную продакшн-сборку перед детерминированным набором, чтобы проверка изоляции клиентских секретов на уровне артефактов могла инспектировать dist/client. Запуск node --test напрямую на чистом клоне намеренно пропускает этот требуемый артефакт сборки. Тесты покрывают строгий разбор календарных временных меток и меток подтверждения, необязательное хранилище устройства, стабильные корреляционные зависимости, нормализованные доказательства, каноническое хэширование тегов, создание материальных событий, повторный приём без изменений, сохранение предыдущих полезных нагрузок, устойчивость последнего изменения, диффы полей, хранение событий и пробелы в журнале, следы доказательств, политику экспорта пустых источников, целостность представления/счётчиков STIX, право на TTL/backoff, аренды обновления, серверную связку scope-до-пагинации, выделенные запросы GEO/Recent-KEV, проверку курсоров, изоляцию путей чтения, охват источников, политику внешних ссылок, точность ограничения частоты, изоляцию сбоев источников и изоляцию клиентских секретов.

Географическое обогащение

Режим GEO наносит на карту только проверенные наблюдения публичных IPv4/IPv6. Выделенный запрос D1 выбирает подходящие записи IP по запрошенному окну текущего состояния вместо повторного использования общей страницы наблюдений. Ответ сообщает итоговое количество записей-кандидатов и достигнут ли предел безопасности в 2 000 записей. Вызывающие не могут указать произвольные вышестоящие пункты назначения или списки IP. GeoJS — фиксированный основной провайдер, а FreeIPAPI — фиксированный запасной; произвольные вышестоящие URL невозможны. Приложение ограничивает внешнюю работу через лимит запросов в 12 адресов, кэш успехов D1 на 30 дней, кэш повторных попыток на пять минут и выделенный ограничитель маршрута. Каждая нанесённая точка сохраняет фактическое происхождение провайдера и может открыть свою нижележащую локальную запись.

Лицензия

Выпущено под лицензией MIT. См. LICENSE.

Выбор режима GEO приводит к тому, что сервер отправляет каждый проверенный кандидат публичного IP вместе с обычными метаданными HTTPS-запроса в GeoJS, а затем в FreeIPAPI, когда требуется запасной вариант. Эти провайдеры, таким образом, могут видеть, какие публичные адреса запрашиваются. Частные, зарезервированные, документационные и предоставленные клиентом адреса никогда не отправляются; режим связей не выполняет геолокационных запросов.

Рабочее пространство Replay реконструирует текущую страницу переходов журнала материальных событий в порядке времени обнаружения Обсерваторией. Движение NEW, UPDATED и REMOVED управляется исключительно сохранёнными событиями. Оно явно ограничено страницей и не заявляет о реконструкции полного исторического снимка или объёма сетевого трафика.

Пакет world-atlas, производный от Natural Earth, поставляет локальную базовую карту. Карта группирует в кластеры IP, находящиеся в одном месте, поддерживает детали при наведении и переход к происхождению по клику, а также сообщает счётчики геолоцированных, исключённых, недоступных и ожидающих. Частные, зарезервированные, документационные, многоадресные и иные непубличные диапазоны исключаются до любого вызова провайдера.

IP-геолокация явно представлена как приблизительное местоположение инфраструктуры. Это не местоположение субъекта, происхождение события, национальность, вывод о праве собственности или заявление об атрибуции. Неудачное обогащение остаётся отсутствующим; приложение никогда не генерирует замещающие координаты.

Визуализация по умолчанию остаётся интерактивным силовым полем (force-directed) из отдельных наблюдений, связанных с их источником и явно указанным семейством вредоносного ПО. Холст поддерживает перетаскивание узлов, панорамирование поля, масштабирование, анимированный трафик связей и прямой осмотр происхождения. GEO — отдельная поверхность доказательств со своей собственной семантикой происхождения и сбоев.

Скачать инструмент
ИсточникУчётные данныеTTLФактический охват
CISA KEVНет30 минутПолный актуальный проверенный каталог
ThreatFoxTHREATFOX_AUTH_KEY15 минутЗапрошенное 24-часовое окно IOC
URLhausURLHAUS_AUTH_KEY15 минутПоследние 500 записей, возвращённых конечной точкой recent
MalwareBazaarMALWAREBAZAAR_AUTH_KEY15 минутПоследние 100 записей метаданных, возвращённых конечной точкой
  • ingestion_runtime: последняя общая работоспособность цикла приёма данных.
  • geo_ip_cache: проверенные результаты приблизительной IP-геолокации и ограниченные записи отрицательного кэша. Успешные результаты истекают через 30 дней; неудачные поиски повторяются через пять минут. Просроченные строки D1 удаляются при возможности во время GEO-запросов, а запасной вариант изолята ограничен 2 000 записей.
  • GET /api/geo?window=24h — выбирает кандидатов только из проверенных локальных наблюдений публичных IP, извлекает не более 12 некэшированных результатов провайдера за запрос и возвращает кэшированные приблизительные точки WGS84 с происхождением.
  • GET /api/status — семантика источников, текущего состояния, свежести, режима приёма, цикла, аренд и ограничения частоты.