
AI 기반, 컨텍스트 기반 네트워크 장치 순위

Batea(바테아)는 금광들이 모래와 자갈을 씻어 금 덩어리를 회수하는 데 전통적으로 사용하던 나무 또는 철로 만든 큰 얕은 팬입니다.
Batea는 이상 탐지(anomaly detection) 계열의 머신러닝 알고리즘을 기반으로 한 컨텍스트 기반 네트워크 장치 순위 매기기 프레임워크입니다. Batea의 목표는 보안 팀이 nmap 스캔 보고서를 사용하여 대규모 네트워크에서 __자동으로 흥미로운 네트워크 자산을 필터링__할 수 있도록 하는 것입니다. 우리는 이를 Gold Nuggets라고 부릅니다.
Gold Nuggeting과 Batea의 과학적 배경에 대한 자세한 내용은 여기에서 백서를 확인하십시오.
Batea는 nmap 보고서(XML)에서 모든 장치의 수치 표현(numpy)을 구성한 다음 이상 탐지 방법을 적용하여 gold nugget을 찾아냅니다. 특정 기능(특징) 또는 흥미로운 특성을 네트워크 요소의 수치 표현에 추가하여 쉽게 확장할 수 있습니다.
네트워크의 수치 표현은 보안 커뮤니티의 전문 지식에서 영감을 받은 특징(Feature)을 사용하여 구성됩니다. 특징은 직관의 요소 역할을 하며, 비지도 이상 탐지 방법을 통해 네트워크 자산의 컨텍스트, 즉 네트워크의 전체 설명을 순위 매기기 알고리즘의 핵심 구성 요소로 사용할 수 있습니다. 사용된 정확한 알고리즘은 Isolation Forest(https://en.wikipedia.org/wiki/Isolation_forest)입니다.
머신러닝 모델은 Batea의 핵심입니다. 모델은 전체 데이터셋에서 훈련되고 동일한(및 다른) 데이터 포인트(네트워크 장치)에 대한 점수를 예측하는 데 사용되는 알고리즘입니다. Batea는 또한 모델 지속성(persistence)을 허용합니다. 즉, 사전 훈련된 모델을 재사용하고 대규모 데이터셋에서 훈련된 모델을 내보내 추가로 사용할 수 있습니다.
# 전체 정보
$ 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개의 gold nugget 출력)
$ 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
# xml 파일과 함께 사전 형식화된 csv 사용
$ batea -x nmap_report.xml -c portscan_data.csv
# 상세도 조정
$ batea -vv nmap_report.xml
Batea는 보고서(또는 보고서 시리즈)의 모든 호스트에 숫자 특징을 할당하여 작동합니다.
호스트는 nmap 보고서에서 파생된 Python 객체입니다. 다음 속성 목록으로 구성됩니다: [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 함수
정의된 목록의 포트 수를 셉니다.
"""
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
그런 다음 batea/__init__.py에서 NmapReport.add_feature 메서드를 사용하여 특징을 보고서에 추가할 수 있습니다.
from .features.basic_features import CustomInterestingPorts
def build_report():
report = NmapReport()
#[...]
report.add_feature(CustomInterestingPorts())
return report
모델 훈련 또는 예측을 위해 전처리된 데이터를 사용할 수 있습니다.
데이터는 (ipv4, port)로 인덱싱되어야 하며, 각 행은 고유한 조합을 가져야 합니다. 데이터 유형은 nmap 보고서의 XML 버전에서 예상되는 것과 유사해야 합니다.
열은 다음 이름 중 하나를 사용해야 하지만, 모두 사용할 필요는 없습니다. 열이 없으면 파서는 기본적으로 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