GRASSMARLIN是一款由美国国家安全局开发的,能够帮助运维工程师在IP网络上发现并编目监控和数据采集系统(SCADA)和工业控制系统(ICS)主机的开源软件工具,也被称为被动网络映射器。
其数据源十分多样化,包括PCAP文件、路由器和交换机配置文件、CAM表以及实时网络数据包的捕获。该工具能够自动识别可用网络,生成网络拓扑,实现主机间通信的可视化,还能够展示从主机通信中所提取的元数据。
像nmap、plcscan这些主动映射工具会通过网络发送数据包并进行分析,最终得出一个存在可能性的结论。但GRASSMARLIN并非这样的分析工具,它只是被动地对工业设备进行映射,帮助系统管理员、审计员或其它人员完成深度分析的工作。其功能重点不在于如何从海量数据得出某个结论,而是通过梳理这些数据,帮助工作人员作出正确率更高的决策。
GRASSMARLIN适用于以下系统:
Microsoft Windows(64位的Win7、8、10)
Fedora(23)、Ubuntu(14.04、15.10以及SecurityOnion)
Kali2.0
CentOS(6、7)
Debian(8)
当然它也有适用于其它系统的版本,如32位的Windows系统。虽然软件开发人员也在这些环境中进行了测试,但是在没有附加配置的情况下,他们无法保证这个工具能够正常运行。在其它这些平台上运行GRASSMARLIN可能会导致性能下降或造成安装后需重新配置等问题。
因其检测方式被动,GRASSMARLIN不会在网络上产生任何流量。它只和传统的数据包分析器一样,嗅探网络上的流量。这也意味着GRASSMARLIN只能分析实际在其主机上嗅探到的流量。
GRASSMARLIN的可视范围
逻辑视图能够在实时流量捕获时获得,或者通过捕获文件(PCAP文件)获取。和逻辑视图类似,物理视图也通过Cisco路由器的日志被动地生成。
该视图下的网络拓扑图如下:
带有两台西门子PLC的逻辑视图
该拓扑是通过使用工业通信协议S7Comm的2个工业设备的数据包捕获而生成。那些PCAP文件可以从https://wiki.wireshark.org/S7comm下载。
上面主图(上图右侧)展示了网络上的设备、设备间的通信、子网、通过IP地址识别的每台设备情况。
另外利用整合的数字签名,GRASSMARLIN能够识别工业设备及设备所使用的协议:
GRASSMARLIN提供的逻辑视图详情
上图这种情况下所使用的协议是S7Comm。另外设备作用也较详细:主机(人机界面——HMI,又称用户界面)负责提供命令,从机(可编程逻辑控制器——PLC)负责执行这些命令。ICS管理员还能获知有助于定位设备的厂商名称。如果IP地址是公开的(当然这里我们不讨论这种情况),则可以通过各国国旗确定具体国家。
所有这些信息都是在捕获的数据包和GRASSMARLIN签名之间进行对比后产生的。因此,用户可以根据1至5的信任度属性对现状的可信度作出自己的判断。
GRASSMARLIN也能够隔离与特定设备相关的通信,并进行第一次分析:数据包大小、发包时间、数据包来源(如果使用多个PCAP文件):
GRASSMARLIN提供的分析数据
GRASSMARLIN还含有签名或指纹功能,可识别逻辑视图中使用的协议。每个签名由两种元素组成:
1. 过滤器元素:描述要检测的元素
2. Payload(有效负载)元素:向用户返回信息
一个签名可以由多个过滤器组成;一个payload(有效负载)对应一个过滤器:
MODBUS签名示例
过滤器基本上能够描述OSI模型的第2层到第4层的协议属性。下表是所有可用的过滤器:
可用过滤器
有效载荷旨在通过从数据包中提取一些字节等方式向用户提供更多信息。
当前版本的GRASSMARLIN(v3)有54个立即可用的指纹,涵盖大多数工业协议。该工具最近已经开放源代码(01/28/16),随着时间的推移,其签名数量可能会增加,准确性也会提高。
签名是以XML格式进行编辑的,但是GRASSMARLIN提出了一种图形工具——FingerPrint Editor,有助于创建签名:
Fingerprint Editor(指纹编辑器):用于编辑签名的图形工具
该视图展现的是设备之间存在的物理链路:
物理视图
该视图的关注点在于网络方面,展现了工业设备和网络设备之间的物理连接。GRASSMARLIN的V3版本仅支持Cisco路由器,并从3个命令的输出生成物理视图:
“show running-config”
“show ip arp”(OU)“show mac address-table”
“show interfaces”
只要这些命令的输出以简单文本文件的形式保存,GRASSMARLIN就可以生成物理视图。
GRASSMARLIN导出的数据包括3种格式:
1. 以PNG格式导出的视图。
2. 以XML格式导出的数据:
保存逻辑视图中所有树状图的数据;
GRASSMARLIN将该数据作为会话数据。
3. 存档数据的导出;包括:XML格式的数据和实时捕获所生成的PCAP文件。
我们在Solucom的某个ICS模型上进行了测试,将GRASSMARLIN应用于实际环境中。
ICS模型模拟一个railway switch,由以下部分组成:
1台西门子HIM;
1台西门子PLC;
2台施耐德PLC;
1台交换机(switch)。
ISC测试模型
安装了GRASSMLARIN的工作站直接连接到交换机上的镜像端口,访问ICS模型上的整个通信过程。由于该模型没有Cisco设备,所以我们只测试了逻辑视图。
经过实时的数据捕获,GRASSMARLIN将生成以下这个视图:
测试台的逻辑视图
经过(手动)重组后的视图:
重组后的逻辑视图
通讯被拦截后,设备信息会快速显示在图中。上图中可以看出GRASSMARLIN已正确识别所有设备,并正确给出了每台设备所使用的协议。另外,其输出的XML文件也很好地生成了GRASSMARLIN所提取的所有信息,实现未来的重复利用:
输出的XML文件
但是在整个过程中,我们也看到了GRASSMARLIN的一些弊端:
1. 签名不一致
若某设备匹配多个签名,GRASSMARLIN只会选择其中一个。这个可能是HMI的问题,因为HMI利用不同的通信协议与多个PLC进行交互。
2. 有些数字签名信息不完整
大多数数字签名在其payload上都有描述字段,用来描述已识别的设备。如果这些字段是空白的或信息不充分的,那么识别工业设备可能也会变得更加复杂。
3. 分析功能有限
GRASSMARLIN仅提供通信分析的第一个元素,如数据包的大小、接收时间。改进此功能的一个可能的方法是添加例如HIM和PLC之间的通信模式识别。
目前市场上已经有很多类似的被动检测式的工具。但是GRASSMARLIN是一个历史上不可多得的专注于工业控制领域的开源工具。
比如说,一款名为NetworkMiner的工具能够利用nmap、p0f和Ettercap等著名工具的签名来获取网络拓扑。但NetworkMiner没有任何可开箱即用的工业签名,因此其准确性也远不如GRASSMARLIN。
2个西门子PLC下NetworkMiner的输出
其它示例——带有2个西门子PLC的p0f的输出
带有2个西门子PLC的GRASSMARLIN的输出
可以仔细观察一下输出结果:没有对比就没有伤害。
载入GRASSMARLIN后会自动打开一个新的不显示任何数据的会话框。GRASSMARLIN会自动加载插件,对GeoIP数据库执行完整性检查,加载指纹并执行其他初始化任务。
窗口右侧的主显示屏中含多个选项卡。每个会话均包含了至少一个逻辑视图(列出所有设备及设备间通信)、物理视图(列出工业设备和网络设备之间的物理链路)和Sniffles(也称为网格图)的一个选项卡。每个选项卡中的内容都实现了可视化。
窗口左侧被分为两部分。下半部分含消息日志,显示有关该应用程序活动的状态更新、警告、错误等信息。上半部分是对当前可视化内容镜像的树状图。截图中显示当前无可视化内容,因此也没有镜像的树状图。更改选项卡就会改变树状图和“可视化”中显示的内容。文末的用户手册文档中详细讨论了不同的可视化内容。
消息日志的下方是内存指示器,由内存使用量(左边数字)、总可用内存(右边数字)以及内存使用所占百分比的进度条构成。
主窗口上方是主菜单和工具栏。工具栏左侧的三个图标从左到右依次为导入、加载会话和保存会话。在工具栏的右侧是一个组合框,用于选择Live PCAP设备以及启动和停止Live PCAP。除了主窗口之外,后台还会打开包含诊断和调试数据的控制台窗口。
工具下载链接:
https://github.com/iadgov/grassmarlin
英文版用户手册:
https://github.com/iadgov/GRASSMARLIN/blob/master/GRASSMARLIN%20User%20Guide.pdf