
Рейтинг сетевых устройств на основе ИИ, управляемый контекстом

Батэа — это большой мелкий поднос из дерева или железа, традиционно используемый золотоискателями для промывки песка и гравия с целью извлечения золотых самородков.
Batea — это контекстно-ориентированная система ранжирования сетевых устройств, основанная на семействе алгоритмов машинного обучения для обнаружения аномалий. Цель Batea — позволить командам безопасности автоматически фильтровать интересные сетевые активы в больших сетях, используя отчёты nmap. Мы называем их Gold Nuggets.
Для получения дополнительной информации о Gold Nuggeting и научной основе Batea ознакомьтесь с нашей технической документацией здесь.
Batea строит числовое представление (numpy) всех устройств из ваших отчётов nmap (XML), а затем применяет методы обнаружения аномалий для выявления золотых самородков. Система легко расширяется путём добавления специфических признаков (features) — интересных характеристик — в числовое представление элементов сети.
Числовое представление сети строится с использованием признаков, вдохновлённых опытом сообщества специалистов по безопасности. Эти признаки действуют как элементы интуиции, а методы обучения без учителя (unsupervised) позволяют использовать контекст сетевого актива (полное описание сети) в качестве центрального строительного блока алгоритма ранжирования. Используемый алгоритм — Isolation Forest (https://en.wikipedia.org/wiki/Isolation_forest).
Модели машинного обучения являются сердцем Batea. Модели — это алгоритмы, обученные на всём наборе данных и используемые для предсказания оценки для тех же (и других) точек данных (сетевых устройств). Batea также поддерживает сохранение моделей, что позволяет повторно использовать предварительно обученные модели и экспортировать модели, обученные на больших наборах данных, для дальнейшего использования.
# Полная информация
$ sudo nmap -A 192.168.0.0/16 -oX output.xml
# Частичная информация
$ sudo nmap -O -sV 192.168.0.0/16 -oX output.xml
$ batea -v output.xml
$ git clone [email protected]:delvelabs/batea.git
$ cd batea
$ python3 setup.py sdist
$ pip3 install -r requirements.txt
$ pip3 install -e .
$ git clone [email protected]:delvelabs/batea.git
$ cd batea
$ python3 -m venv batea/
$ source batea/bin/activate
$ python3 setup.py sdist
$ pip3 install -r requirements-dev.txt
$ pip3 install -e .
$ pytest
# Простое использование (вывод топ-5 золотых самородков в формате по умолчанию)
$ batea nmap_report.xml
# Вывод топ-3
$ batea -n 3 nmap_report.xml
# Вывод всех активов
$ batea -A nmap_report.xml
# Использование нескольких входных файлов
$ batea -A nmap_report1.xml nmap_report2.xml
# Использование масок (по умолчанию xsl)
$ batea ./nmap*.xml
$ batea -f csv ./assets*.csv
# Можно использовать Batea с предварительно обученными моделями и экспортировать обученные модели.
# Обучение, вывод и сохранение модели для повторного использования
$ batea -D mymodel.batea nmap_report.xml
# Использование предварительно обученной модели
$ batea -L mymodel.batea nmap_report.xml
# Использование предварительно отформатированного CSV вместе с XML-файлами
$ batea -x nmap_report.xml -c portscan_data.csv
# Настройка уровня подробности вывода
$ batea -vv nmap_report.xml
Batea работает путём присвоения числовых признаков каждому хосту в отчёте (или серии отчётов). Хосты — это объекты Python, производные от отчёта nmap. Они состоят из следующего списка атрибутов: [ipv4, hostname, os_info, ports], где ports — это список объектов порта. Каждый порт имеет следующий набор атрибутов: [port, protocol, state, service, software, version, cpe, scripts], все по умолчанию имеют значение None.
Признаки — это объекты, наследующие от класса FeatureBase и реализующие специфический метод _transform. Этот метод всегда принимает список всех хостов в качестве входных данных и возвращает лямбда-функцию, которая отображает каждый хост в столбец numpy с числовыми значениями (порядок хостов сохраняется). Затем столбец добавляется к матричному представлению отчёта. Признаки должны выдавать правильные числовые значения (float или int) и ничего больше.
Большинство преобразований признаков реализуются с помощью простой лямбда-функции. Убедитесь, что для каждого хоста задано числовое значение по умолчанию для обеспечения совместимости моделей.
Пример:
class CustomInterestingPorts(FeatureBase):
def __init__(self):
super().__init__(name="some_custom_interesting_ports")
def _transform(self, hosts):
"""Этот метод принимает список хостов и возвращает функцию, которая подсчитывает количество
портов хоста, входящих в предопределённый список «интересных» портов; по умолчанию возвращает 0.
Parameters
----------
hosts : list
Список всех хостов
Returns
-------
f : lambda function
Подсчитывает количество портов из определённого списка.
"""
member_ports = [21, 22, 25, 8080, 8081, 1234]
f = lambda host: len([port for port in host.ports if port.port in member_ports])
return f
Затем вы можете добавить признак в отчёт с помощью метода NmapReport.add_feature в batea/__init__.py
from .features.basic_features import CustomInterestingPorts
def build_report():
report = NmapReport()
#[...]
report.add_feature(CustomInterestingPorts())
return report
Можно использовать предварительно обработанные данные для обучения модели или для предсказания. Данные должны быть проиндексированы по (ipv4, port) с уникальной комбинацией в каждой строке. Тип данных должен быть близок к тому, что вы ожидаете от XML-версии отчёта nmap. Столбец должен иметь одно из следующих имён, но не обязательно использовать все. Парсер по умолчанию присваивает значения null, если столбец отсутствует.
'ipv4',
'hostname',
'os_name',
'port',
'state',
'protocol',
'service',
'software_banner',
'version',
'cpe',
'other_info'
Пример:
ipv4,hostname,os_name,port,state,protocol,service,software_banner
10.251.53.100,internal.delvesecurity.com,Linux,110,open,tcp,rpcbind,"program version port/proto service100000 2,3,4 111/tcp rpcbind100000 2,3,4 "
10.251.53.100,internal.delvesecurity.com,Linux,111,open,tcp,rpcbind,
10.251.53.188,serious.delvesecurity.com,Linux,6000,open,tcp,X11,"X11Probe: CentOS"
Для тех, кто занимается анализом данных, или просто ради интереса и пользы, вы можете вывести числовую матрицу вместе со столбцом оценки вместо обычного вывода. Это может быть полезно для дальнейшего анализа данных и отладки.
$ batea -oM network_matrix nmap_report.xml