
KI-basiertes, kontextgesteuertes Ranking von Netzwerkgeräten

Eine Batea ist eine große, flache Pfanne aus Holz oder Eisen, die traditionell von Goldsuchern verwendet wird, um Sand und Kies zu waschen und Goldnuggets zu gewinnen.
Batea ist ein kontextgesteuertes Framework zur Bewertung von Netzwerkgeräten, das auf der Familie der Algorithmen zur Anomalieerkennung im maschinellen Lernen basiert. Das Ziel von Batea ist es, Sicherheitsteams zu ermöglichen, interessante Netzwerkressourcen in großen Netzwerken automatisch zu filtern, indem Nmap-Scanberichte verwendet werden. Wir nennen diese Gold Nuggets.
Weitere Informationen über Gold Nuggeting und die Wissenschaft hinter Batea finden Sie in unserem Whitepaper hier.
Batea funktioniert, indem es eine numerische Darstellung (numpy) aller Geräte aus Ihren Nmap-Berichten (XML) erstellt und dann Methoden zur Anomalieerkennung anwendet, um die Goldnuggets zu finden. Es ist leicht erweiterbar, indem spezifische Merkmale oder interessante Eigenschaften zur numerischen Darstellung der Netzwerkelemente hinzugefügt werden.
Die numerische Darstellung des Netzwerks wird mithilfe von Merkmalen (Features) erstellt, die von der Expertise der Sicherheitscommunity inspiriert sind. Die Merkmale fungieren als Elemente der Intuition, und die unüberwachten Anomalieerkennungsmethoden ermöglichen es, den Kontext des Netzwerkgeräts oder die vollständige Beschreibung des Netzwerks als zentralen Baustein des Bewertungsalgorithmus zu nutzen. Der verwendete Algorithmus ist Isolation Forest (https://en.wikipedia.org/wiki/Isolation_forest).
Modelle des maschinellen Lernens sind das Herzstück von Batea. Modelle sind Algorithmen, die auf dem gesamten Datensatz trainiert werden und verwendet werden, um einen Score für dieselben (und andere) Datenpunkte (Netzwerkgeräte) vorherzusagen. Batea ermöglicht auch die Persistenz von Modellen. Das bedeutet, Sie können vortrainierte Modelle wiederverwenden und auf großen Datensätzen trainierte Modelle zur weiteren Verwendung exportieren.
# 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 funktioniert, indem jedem Host im Bericht (oder in einer Reihe von Berichten) numerische Merkmale zugewiesen werden. Hosts sind Python-Objekte, die aus dem Nmap-Bericht abgeleitet werden. Sie bestehen aus der folgenden Liste von Attributen: [ipv4, hostname, os_info, ports], wobei ports eine Liste von Port-Objekten ist. Jeder Port hat die folgende Liste von Attributen: [port, protocol, state, service, software, version, cpe, scripts], alle standardmäßig None.
Merkmale sind Objekte, die von der FeatureBase-Klasse erben und eine spezifische _transform-Methode instanziieren. Diese Methode nimmt immer die Liste aller Hosts als Eingabe und gibt eine Lambda-Funktion zurück, die jeden Host auf eine numpy-Spalte mit numerischen Werten abbildet (die Host-Reihenfolge bleibt erhalten). Die Spalte wird dann an die Matrixdarstellung des Berichts angehängt. Merkmale müssen korrekte numerische Werte (Fließkommazahlen oder Ganzzahlen) und nichts anderes ausgeben.
Die meisten Merkmalstransformationen werden mit einer einfachen Lambda-Funktion implementiert. Stellen Sie sicher, dass Sie für jeden Host einen numerischen Wert standardmäßig setzen, um die Modellkompatibilität zu gewährleisten.
Beispiel:
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
Sie können das Merkmal dann zum Bericht hinzufügen, indem Sie die Methode NmapReport.add_feature in batea/__init__.py verwenden.
from .features.basic_features import CustomInterestingPorts
def build_report():
report = NmapReport()
#[...]
report.add_feature(CustomInterestingPorts())
return report
Es ist möglich, vorverarbeitete Daten zum Trainieren des Modells oder für Vorhersagen zu verwenden. Die Daten müssen nach (ipv4, port) indiziert sein, mit einer eindeutigen Kombination pro Zeile. Der Datentyp sollte dem ähneln, was Sie von der XML-Version eines Nmap-Berichts erwarten. Eine Spalte muss einen der folgenden Namen verwenden, aber Sie müssen nicht alle verwenden. Der Parser standardisiert auf Nullwerte, wenn eine Spalte fehlt.
'ipv4',
'hostname',
'os_name',
'port',
'state',
'protocol',
'service',
'software_banner',
'version',
'cpe',
'other_info'
Beispiel:
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"
Für den Data Scientist in Ihnen, oder einfach aus Spaß und Gewinn, können Sie die numerische Matrix zusammen mit der Score-Spalte anstelle der normalen Ausgabe ausgeben. Dies kann für weitere Datenanalysen und Debugging-Zwecke nützlich sein.
$ batea -oM network_matrix nmap_report.xml