
Classificação de dispositivos de rede baseada em IA e orientada por contexto.

Uma batea é uma grande panela rasa de madeira ou ferro tradicionalmente usada por garimpeiros para lavar areia e cascalho a fim de recuperar pepitas de ouro.
Batea é um framework de classificação de dispositivos de rede orientado por contexto, baseado na família de algoritmos de aprendizado de máquina de detecção de anomalias. O objetivo do Batea é permitir que equipes de segurança filtrem automaticamente ativos de rede interessantes em grandes redes usando relatórios de varredura nmap. Chamamos esses de Pepitas de Ouro.
Para mais informações sobre Gold Nuggeting e a ciência por trás do Batea, confira nosso whitepaper aqui
O Batea funciona construindo uma representação numérica (numpy) de todos os dispositivos a partir dos seus relatórios nmap (XML) e, em seguida, aplicando métodos de detecção de anomalias para descobrir as pepitas de ouro. É facilmente extensível adicionando características específicas, ou atributos interessantes, à representação numérica dos elementos da rede.
A representação numérica da rede é construída usando características, que são inspiradas pela experiência da comunidade de segurança. As características atuam como elementos de intuição, e os métodos de detecção de anomalias não supervisionados permitem que o contexto do ativo de rede, ou a descrição total da rede, seja usado como o bloco central do algoritmo de classificação. O algoritmo exato usado é o Isolation Forest (https://en.wikipedia.org/wiki/Isolation_forest)
Os modelos de aprendizado de máquina são o coração do Batea. Modelos são algoritmos treinados em todo o conjunto de dados e usados para prever uma pontuação nos mesmos (e outros) pontos de dados (dispositivos de rede). O Batea também permite a persistência de modelos. Ou seja, você pode reutilizar modelos pré-treinados e exportar modelos treinados em grandes conjuntos de dados para uso posterior.
# Complete info
$ sudo nmap -A 192.168.0.0/16 -oX output.xml
# Partial info
$ 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
# simple use (output top 5 gold nuggets with default format)
$ batea nmap_report.xml
# Output top 3
$ batea -n 3 nmap_report.xml
# Output all assets
$ batea -A nmap_report.xml
# Using multiple input files
$ batea -A nmap_report1.xml nmap_report2.xml
# Using wildcards (default xsl)
$ batea ./nmap*.xml
$ batea -f csv ./assets*.csv
# You can use batea on pretrained models and export trained models.
# Training, output and dumping model for persistence
$ batea -D mymodel.batea nmap_report.xml
# Using pretrained model
$ batea -L mymodel.batea nmap_report.xml
# Using preformatted csv along with xml files
$ batea -x nmap_report.xml -c portscan_data.csv
# Adjust verbosity
$ batea -vv nmap_report.xml
O Batea funciona atribuindo características numéricas a cada host no relatório (ou série de relatórios). Hosts são objetos Python derivados do relatório nmap. Eles consistem na seguinte lista de atributos: [ipv4, hostname, os_info, ports] onde ports é uma lista de objetos de porta. Cada porta possui a seguinte lista de atributos: [port, protocol, state, service, software, version, cpe, scripts], todos com valor padrão None.
Características são objetos herdados da classe FeatureBase que instanciam um método específico _transform. Esse método sempre recebe a lista de todos os hosts como entrada e retorna uma função lambda que mapeia cada host para uma coluna numpy de valores numéricos (a ordem dos hosts é preservada). A coluna é então anexada à representação matricial do relatório. As características devem produzir valores numéricos corretos (floats ou inteiros) e nada mais.
A maioria das transformações de características é implementada usando uma função lambda simples. Apenas certifique-se de definir um valor numérico padrão para cada host para compatibilidade com o modelo.
Ex:
class CustomInterestingPorts(FeatureBase):
def __init__(self):
super().__init__(name="some_custom_interesting_ports")
def _transform(self, hosts):
"""This method takes a list of hosts and returns a function that counts the number
of host ports member from a predefined list of "interesting" ports, defaulting to 0.
Parameters
----------
hosts : list
The list of all hosts
Returns
-------
f : lambda function
Counts the number of ports in the defined list.
"""
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
Você pode então adicionar a característica ao relatório usando o método NmapReport.add_feature em batea/__init__.py
from .features.basic_features import CustomInterestingPorts
def build_report():
report = NmapReport()
#[...]
report.add_feature(CustomInterestingPorts())
return report
É possível usar dados pré-processados para treinar o modelo ou para predição. Os dados devem ser indexados por (ipv4, port) com uma combinação única por linha. O tipo de dados deve ser próximo ao que se espera da versão XML de um relatório nmap. Uma coluna deve usar um dos seguintes nomes, mas não é necessário usar todos. O analisador assume valores nulos se uma coluna estiver ausente.
'ipv4',
'hostname',
'os_name',
'port',
'state',
'protocol',
'service',
'software_banner',
'version',
'cpe',
'other_info'
Exemplo:
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"
Para o cientista de dados em você, ou apenas por diversão e lucro, você pode gerar a matriz numérica junto com a coluna de pontuação em vez da saída regular. Isso pode ser útil para análises de dados adicionais e fins de depuração.
$ batea -oM network_matrix nmap_report.xml