博客 一般的信息安全

使用AXAMD和Python3读取NOD SIE Ch212(“新观测域”)的观测结果

简介

最受欢迎的安全信息交换(SIE)通道之一是通道212,NOD(“新观察域”)。该通道显示参与主机站点上的传感器以前从未看到过的域。注意,NOD不是一个基于“区域文件”(或基于“CZDS”)的解决方案——我们关注的是实际部署和使用的域,而不仅仅是已经注册的域。

有许多可能访问Ch212流量的不同方法,包括:

  • 直接通过nmsgtool使用在SIE的租用刀片服务器
  • 通过加密的网络隧道(又名“SIE远程访问”或“sratunnel”)使用nmsgtool
  • 使用SIE Batch,从半天的流量缓冲区下载最近看到的流量
  • 使用IXFR (incremental zone transfer)下载DNS RPZ格式的Ch212流量
  • 通过rsync下载Ch212的rbldnsdb格式的流量
  • 经由公共(但收费有限)区域。

不过,今天我们将重点介绍如何使用AXAMD从RESTFUL API端点读取Ch212流量。

作为参考,下面是AXAMD的意思:

AXA =高级交换访问-交换部分指的是SIE,安全信息交换

中间件守护程序

高级交换访问中间件守护进程

AXAMD包括命令行接口客户端和Python3绑定。我们将向您展示如何使用这两种方法。

安装AXAMD

让我们从创建一个Python3虚拟环境开始,在这里我们可以进行AXAMD的安装:

$ /usr/local/bin/python3 -m venv ~/my-venv $ source ~/my-venv/bin/activate

在虚拟环境中工作时,我们的正常$提示符将以虚拟环境的名称作为前缀:

(my-venv)$ python3 -V Python 3.10.6

如果希望经常使用该虚拟环境,可能需要将activate命令添加到启动点文件中。

现在我们准备克隆我们想要构建的AXAMD存储库:

(my-venv) $ git克隆https://github.com/farsightsec/axamd_client.git (my-venv) $ CD axamd_client

安装axamd只需要一个安装命令-一旦所有必备库都已安装。在我们的例子中,我们需要安装Option_merge, jsonschema, pyyaml和pyflakes:

(my-venv) $ pip3 install option_merge (my-venv) $ pip3 install jsonschema (my-venv) $ pip3 install pyyaml (my-venv) $ pip3 install pyflakes

然后我们就准备好安装了axamd_client:

(my-venv) $ python3 setup.py install .py

对订阅通道的访问是通过API密钥控制的。使用vi(或您喜欢的编辑器)创建文件
~ / .axamd-client.conf(注意文件名其余部分前面的波浪号斜线点!)

该文件需要以下两行代码:

服务器:https://axamd.sie-remote.net apikey: put your-actual- sie-remote - access - apikey -here

请注意,您的SIE远程访问API密钥与您可能拥有的DNSDB API密钥不相同!

保存文件后,确保你是唯一能够读取它的人:

(my-venv) $ chmod go-rwx ~/.axamd-client.conf

运行AXAMD单元测试

现在可以运行提供的单元测试了。
如果您正在运行Python3的当前版本,您可能需要做一个小调整。在我们成功地运行全套AXAMD单元测试之前,~ / my-venv / lib / python3.10 /网站/ option_merge / merge.py需要更新以便

从集合导入映射

就变成:

从集合.abc导入映射

完成此操作后,我们就可以成功地从~ / axamd_client目录:

(my-venv)美元python3 setup . py测试(群输出省略 ] ---------------------------------------------------------------------- 跑64测试在0.245 s OK

尝试使用axamd_client CLI客户端

您现在安装的部分是axamd_client命令行接口客户端。这可能是一些人进行与axamd相关的工作所需要的全部内容。输入以下命令可以查看命令行摘要:

(my-venv)美元axamd_client - h

现在让我们试着用axamd_client确认我们可以进入212频道

(my-venv)美元axamd_client——list-channels[…[…]10.32.212.255/8430[…]

如果您没有看到ch212,请联系您的DomainTools帐户执行人员,以确保您订阅了该频道。

现在让我们实际抓取一些SIE NOD流量!

如果我们不想axamd_client为了“永远运行”,我们可以要求收集特定数量的观察结果(例如,- 1000号)或指定一段时间(例如,——持续时间15秒).
让我们试着收集15秒的NOD观察结果,将它们写入临时文件temp.jsonl

(my-venv)美元Axamd_client——duration 15s——channel 212——watches ch=212 > temp.jsonl

在我们的测试运行中,我们在15秒内得到了40个观察结果;你的测试结果可能会更大或更小:

(my-venv)美元wc - l temp.jsonl40 temp.jsonl

有用提示:在指定时间持续时间时,您可以方便地使用hh: mm: ss# w h d # # # #年代格式。

看看我们的一些结果与jq

收集了一些数据后,我们现在准备仔细研究它。该输出是JSON行格式(https://jsonlines.org/),可以很容易地用“肉眼”阅读,但我们仍然使用jq (https://stedolan.github.io/jq/)来“漂亮地打印”我们的观察结果:

(my-venv)美元金桥”。< temp.jsonl |更多{"tag": 1, "op": "WATCH HIT", "channel": "ch212", "vname": "SIE", "mname": "newdomain", "nmsg": {"time": " 22-08-02 19:35:04.643621570", "vname": "SIE", "mname": "newdomain", "source": "a1ba02cf", "message": {"domain": "sellmypennsylvaniahomefast.com.", "time_seen": " 22-08-02 19:34:45", "bailiwick": "com.", "rrname": "sellmypennsylvaniahomefast.com.", "rrclass": "IN", "rrtype": "NS", "rdata":[" dns1.registrar-servers.com。”、“dns2.registrar-servers.com”。, "keys": [], "new_rr": []}}} [etc]

注意,在NOD中新观察到的条目可能从可怕的到恶意的。我们不会“defang”您从AXAMD收到的输出,所以在调查任何您看到报告的新观察域时要谨慎——许多域可以,但有些可能是有风险的。

虽然我们使用jq只是为了提高JSON Lines输出的可读性,但它可以做更多的事情。例如,如果你只想从你的输出中得到一个域的原始列表,jq可以帮助你:

(my-venv)美元金桥.nmsg.message - r。域的< temp.jsonl

“我在输出中定期看到的这些会计信息是什么?”

大多数AXAMD输出通常都是这样“看打”如上图所示的条目,但您也可能定期看到“会计”报告摘要统计信息。示例如下:

{"tag":"*","op":"OK","orig_op":"ACCOUNTING","str":"total-filtered=29 total-missed=0 total-collected=0 total-sent=29 total-ratelimited=0 total-congested=0"}

AXAMD将很容易跟上相对较低带宽的SIE通道,如Ch212,所以这些会计消息不会特别令人兴奋或信息丰富。你可以控制两者之间的间隔会计方法发出的项axamd_client——报告的时间间隔选项(包括将该间隔设置为零以完全关闭它们)。

“但是我想把AXAMD直接集成到我自己的Python代码中!”我该怎么做呢?”

下面是一些示例代码,其中一小块特定于axamd的代码以粗体显示。这两个AXAMD调用非常简单,其余的代码只是处理所需的导入、处理CTRL-C中断的几行“锅炉板”代码以及从配置文件获取API密钥和服务器名称的两个正则表达式。

# !/usr/bin/env python3 # pylint: disable=C0114 import sys import re import json import signal from pathlib import axamd的路径。# pylint: disable=E0401 # handle CTRL-C clear def handler(mysig, myframe): # pylint: disable=W0613,C0116 sys.exit(") signal.signal(")SIGINT, handler) #获取SIE远程访问API密钥和AXAMD服务器my_cfg_file = str(Path.home()) + "/. AXAMD -client.conf" with open(my_cfg_file, 'r', encoding='utf8') as mycfg: contents = mycfg.read() mypat1 = re.compile('apikey: (.*)') apikey = mypat1.findall(contents)[0] mypat2 = re.compile('server: (.*)') server = mypat2.findall(contents)[0]#读取Ch212并打印出c.sra中line的JSON Lines格式结果(channels=[212], watches=['ch=212']): data = JSON .loads(line) print(data)

假设代码在一个名为sample_run.py,一个示例运行如下:

(my-venv)美元。/ sample_run.py{'tag': 1, 'op': 'WATCH HIT', 'channel': 'ch212', 'vname': 'SIE', 'mname': 'newdomain', 'nmsg': {'time': ' 22-08-03 00:49:46.182181816', 'vname': 'SIE', 'mname': 'newdomain', 'source': 'a1ba02cf', 'message': {'domain': 'liftedandloweredgolfcarts.com ', 'time_seen': ' 22-08-03 00:48:09', 'bailiwick': 'com。', 'rrname': 'liftedandloweredgolfcarts.com.', 'rrclass': 'IN', 'rrtype': 'NS', 'rdata': ['ns10.wixdns.net.', 'ns11.wixdns.net.'], 'keys': [], 'new_rr': []}}} [etc] [hit CTRL-C kill streaming session]

结论

我们希望您喜欢学习如何获取、构建和使用AXAMD从NOD (SIE频道212)收集数据。

如果您想与DomainTools交流以订阅NOD和AXAMD,请与我们联系。