
Basado en IA y impulsado por contexto, clasificación de dispositivos de red

Una batea es una bandeja grande y poco profunda de madera o hierro utilizada tradicionalmente por los buscadores de oro para lavar arena y grava y recuperar pepitas de oro.
Batea es un marco de clasificación de dispositivos de red basado en contexto que utiliza la familia de algoritmos de aprendizaje automático de detección de anomalías. El objetivo de Batea es permitir que los equipos de seguridad filtren automáticamente activos de red interesantes en redes grandes utilizando informes de escaneo nmap. A esos los llamamos Pepitas de Oro.
Para más información sobre la búsqueda de Pepitas de Oro y la ciencia detrás de Batea, consulte nuestro documento técnico aquí
Batea construye una representación numérica (numpy) de todos los dispositivos a partir de sus informes nmap (XML) y luego aplica métodos de detección de anomalías para descubrir las pepitas de oro. Es fácilmente extensible añadiendo características específicas, o características interesantes, a la representación numérica de los elementos de la red.
La representación numérica de la red se construye utilizando características, que están inspiradas en la experiencia de la comunidad de seguridad. Las características actúan como elementos de intuición, y los métodos de detección de anomalías no supervisados permiten que el contexto del activo de red, o la descripción total de la red, se utilice como el bloque central del algoritmo de clasificación. El algoritmo exacto utilizado es Isolation Forest (https://en.wikipedia.org/wiki/Isolation_forest)
Los modelos de aprendizaje automático son el corazón de Batea. Los modelos son algoritmos entrenados en todo el conjunto de datos y utilizados para predecir una puntuación sobre los mismos (y otros) puntos de datos (dispositivos de red). Batea también permite la persistencia de modelos. Es decir, puede reutilizar modelos preentrenados y exportar modelos entrenados en grandes conjuntos de datos para su 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
Batea funciona asignando características numéricas a cada host en el informe (o serie de informes). Los hosts son objetos de Python derivados del informe nmap. Consisten en la siguiente lista de atributos: [ipv4, hostname, os_info, ports] donde ports es una lista de objetos puerto. Cada puerto tiene la siguiente lista de atributos: [port, protocol, state, service, software, version, cpe, scripts], todos con valor predeterminado None.
Las características son objetos que heredan de la clase FeatureBase e instancian un método _transform específico. Este método siempre toma la lista de todos los hosts como entrada y devuelve una función lambda que asigna cada host a una columna numpy de valores numéricos (se conserva el orden de los hosts). La columna se añade entonces a la representación matricial del informe. Las características deben generar valores numéricos correctos (floats o enteros) y nada más.
La mayoría de las transformaciones de características se implementan utilizando una función lambda simple. Solo asegúrese de asignar un valor numérico a cada host para la compatibilidad del modelo.
Ejemplo:
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
Luego puede añadir la característica al informe utilizando el método NmapReport.add_feature en batea/__init__.py
from .features.basic_features import CustomInterestingPorts
def build_report():
report = NmapReport()
#[...]
report.add_feature(CustomInterestingPorts())
return report
Es posible utilizar datos preprocesados para entrenar el modelo o para la predicción. Los datos deben estar indexados por (ipv4, port) con una combinación única por fila. El tipo de datos debe ser similar a lo que espera de la versión XML de un informe nmap. Una columna debe usar uno de los siguientes nombres, pero no tiene que usar todos. El analizador asigna valores nulos si una columna está ausente.
'ipv4',
'hostname',
'os_name',
'port',
'state',
'protocol',
'service',
'software_banner',
'version',
'cpe',
'other_info'
Ejemplo:
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 el científico de datos que llevas dentro, o simplemente por diversión y beneficio, puede generar la matriz numérica junto con la columna de puntuación en lugar de la salida habitual. Esto puede ser útil para análisis de datos adicionales y fines de depuración.
$ batea -oM network_matrix nmap_report.xml