网络安全研究人员开发检测和响应能力时面临的一个挑战性问题是,寻找一个逼真的环境来测试其假设和能力。
最廉价的方法是在小型实验室网络上测试能力。但这种环境缺乏真实企业网络的规模以及真实环境中的噪声,而这些噪声使得检测变得困难得多。在许多方面,最佳环境是在多个企业级网络上进行测试,同时具有受控但逼真的攻击者以及来自用户、系统管理员和第三方软件/设备的真实噪声。在这种环境中测试的挑战在于成本高昂,并且在某些场景下风险很高。
BRAWL 旨在通过创建一个系统,在云环境中自动构建企业网络来达成一种折衷方案。目前仅支持 OpenStack 环境,但其设计方式便于将来轻松支持其他云环境。BRAWL 还构建了一个分析网络,其中包含使用 LogStash 和 Kafka 的数据摄取与处理管道。作为分析网络的一部分,它还创建了一个使用 Elasticsearch 和 Kibana 的事件存储与搜索系统。BRAWL 使用 Windows 镜像启动一个企业网络“游戏棋盘”。这些镜像已预安装并配置了 Microsoft Sysmon 和其他传感器,用于将日志转发到数据摄取框架。
BRAWL 还有一个机器人的概念,可以是红方、蓝方或灰方。红方机器人负责攻击,蓝方机器人负责防御,而灰方机器人模拟合法用户行为以提供噪声,使检测更加困难。当用户想要测试研究假设时,他们会实现一个 BRAWL 机器人。该 BRAWL 机器人会向 BRAWL 控制器注册,然后控制器在游戏棋盘上编排 BRAWL 机器人之间的游戏。
注意:由于文件大小和 GitHub 配额的问题,我们将所有文件放入一个 zip 文件中,而不是以纯文本形式保留在 git 仓库中。所有数据都在该文件中。
本次发布包含来自 BRAWL 原型的一些数据。我们创建了一个小型企业网络,如下所述。然后,我们使用 MITRE 的 CALDERA 研究项目作为红方机器人运行了一场游戏。
CALDERA 是一个相关的 MITRE 研究项目,它基于 对抗性战术、技术与常识(ATT&CK) 模型中的信息自动化对手模拟活动。它实现了一组 ATT&CK 战术和技术,并使用规划系统 (https://dl.acm.org/citation.cfm?id=2991111) 来自动化这些技术的执行,并在企业网络中生成妥协后的对手行为。
该数据根据 知识共享署名许可协议 发布。
我们的小型企业网络是一个扁平网络,包含一个域控制器(dc.brawlco.com)和 16 台工作站。每台 PC 的计算机名称都包含了其主要用户名(例如,用户 beane 通常登录 beane-pc)。该用户对该计算机拥有本地管理员权限。
所有 PC 均运行 Windows 8.1。域控制器运行 Windows Server 2012 R2。
在 Windows 8 PC 上,我们通过以下注册表命令启用了 WDigest 以在 LSASS 内存中保留纯文本密码:reg ADD HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\ /v UseLogonCredential /t REG_DWORD /d 1 /F
在此次演练中,CALDERA 是唯一参与的 BRAWL 机器人。虽然从概念上讲,BRAWL 可用于测试各种攻击者行为和检测,但 MITRE 的许多研究工作都遵循“假设已遭入侵”的理念。因此,我们在演练开始时就赋予 CALDERA 一个起始点,即作为网络中某台计算机上的本地管理员。
此外,如果没有灰方机器人在不同主机上执行登录操作,从红方机器人可窃取和使用的凭据角度来看,BRAWL 游戏棋盘是“无菌”的。为了实现横向移动,BRAWL 控制器使用 psexec 在主机上使用网络中其他用户的凭据创建登录事件。
CALDERA 在演练中执行了以下 ATT&CK 技术:
此仓库中包含五种类型的数据。每种数据都位于 data/ 文件夹中的单独文件中。
| 数据类型 | 描述 |
|---|
鼓励红方机器人和蓝方机器人使用 BRAWL 共享格式 (BSF) 记录其活动或检测信息。这样做旨在便于比较蓝方机器人的检测/操作与红方机器人的操作。
该格式目前仍在开发中,可能会在未来的数据集中发生变化。
BSF 的字段在下面的“数据源详情”部分进行了描述。
BRAWL 中的不同事件源处理时间的方式不同。时间可能是事件到达日志摄取框架的时间、事件在主机/端点上的生成时间,或者网络上的机器人记录的时间。通常,这些时间相差应在几毫秒内。如果可能,日志摄取框架会使用事件本身包含的事件时间,而不是事件到达摄取节点的时间。下表详细说明了每种数据类型使用的方法。
我们使用的是 Sysmon v3.11。sysmon_config.txt 包含 sysmon -c 命令的输出,详细说明了我们的配置。
Sysmon 生成多种不同类型的事件,这些事件映射到不同的 CAR 对象/操作对。每种类型的字段在 CAR 网站上有更详细的说明:https://car.mitre.org/wiki/Data_Model
在我们的配置中,Sysmon 生成的对象/操作对包括:
driver/loadfile/attr_modifyflow/startmodule/loadprocess/createprocess/terminatethread/createthreat/remote_create请使用 CAR 数据模型 来确定上述每个对象/操作对在 data_model.fields.* 中包含的字段名称和语义。
此数据是使用 MITRE 的 用于安全态势感知的 PowerShell 实用工具 中的 unified_json.ps1 模块定期收集的。如果系统上运行了 Mimikatz 这样的凭据转储工具,userinfo 字段可用于确定哪些凭据可能已被泄露。
bsf 数组字段内部的对象类型为 operation、step 或 event。所有对象都有一个 nodetype 字段,可用于确定对象类型。
event BSF 对象您可以通过在 CAR 数据模型 中查找相关对象来了解有关必填字段和可选字段的更多语义。
step BSF 对象步骤对象将一个或多个事件连接成更高层次的活动分组。步骤对象还为 BSF 发射器提供了使用 ATT&CK 标签标记活动的场所。
operation BSF 对象操作对象将多个步骤对象连接在一起。但此数据集中不存在 operation 对象。
事件字段的描述与注释(特别是“至少包含以下之一”):1. 时间字段。
happened\_after 和 happened\_before,分别作为时间上的左括号和右括号,定义了实际事件不确定性区间的边界。每个 event 对象必须至少报告这三个字段中的一个(即 time、happened\_after、happened\_before)。其他字段是可选的,但应在已知时进行报告。特别地,鼓励机器人为 time 字段报告一个它们的最佳猜测值,即便它们没有确切时间。time,happened\_after,happened\_before} 中的一个,流结束事件也是如此。但是,某些蓝队传感器可能会在活动进行中检测到持续性活动(例如,一个周期性扫描所有进程状态并发现某个进程已变成恶意的扫描器)。对于流,可以在活动进行中检测到的流报告为“flow, message, time, ... (other fields)”。对于进程,可以在活动进行中检测到的进程报告为“process, scanned, time, ... (other fields)”。command\_line,或者被执行的 exe / 。本游戏中 BRAWL 网络上的主机:
| game_metadata | 描述 BRAWL 场景的数据 |
| sysmon | 从每台工作站上运行的 Sysmon 收集的数据 |
| win_event | Windows 事件日志 |
| computer_properties | 从自定义脚本收集的、提供网络中计算机某些信息的数据 |
| bsf | 红方机器人以 BRAWL 共享格式 (BSF) 记录的操作 |
| 数据源 | 时间说明 |
|---|
| computer_properties | 来自 time 字段 |
| game_metadata | 到达摄取框架的时间 |
| sysmon | 来自 utc_time 字段 |
| win_event | 从 Windows 事件时间中提取 |
| bsf | @timestamp 字段是事件到达摄取框架的时间。但与时间相关的 BSF 字段(例如 happened_after、happened_before 等)则是事件开始或结束的时间,基于 CALDERA 命令与控制服务器上的时间。 |
| 字段名 | 描述 |
|---|
| @timestamp | 与事件相关的时间。请参阅上面的时间说明。 |
| @uuid | 唯一事件 ID |
| game_id | 此次演练的唯一 game_id。 |
| type | 事件类型。对于这些记录,始终为 game_metadata |
| hosts | 参与此次演练且红方机器人“可及”的主机列表 |
| randomization_seed | 一个种子,可供 BRAWL 机器人参与者用于实现“随机”行为,且该行为在 BRAWL 的不同执行之间保持一致 |
| starting_host | 红方机器人起始所在的主机。 |
| 字段名 | 描述 |
|---|
| @timestamp | 与事件相关的时间。请参阅上面的时间说明。 |
| @uuid | 唯一事件 ID |
| type | 事件类型。对于这些记录,始终为 sysmon |
| game_id | 此次演练的唯一 game_id。 |
| data_model.object | 被操作的 CAR 对象。 |
| data_model.action | 对对象执行的 CAR 操作。此字段是一个数组,因为某些事件可能对应 CAR 数据模型中的多个操作。例如,远程线程创建事件。 |
| data_model.fields.* | 与特定对象/操作对相关的字段。 |
| game_id | 此次演练的唯一 game_id。 |
| host | 记录该事件的主机名。 |
| 字段名 | 描述 |
|---|
| @timestamp | 与事件相关的时间。有关具体计算方式,请参阅下文中的每个事件说明 |
| @uuid | 唯一事件 ID |
| type | 事件类型。对于这些记录,始终为 win_event |
| game_id | 此次演练的唯一 game_id。 |
| host | 记录该事件的主机 |
| raw | Windows 事件日志条目的原始 XML 格式 |
| data_model.fields.log_name | Windows 日志名称(应用程序、系统或安全) |
| data_model.fields.log_type | 给定 log_name 的日志类型 |
| 字段名 | 描述 |
|---|
| @timestamp | 与事件相关的时间。请参阅上面的时间说明。 |
| @uuid | 唯一事件 ID |
| type | 事件类型。对于这些记录,始终为 computer_properties |
| game_id | 此次演练的唯一 game_id。 |
| host | 运行该脚本的计算机名称 |
| netinfo | netinfo 对象的集合 |
| netinfo.DNSServers | 为此主机配置的 DNS 解析器集合 |
| netinfo.Gateway | 此接口的网关 |
| netinfo.IPAddress | 此接口的 IP 地址 |
| netinfo.IsDHCPEnabled | 是否启用了 DHCP? |
| netinfo.MACAddress | 此接口的 MAC 地址 |
| netinfo.SubnetMask | 对应 IP 地址的子网掩码 |
| pcinfo | 描述 PC 信息的对象 |
| pcinfo.AssetTag | 资产标签(如果可访问) |
| pcinfo.CPU | CPU 信息 |
| pcinfo.ChassisType | 在 BRAWL 中未使用。值为 "Unknown" |
| pcinfo.Disks | 连接的磁盘信息 |
| pcinfo.DomainName | 系统所属的域名 |
| pcinfo.LastBootUpTime | 系统启动时间 |
| pcinfo.Memory | 系统内存信息 |
| pcinfo.OS | 正在运行的操作系统信息 |
| pcinfo.SerialNumber | 硬件序列号 |
| time | 脚本运行时间 |
| userinfo | 包含 userinfo 对象的数组,描述自上次启动以来登录过系统的用户 |
| userinfo.AuthenticationPackage | 用于身份验证的身份验证包 |
| userinfo.Domain | 账户所属的域(或本地 PC) |
| userinfo.LogonId | 登录 ID |
| userinfo.LogonTime | 登录时间 |
| userinfo.LogonType | Windows 登录类型常量 |
| userinfo.LogonTypeName | LogonType 的描述 |
| userinfo.UserName | 登录主体的用户名 |
| 字段名 | 描述 |
|---|
| @timestamp | 与事件相关的时间。请参阅上面的时间说明。 |
| @uuid | 唯一事件 ID |
| type | 事件类型。对于这些记录,始终为 bsf_events |
| game_id | 此次演练的唯一 game_id。 |
| bsf | 描述机器人活动的 BSF 事件数组。该数组的字段在下面有更详细的说明。 |
| bsf_version | 用于 bsf 事件数组的 BSF 模式版本 |
| producer_id | 生成此 BSF 数据的机器人。 |
| 字段 | 描述 |
|---|
| id | 每个事件的唯一标识符。 |
| nodetype | 此节点的类型。取值之一:{"operation", "step", "event"}。 |
| host | 此事件执行/检测到的主机名或 IP。 |
| time | 注意:以下三个时间字段(即 "time"、"happened_after" 或 "happened_before")中至少需要报告一个。特别希望提供 "time";鼓励提供全部三个。请参阅下文一般说明中的注释 1。 时间格式说明:所有时间信息必须采用 ISO 8601 格式。具体为:'yyyy-mm-ddThh:nn:ss.llll00'。其中 y 为年,m 为月,d 为日,h 为时,n 为分,s 为秒,l 为毫秒(最后有两位零)。例如:2017-02-22T18:38:14.060000 可选:对事件发生时间的估计。 |
| happened_after | 可选:对 "time" 不确定性的早期界限(“时间左括号”)。 |
| happened_before | 可选:对 "time" 不确定性的晚期界限(“时间右括号”)。 |
| confidence | 可选:使蓝方机器人能够传达对此事件与攻击关联的置信度(0.0 到 1.0 之间的实数)。 |
| object | 被操作的对象;允许值见下表。大致基于 CAR 数据模型。 |
| action | 给定对象的操作。大致基于 CAR 数据模型。 |
| specific_field_1 .. N | 1-N 个描述性属性(见下文)。大致基于 CAR 数据模型。 |
| 对象 | 操作 | 必填字段 | 可选字段 |
|---|
| process | create terminate scanned | 至少包含以下之一: {pid, command_line, exe, image_path} | fqdn hostname md5_hash parent_exe parent_image_path ppid sha1_hash sha256_hash sid signer user |
| flow | start end message | 至少包含以下之一: {src_hostname, src_ip} 至少包含以下之一: {dest_hostname, dest_ip} 至少包含以下之一: {src_port, dest_port, protocol} | content dest_fqdn exe flags fqdn hostname image_path packet_count pid ppid proto_info src_fqdn user |
| file | create delete modify read timestomp write | file_path | company file_name fqdn hostname image_path md5_hash pid ppid sha1_hash sha256_hash signer user |
| 字段名 | 描述 |
|---|
| id | 操作步骤的唯一标识符。 |
| nodetype | 此节点的类型。取值之一:{"operation", "step", "event"}。 |
| attack_info | 技术对象数组(在下面表格中定义),描述此步骤如何与 ATT&CK 分类体系关联。为什么是数组?虽然单个技术通常描述一个步骤及其所有事件,但在某些情况下,可能会实现多种技术。 |
| attack_info.technique_id | 描述此步骤及其引用事件中红方所使用攻击机制的 ATT&CK 技术 ID(例如 "T1059")。 |
| attack_info.technique_name | 描述该技术的人类可读字符串(例如 "命令行界面")。 |
| attack_info.tactic | 一个或多个 ATT&CK 战术标签的数组,描述该技术的意图/策略。(注意:单个技术可能涉及多种战术。)例如:["横向移动", "执行"] |
| description | 可选:此步骤的注释或标注。 |
| events | 组成此步骤的 event 对象的 ID 数组。 |
image\_path