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

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

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

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

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

Категории

Все категории
Loading categories
community-id-spec — Открытый стандарт для хеширования сетевых потоков в идентификаторы, также известный как «Community IDs». | Kitploit
Инструменты/GitHubGitHub/corelight/community-id-spec
Сетевая безопасностьЦифровая криминалистикаУтилиты и фреймворкиРазведка угрозОбнаружение ВторженийРеагирование на ИнцидентыАнализ Журналов
GitHubcorelight/community-id-spec

community-id-spec

Открытый стандарт для хеширования сетевых потоков в идентификаторы, также известный как «Community IDs».

Репозиторий
196251 год назадПроверено Kitploit

Популярное

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

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

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

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

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

Хеширование потоков Community ID

При обработке данных о потоках из различных приложений мониторинга (таких как Zeek и Suricata) часто бывает желательно быстро переключаться с одного набора данных на другой. Хотя необходимая информация о кортеже потока обычно присутствует в наборах данных, детали таких «соединений» могут быть утомительными, особенно в крайних случаях. Данная спецификация описывает хеширование потоков «Community ID», стандартизируя создание строкового идентификатора, представляющего заданный сетевой поток, чтобы свести переключение к простому сравнению строк.

Псевдокод

root@kitploit:~
function community_id_v1(ipaddr saddr, ipaddr daddr, port sport, port dport, int proto, int seed=0)
{
    # Get seed and all tuple parts into network byte order
    seed = pack_to_nbo(seed); # 2 bytes
    saddr = pack_to_nbo(saddr); # 4 or 16 bytes
    daddr = pack_to_nbo(daddr); # 4 or 16 bytes
    sport = pack_to_nbo(sport); # 2 bytes
    dport = pack_to_nbo(dport); # 2 bytes

    # Abstract away directionality: flip the endpoints as needed
    # so the smaller IP:port tuple comes first.
    saddr, daddr, sport, dport = order_endpoints(saddr, daddr, sport, dport);

    # Produce 20-byte SHA1 digest. "." means concatenation. The
    # proto value is one byte in length and followed by a 0 byte
    # for padding.
    sha1_digest = sha1(seed . saddr . daddr . proto . 0 . sport . dport)

    # Prepend version string to base64 rendering of the digest.
    # v1 is currently the only one available.
    return "1:" + base64(sha1_digest)
}

function community_id_icmp(ipaddr saddr, ipaddr daddr, int type, int code, int seed=0)
{
    port sport, dport;

    # ICMP / ICMPv6 endpoint mapping directly inspired by Zeek
    sport, dport = map_icmp_to_ports(type, code);

    # ICMP is IP protocol 1, ICMPv6 would be 58
    return community_id_v1(saddr, daddr, sport, dport, 1, seed); 
}

Технические детали

  • Community ID — это дополнительный идентификатор потока, и он не заменяет существующие механизмы идентификации потоков, уже поддерживаемые мониторами. Однако при желании монитор можно настроить так, чтобы он регистрировал только Community ID.

  • Community ID может вычисляться по мере того, как монитор генерирует потоки, или может быть добавлен к существующим записям потоков на более позднем этапе, при условии, что эти записи содержат всю необходимую информацию о конечных точках потока.

  • Коллизии в Community ID, хотя и нежелательны, не считаются фатальными, поскольку у пользователя всё равно должны быть информация о времени потоков и, возможно, собственный механизм идентификации монитора (надеюсь, более сильный, чем Community ID) для устранения неоднозначности.

  • Механизм хеширования использует начальное значение (seed) для обеспечения дополнительного контроля над «доменами» использования Community ID. По умолчанию seed равен 0, поэтому этот механизм не мешает и не влияет на работу операторов, которым он неинтересен.

  • В версии 1 идентификатора алгоритмом хеширования является SHA1. Будущие версии хеширования могут изменить его или разрешить дополнительную настройку.

  • Двоичный 20-байтовый результат SHA1 кодируется в base64, чтобы уменьшить объём вывода по сравнению с обычным ASCII-представлением SHA1. Это предполагает, что основным ограничением является объём, а не время вычислений, и в более поздней версии это может стать настраиваемым.

  • Итоговый идентификатор потока включает номер версии, чтобы явно обозначить базовую реализацию Community ID. Это позволяет пользователям быть уверенными, что они сравнивают сопоставимые значения, и при этом допускает будущие изменения алгоритма. Например, когда версия идентификатора одного монитора включает VLAN ID, а другого — нет, сравнение хеш-значений должно надёжно давать отрицательный результат. Более сложная форма этой функции могла бы позволить фиксировать параметры конфигурации в дополнение к версии реализации.

    Схема версионирования в настоящее время просто добавляет префикс «:» к хеш-значению, что в текущей версии 1 даёт нечто вроде:

    1:hO+sN4H+MG5MY/8hIrXPqc4ZQz0=

  • Входные данные хеша выровнены по 32-битным границам. Компоненты кортежа потока используют сетевой порядок байтов (big-endian) для стандартизации порядка независимо от аппаратного обеспечения хоста.

  • Входные данные хеша упорядочиваются для устранения направленности кортежа потока: при необходимости конечные точки меняются местами, чтобы численно меньший кортеж IP:порт шёл первым. Если IP-адреса равны, решают порты. Например, следующие 5-кортежи netflow создают идентичные хеши Community ID, поскольку оба упорядочиваются в последовательность 10.0.0.1, 127.0.0.1, 1234, 80.

Эталонная реализация

Полная реализация доступна в пакете pycommunityid. Он включает ряд тестов для проверки корректности вычислений для различных протоколов. Мы рекомендуем его в качестве ориентира для новых реализаций.

Меньшая по объёму реализация также доступна через скрипт community-id.py в этом репозитории, включая байтовую схему хешируемых значений (см. packet_get_comm_id()). Чтобы начать, обратитесь к --help и make.sh:

root@kitploit:~
  $ ./community-id.py --help
  usage: community-id.py [-h] [--seed NUM] PCAP [PCAP ...]

  Community flow ID reference

  positional arguments:
    PCAP         PCAP packet capture files

  optional arguments:
    -h, --help   show this help message and exit
    --seed NUM   Seed value for hash operations
    --no-base64  Don't base64-encode the SHA1 binary value
    --verbose    Show verbose output on stderr

Для устранения неполадок реализация поддерживает отключение операции base64 и может предоставить дополнительные сведения о точной последовательности байтов, поступающих в вычисление хеша SHA1.

Эталонные данные

Каталог baseline в этом репозитории содержит наборы данных, которые помогут вам проверить, что ваша реализация Community ID работает корректно.

Переиспользуемые модули/библиотеки

  • C
    • https://github.com/corelight/c-community-id
    • https://github.com/ntop/nDPI (3.2+, подробности здесь)
  • C#: https://github.com/decompile/community-id-dotnet-core
  • Golang: https://github.com/satta/gommunityid
  • Java: https://github.com/rapid7/community-id-java
  • JavaScript: https://github.com/corelight/communityid-js
  • Python: https://github.com/corelight/pycommunityid
  • Rust: https://crates.io/crates/communityid

Продакшн-реализации

  • Arkime (1.7.0+): https://github.com/arkime/arkime/issues/966
  • Elastic Beats: например, https://www.elastic.co/guide/en/beats/packetbeat/master/community-id.html
  • Elastic Common Schema: https://github.com/elastic/ecs/blob/master/schemas/network.yml
  • Elasticsearch (7.12.0+): https://www.elastic.co/guide/en/elasticsearch/reference/master/community-id-processor.html
  • HELK: https://github.com/Cyb3rWard0g/HELK (с реализацией на Ruby)
  • LogScale/Humio: https://library.humio.com/falcon-logscale/functions-communityid.html
  • MISP: https://www.misp-project.org/2019/07/19/MISP.2.4.111.released.html
  • MISP-wireshark: https://github.com/MISP/misp-wireshark
  • Osquery (4.2.0+): https://osquery.readthedocs.io/en/latest/introduction/sql/#sql-additions, запись в блоге
  • Qosmos ixEngine: https://www.qosmos.com/wp-content/uploads/Enea-Qosmos-ixEngine-Suricata-Solution-Brief-20211202.pdf
  • Security Onion (2.0+): https://docs.securityonion.net/en/2.3/community-id.html
  • Suricata (4.1+): https://suricata.readthedocs.io/en/suricata-4.1.2/output/eve/eve-json-output.html#community-flow-id
  • VAST: https://github.com/vast-io/vast/pull/525

Запросы функций в других проектах

  • https://github.com/MicrosoftDocs/sysinternals/issues/219

Доклады

  • SuriCon 2018
  • FOSDEM 2021

Записи в блогах и другие ресурсы

  • Примеры захватов для QUIC, DoH, CommunityID, WPA3 и других протоколов в CloudShark 3.10, qacafe.com
  • Корреляция сетевых подключений с community ID в osquery, fleetdm.com
  • Генерация CommunityIDs с помощью Sysmon и Winlogbeat, holdmybeersecurity.com

Обсуждение

Не стесняйтесь обсуждать аспекты Community ID через GitHub здесь: https://github.com/corelight/community-id-spec/issues

Скачать инструмент
  • Proto: TCP; SRC IP: 10.0.0.1; DST IP: 127.0.0.1; SRC Port: 1234; DST Port: 80
  • Proto: TCP; SRC IP: 127.0.0.1; DST IP: 10.0.0.1; SRC Port: 80; DST Port: 1234
  • Эта версия включает следующие протоколы и поля:

    • TCP / UDP / SCTP:

      IP src / IP dst / IP proto / source port / dest port

    • ICMPv4 / ICMPv6:

      IP src / IP dst / IP proto / ICMP type + "counter-type" or code

      Точная обработка типа и кода ICMP взята из Zeek; см. реализации здесь:

      • https://github.com/corelight/pycommunityid/blob/master/communityid/icmp.py
      • https://github.com/corelight/pycommunityid/blob/master/communityid/icmp6.py
      • https://github.com/zeek/zeek/blob/master/src/analyzer/protocol/icmp/ICMP.cc#L860
    • Другие протоколы, переносимые через IP:

      IP src / IP dst / IP proto

    Вышеописанное в настоящее время не охватывает обработку вложенности (IP в IP, v6 поверх v4 и т.д.), а также инкапсуляций, таких как VLAN и MPLS.

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

  • Считайте v1 прототипом. Мы очень ценим отзывы сообщества, особенно разработчиков реализаций и операционных пользователей идентификатора. Пожалуйста, создавайте issues непосредственно в проекте GitHub по адресу https://github.com/corelight/community-id-spec или свяжитесь с Christian Kreibich ([email protected]).

  • Большое спасибо за полезные обсуждения и отзывы Victor Julien, Johanna Amann и Robin Sommer, а также всем разработчикам реализаций и сторонникам.

  • Wireshark (3.3.1+): https://www.wireshark.org/news/20201001.html
  • Zeek package (2.5+): https://github.com/corelight/zeek-community-id
  • ntopng: https://github.com/ntop/ntopng