

Batea(バテア)とは、金の採掘者が砂や砂利を洗って金塊を回収するために伝統的に使用する、木製または鉄製の浅い大きなパンのことです。
Batea は、異常検知アルゴリズムファミリーに基づく文脈駆動型ネットワークデバイスランキングフレームワークです。Batea の目標は、セキュリティチームが nmap スキャンレポートを使用して大規模ネットワーク内の 重要なネットワークアセットを自動的にフィルタリング できるようにすることです。私たちはこれらを Gold Nuggets(金塊) と呼んでいます。
Gold Nuggeting と Batea の背後にある科学の詳細については、こちらのホワイトペーパー(こちら)をご覧ください。
Batea は、nmap レポート(XML)からすべてのデバイスの数値表現(numpy)を構築し、異常検知手法を適用して金塊を発見します。特定の特徴(features)や興味深い特性をネットワーク要素の数値表現に追加することで、簡単に拡張できます。
ネットワークの数値表現は、セキュリティコミュニティの専門知識に着想を得た特徴を使用して構築されます。特徴は直感の要素として機能し、教師なし異常検知手法により、ネットワークアセットの文脈、つまりネットワーク全体の記述をランキングアルゴリズムの中心的な構成要素として利用できます。使用される正確なアルゴリズムは 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 は、レポート(または一連のレポート)内のすべてのホストに数値特徴を割り当てることで動作します。
ホストは nmap レポートから派生した Python オブジェクトで、次の属性リストで構成されます: [ipv4, hostname, os_info, ports]。ここで ports はポートオブジェクトのリストです。各ポートは次の属性リストを持ちます: [port, protocol, state, service, software, version, cpe, scripts]。すべてデフォルトは None です。
特徴(Features)は 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
その後、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