CyberBattleSim simulation
模块详细分析
simulation
模块是 CyberBattleSim 的核心组件,实现了网络安全模拟的基础功能。下面我将详细分析每个文件和类。
1. model.py
这个文件定义了模拟环境的数据模型,包括节点、漏洞、凭证等基本概念。
ListeningService 类
- 主要作用:表示节点上监听的服务
- 初始化参数:
name
:服务名称/端口名称allowedCredentials
:允许的凭证列表(默认为空列表)running
:服务是否运行(默认为 True)sla_weight
:服务权重(默认为 1.0)
- 处理逻辑:存储服务信息,包括名称、允许的凭证和运行状态
Rates 类
- 主要作用:表示漏洞相关的概率
- 初始化参数:
probingDetectionRate
:探测检测率(默认为 0.0)exploitDetectionRate
:利用检测率(默认为 0.0)successRate
:成功率(默认为 1.0)
- 处理逻辑:存储漏洞利用的各种概率
VulnerabilityType 枚举
- 主要作用:定义漏洞类型
- 值:
LOCAL
:本地漏洞REMOTE
:远程漏洞
PrivilegeLevel 枚举
- 主要作用:定义权限级别
- 值:
NoAccess
:无访问权限LocalUser
:本地用户权限Admin
:管理员权限System
:系统权限MAXIMUM
:最高权限
VulnerabilityOutcome 类
- 主要作用:漏洞利用结果的基类
- 子类:
LateralMove
:横向移动CustomerData
:客户数据访问PrivilegeEscalation
:权限提升ProbeSucceeded
:探测成功ProbeFailed
:探测失败ExploitFailed
:利用失败LeakedCredentials
:泄露凭证LeakedNodesId
:泄露节点 ID
PrivilegeEscalation 类
- 主要作用:表示权限提升结果
- 初始化参数:
level
:提升到的权限级别
- 方法:
tag
:获取权限标签
- 处理逻辑:存储权限提升级别,生成权限标签
SystemEscalation 类
- 主要作用:表示提升到系统权限
- 初始化参数:无
- 处理逻辑:调用父类构造函数,设置权限级别为 System
AdminEscalation 类
- 主要作用:表示提升到管理员权限
- 初始化参数:无
- 处理逻辑:调用父类构造函数,设置权限级别为 Admin
ProbeSucceeded 类
- 主要作用:表示探测成功结果
- 初始化参数:
discovered_properties
:发现的属性列表
- 处理逻辑:存储发现的属性
CachedCredential 类
- 主要作用:表示缓存的凭证
- 初始化参数:
node
:节点 IDport
:端口名称credential
:凭证 ID
- 处理逻辑:存储节点-端口-凭证三元组
LeakedCredentials 类
- 主要作用:表示泄露的凭证
- 初始化参数:
credentials
:凭证列表
- 处理逻辑:存储泄露的凭证列表
LeakedNodesId 类
- 主要作用:表示泄露的节点 ID
- 初始化参数:
nodes
:节点 ID 列表
- 处理逻辑:存储泄露的节点 ID 列表
Precondition 类
- 主要作用:表示漏洞的前提条件
- 初始化参数:
expression
:条件表达式(字符串或布尔表达式)
- 处理逻辑:解析条件表达式,存储为布尔表达式
VulnerabilityInfo 类
- 主要作用:表示漏洞信息
- 初始化参数:
description
:漏洞描述type
:漏洞类型outcome
:漏洞利用结果precondition
:前提条件(默认为 “true”)rates
:概率(默认为默认概率)URL
:漏洞信息链接(默认为空)cost
:利用成本(默认为 1.0)reward_string
:成功利用时显示的文本(默认为空)
- 处理逻辑:存储漏洞的详细信息
FirewallRule 类
- 主要作用:表示防火墙规则
- 初始化参数:
port
:端口名称permission
:权限(允许或阻止)reason
:规则原因(默认为空)
- 处理逻辑:存储防火墙规则信息
FirewallConfiguration 类
- 主要作用:表示节点的防火墙配置
- 初始化参数:
outgoing
:出站规则列表(默认允许 RDP、SSH、HTTP、HTTPS)incoming
:入站规则列表(默认允许 RDP、SSH、HTTP、HTTPS)
- 处理逻辑:存储防火墙配置,包括出站和入站规则
NodeInfo 类
- 主要作用:表示网络中的节点
- 初始化参数:
services
:服务列表vulnerabilities
:漏洞字典(默认为空)value
:节点价值(默认为 0)properties
:属性列表(默认为空)firewall
:防火墙配置(默认为默认配置)agent_installed
:是否安装代理(默认为 False)privilege_level
:权限级别(默认为 NoAccess)reimagable
:是否可重新镜像(默认为 True)last_reimaging
:上次重新镜像时间(默认为 None)owned_string
:节点被控制时显示的文本(默认为空)status
:机器状态(默认为 Running)sla_weight
:SLA 权重(默认为 1.0)
- 处理逻辑:存储节点的详细信息,包括服务、漏洞、属性等
Identifiers 类
- 主要作用:定义环境中使用的标识符集合
- 初始化参数:
properties
:属性标识符列表(默认为空)ports
:端口标识符列表(默认为 [“Null”])local_vulnerabilities
:本地漏洞标识符列表(默认为空)remote_vulnerabilities
:远程漏洞标识符列表(默认为空)
- 处理逻辑:存储环境中使用的标识符集合
Environment 类
- 主要作用:表示模拟环境
- 初始化参数:
network
:网络图vulnerability_library
:漏洞库identifiers
:标识符集合creationTime
:创建时间(默认为当前时间)lastModified
:最后修改时间(默认为当前时间)version
:版本标签(默认为 VERSION_TAG)
- 方法:
nodes()
:遍历网络中的节点get_node(node_id)
:获取指定 ID 的节点plot_environment_graph()
:绘制环境图
- 处理逻辑:存储和管理模拟环境,包括网络、漏洞库和标识符
2. actions.py
这个文件实现了攻击者和防御者可以执行的动作。
AgentActions 类
- 主要作用:实现攻击者和防御者的动作
- 初始化参数:
environment
:模拟环境verbose
:是否详细输出(默认为 False)defender_agent
:防御者代理(默认为 None)
- 主要方法:
discover_network()
:发现网络discover_node_properties(node_id)
:发现节点属性discover_node_services(node_id)
:发现节点服务discover_remote_vulnerabilities(source_node_id, target_node_id, port)
:发现远程漏洞discover_local_vulnerabilities(node_id)
:发现本地漏洞exploit_remote_vulnerability(source_node_id, target_node_id, vulnerability_id, port)
:利用远程漏洞exploit_local_vulnerability(node_id, vulnerability_id)
:利用本地漏洞connect_to_remote_machine(source_node_id, target_node_id, port, credential)
:连接到远程机器get_discovered_nodes()
:获取已发现的节点get_discovered_properties(node_id)
:获取已发现的属性get_discovered_services(node_id)
:获取已发现的服务get_discovered_remote_vulnerabilities(source_node_id, target_node_id, port)
:获取已发现的远程漏洞get_discovered_local_vulnerabilities(node_id)
:获取已发现的本地漏洞get_discovered_credentials()
:获取已发现的凭证get_node_privilegelevel(node_id)
:获取节点权限级别get_owned_nodes()
:获取已控制的节点get_nodes_with_remote_access()
:获取可远程访问的节点get_nodes_with_local_access()
:获取可本地访问的节点get_nodes_with_local_vulnerabilities()
:获取有本地漏洞的节点get_nodes_with_remote_vulnerabilities()
:获取有远程漏洞的节点get_nodes_with_services()
:获取有服务的节点get_nodes_with_properties()
:获取有属性的节点get_nodes_with_credentials()
:获取有凭证的节点get_nodes_with_privilege_level(level)
:获取有指定权限级别的节点get_nodes_with_value()
:获取有价值的节点get_nodes_with_firewall()
:获取有防火墙的节点get_nodes_with_agent_installed()
:获取已安装代理的节点get_nodes_with_reimagable()
:获取可重新镜像的节点get_nodes_with_last_reimaging()
:获取有上次重新镜像时间的节点get_nodes_with_owned_string()
:获取有控制文本的节点get_nodes_with_status(status)
:获取有指定状态的节点get_nodes_with_sla_weight()
:获取有 SLA 权重的节点get_nodes_with_vulnerabilities()
:获取有漏洞的节点get_nodes_with_services_running()
:获取有运行服务的节点get_nodes_with_services_stopped()
:获取有停止服务的节点get_nodes_with_services_with_allowed_credentials()
:获取有允许凭证的服务的节点get_nodes_with_services_with_sla_weight()
:获取有 SLA 权重的服务的节点get_nodes_with_services_with_name(name)
:获取有指定名称服务的节点get_nodes_with_services_with_running(running)
:获取有指定运行状态服务的节点get_nodes_with_services_with_allowed_credentials_with_credential(credential)
:获取有允许指定凭证的服务的节点get_nodes_with_services_with_allowed_credentials_with_credential_with_port(credential, port)
:获取有允许指定凭证和端口的服务的节点get_nodes_with_services_with_allowed_credentials_with_credential_with_port_with_running(credential, port, running)
:获取有允许指定凭证、端口和运行状态的服务的节点get_nodes_with_services_with_allowed_credentials_with_credential_with_port_with_running_with_sla_weight(credential, port, running, sla_weight)
:获取有允许指定凭证、端口、运行状态和 SLA 权重的服务的节点get_nodes_with_services_with_allowed_credentials_with_credential_with_port_with_running_with_sla_weight_with_name(credential, port, running, sla_weight, name)
:获取有允许指定凭证、端口、运行状态、SLA 权重和名称的服务的节点get_nodes_with_services_with_allowed_credentials_with_credential_with_port_with_running_with_sla_weight_with_name_with_allowed_credentials(credential, port, running, sla_weight, name, allowed_credentials)
:获取有允许指定凭证、端口、运行状态、S# CyberBattleSimsimulation
模块详细分析(续)
继续分析 simulation
模块中的其他文件和类:
3. actions.py(续)
ActionResult 类
- 主要作用:表示动作执行的结果
- 初始化参数:
outcome
:动作结果(VulnerabilityOutcome 或 None)reward
:奖励值message
:结果消息
- 处理逻辑:存储动作执行的结果,包括结果对象、奖励值和消息
AgentActions 类(续)
- 主要方法(续):
_check_prerequisites(node_id, vulnerability_info)
:检查漏洞前提条件_get_node_info(node_id)
:获取节点信息_get_node_property(node_id, property_name)
:获取节点属性_set_node_property(node_id, property_name, value)
:设置节点属性_add_node_property(node_id, property_name)
:添加节点属性_remove_node_property(node_id, property_name)
:移除节点属性_get_node_service(node_id, service_name)
:获取节点服务_get_node_vulnerability(node_id, vulnerability_id)
:获取节点漏洞_get_node_firewall(node_id)
:获取节点防火墙_get_node_agent_installed(node_id)
:获取节点代理安装状态_get_node_privilege_level(node_id)
:获取节点权限级别_get_node_reimagable(node_id)
:获取节点是否可重新镜像_get_node_last_reimaging(node_id)
:获取节点上次重新镜像时间_get_node_owned_string(node_id)
:获取节点控制文本_get_node_status(node_id)
:获取节点状态_get_node_sla_weight(node_id)
:获取节点 SLA 权重_get_node_value(node_id)
:获取节点价值_get_node_services(node_id)
:获取节点服务列表_get_node_vulnerabilities(node_id)
:获取节点漏洞列表_get_node_properties(node_id)
:获取节点属性列表list_vulnerabilities_in_target(node_id)
:列出目标节点的漏洞
4. commandcontrol.py
这个文件实现了命令与控制功能,用于模拟攻击者的远程控制。
CommandControl 类
- 主要作用:实现命令与控制功能
- 初始化参数:
environment
:模拟环境verbose
:是否详细输出(默认为 False)
- 主要方法:
discover_network()
:发现网络discover_node_properties(node_id)
:发现节点属性discover_node_services(node_id)
:发现节点服务discover_remote_vulnerabilities(source_node_id, target_node_id, port)
:发现远程漏洞discover_local_vulnerabilities(node_id)
:发现本地漏洞exploit_remote_vulnerability(source_node_id, target_node_id, vulnerability_id, port)
:利用远程漏洞exploit_local_vulnerability(node_id, vulnerability_id)
:利用本地漏洞connect_to_remote_machine(source_node_id, target_node_id, port, credential)
:连接到远程机器get_discovered_nodes()
:获取已发现的节点get_discovered_properties(node_id)
:获取已发现的属性get_discovered_services(node_id)
:获取已发现的服务get_discovered_remote_vulnerabilities(source_node_id, target_node_id, port)
:获取已发现的远程漏洞get_discovered_local_vulnerabilities(node_id)
:获取已发现的本地漏洞get_discovered_credentials()
:获取已发现的凭证
- 处理逻辑:管理命令与控制功能,包括发现、利用和连接等操作
5. environment_generation.py
这个文件提供了环境生成功能,用于创建模拟环境。
EnvironmentGenerator 类
- 主要作用:生成模拟环境
- 初始化参数:
identifiers
:标识符集合vulnerability_library
:漏洞库node_count
:节点数量(默认为 10)edge_count
:边数量(默认为 20)seed
:随机种子(默认为 None)
- 主要方法:
generate()
:生成环境_generate_network()
:生成网络_generate_node_info(node_id)
:生成节点信息_generate_services(node_id)
:生成服务_generate_properties(node_id)
:生成属性_generate_vulnerabilities(node_id)
:生成漏洞_generate_firewall(node_id)
:生成防火墙_generate_agent_installed(node_id)
:生成代理安装状态_generate_privilege_level(node_id)
:生成权限级别_generate_reimagable(node_id)
:生成是否可重新镜像_generate_last_reimaging(node_id)
:生成上次重新镜像时间_generate_owned_string(node_id)
:生成控制文本_generate_status(node_id)
:生成状态_generate_sla_weight(node_id)
:生成 SLA 权重_generate_value(node_id)
:生成价值
- 处理逻辑:生成模拟环境,包括网络、节点、服务、属性、漏洞等
6. generate_network.py
这个文件提供了网络生成功能,用于创建网络拓扑。
NetworkGenerator 类
- 主要作用:生成网络拓扑
- 初始化参数:
node_count
:节点数量edge_count
:边数量seed
:随机种子(默认为 None)
- 主要方法:
generate()
:生成网络_generate_nodes()
:生成节点_generate_edges()
:生成边
- 处理逻辑:生成网络拓扑,包括节点和边
7. actions_test.py
这个文件包含了对 actions.py
的测试用例。
主要测试函数
test_list_vulnerabilities_function
- 主要作用:测试
list_vulnerabilities_in_target
函数 - 处理逻辑:
- 在单节点环境中测试
- 在多节点环境中测试
- 验证返回的漏洞列表长度
test_exploit_remote_vulnerability
- 主要作用:测试
exploit_remote_vulnerability
函数 - 处理逻辑:
- 测试无效源节点
- 测试无效目标节点
- 测试本地漏洞(应该失败)
- 测试无效漏洞
- 测试有效漏洞
- 验证结果类型和奖励值
test_exploit_local_vulnerability
- 主要作用:测试
exploit_local_vulnerability
函数 - 处理逻辑:
- 测试无效前提条件
- 测试管理员权限提升
- 测试系统权限提升
- 测试凭证泄露
- 验证结果类型和节点属性
test_connect_to_remote_machine
- 主要作用:测试
connect_to_remote_machine
函数 - 处理逻辑:
- 在空环境中测试
- 在单节点环境中测试
- 在多节点环境中测试
- 测试无效源节点
- 测试无效目标节点
- 测试无效协议
- 测试无效凭证
- 测试防火墙阻止
- 测试有效连接
- 验证结果和网络边
test_check_prerequisites
- 主要作用:测试
_check_prerequisites
函数 - 处理逻辑:
- 测试应该失败的节点/漏洞组合
- 测试应该成功的节点/漏洞组合
- 验证返回值
8. commandcontrol_test.py
这个文件包含了对 commandcontrol.py
的测试用例,类似于 actions_test.py
。
9. environment_generation_test.py
这个文件包含了对 environment_generation.py
的测试用例,验证环境生成功能。
10. model_test.py
这个文件包含了对 model.py
的测试用例,验证数据模型的正确性。
总结
simulation
模块是 CyberBattleSim 的核心,提供了网络安全模拟的基础功能。它包括:
- 数据模型(
model.py
):定义了节点、漏洞、凭证等基本概念 - 动作实现(
actions.py
):实现了攻击者和防御者可以执行的动作 - 命令与控制(
commandcontrol.py
):实现了命令与控制功能 - 环境生成(
environment_generation.py
):提供了环境生成功能 - 网络生成(
generate_network.py
):提供了网络拓扑生成功能 - 测试用例:验证各个组件的正确性
这些组件共同构成了一个完整的网络安全模拟框架,可以用于研究和评估各种攻击和防御策略。
CyberBattleSim simulation
模块文件和类关联分析
simulation
模块是 CyberBattleSim 的核心,实现了网络安全模拟的基础功能。下面我将详细分析这些文件和类之间的关联关系。
文件之间的关联
1. 核心数据模型与操作关系
model.py
定义了基础数据结构(节点、漏洞、凭证等)actions.py
依赖model.py
,实现了对环境的操作commandcontrol.py
依赖actions.py
,提供了更高级的命令与控制接口- 各个
*_test.py
文件分别测试对应的实现文件
2. 环境生成关系
environment_generation.py
依赖model.py
,用于生成模拟环境generate_network.py
被environment_generation.py
使用,专注于网络拓扑生成
3. 测试依赖关系
actions_test.py
测试actions.py
的功能model_test.py
测试model.py
的功能commandcontrol_test.py
测试commandcontrol.py
的功能environment_generation_test.py
测试environment_generation.py
的功能
类之间的关联
1. 数据模型层次结构 (model.py)
-
Environment
是顶层类,包含整个模拟环境- 包含
network
(网络图) - 包含
vulnerability_library
(漏洞库) - 包含
identifiers
(标识符集合)
- 包含
-
NodeInfo
表示网络中的节点- 包含
services
(服务列表) - 包含
vulnerabilities
(漏洞字典) - 包含
properties
(属性列表) - 包含
firewall
(防火墙配置)
- 包含
-
VulnerabilityInfo
表示漏洞信息- 包含
type
(漏洞类型) - 包含
outcome
(漏洞利用结果) - 包含
precondition
(前提条件) - 包含
rates
(概率)
- 包含
-
VulnerabilityOutcome
是漏洞利用结果的基类PrivilegeEscalation
(权限提升)继承自VulnerabilityOutcome
AdminEscalation
继承自PrivilegeEscalation
SystemEscalation
继承自PrivilegeEscalation
LeakedCredentials
(泄露凭证)继承自VulnerabilityOutcome
LeakedNodesId
(泄露节点 ID)继承自VulnerabilityOutcome
CustomerData
(客户数据)继承自VulnerabilityOutcome
2. 操作层次结构 (actions.py)
-
AgentActions
是主要操作类- 包含对
Environment
的引用 - 提供各种操作方法(发现、利用、连接等)
- 包含对
-
ActionResult
表示操作结果- 包含
outcome
(操作结果) - 包含
reward
(奖励值) - 包含
message
(结果消息)
- 包含
3. 命令与控制层次结构 (commandcontrol.py)
CommandControl
是命令与控制类- 包含对
AgentActions
的引用 - 提供更高级的操作接口
- 管理凭证和奖励
- 包含对
详细关联示例
示例1:漏洞利用流程
以下是一个完整的漏洞利用流程,展示了各个类如何协同工作:
- 首先,
Environment
定义了网络和漏洞库:
# 创建环境
env = model.Environment(
network=model.create_network(NODES),
vulnerability_library=SAMPLE_VULNERABILITIES,
identifiers=ENV_IDENTIFIERS
)
AgentActions
使用这个环境执行操作:
# 创建操作接口
agent_actions = actions.AgentActions(env)
# 发现本地漏洞
agent_actions.discover_local_vulnerabilities("a")
# 利用本地漏洞获取管理员权限
result = agent_actions.exploit_local_vulnerability("a", "UACME61")
-
在
exploit_local_vulnerability
方法内部:- 检查漏洞前提条件(使用
Precondition
类) - 获取漏洞信息(
VulnerabilityInfo
) - 执行漏洞利用,获得结果(
AdminEscalation
) - 更新节点属性,添加
privilege_Admin
标签 - 返回
ActionResult
对象
- 检查漏洞前提条件(使用
-
然后,可以使用获得的权限进一步利用漏洞:
# 利用管理员权限获取凭证
result = agent_actions.exploit_local_vulnerability("a", "MimikatzLogonpasswords")
-
在这个过程中:
MimikatzLogonpasswords
漏洞的前提条件要求有管理员权限- 利用成功后,返回
LeakedCredentials
对象 - 这些凭证可以用于连接到其他机器
-
最后,使用获得的凭证连接到其他机器:
# 连接到远程机器
result = agent_actions.connect_to_remote_machine("a", "dc", "RDP", "ADPrincipalCreds")
- 在
connect_to_remote_machine
方法内部:- 检查源节点和目标节点是否有效
- 检查防火墙规则(使用
FirewallConfiguration
类) - 检查凭证是否有效(使用
ListeningService
类) - 如果成功,更新网络图,添加边
- 返回
ActionResult
对象
示例2:命令与控制接口使用
以下是使用 CommandControl
类的示例,展示了更高级的接口如何简化操作:
# 创建命令与控制接口
cc = commandcontrol.CommandControl(env)
# 列出已发现的节点
nodes = cc.list_nodes()
# 显示网络图
cc.plot_nodes()
# 利用本地漏洞
result = cc.exploit_local_vulnerability("a", "UACME61")
# 获取总奖励
total_reward = cc.total_reward()
在这个过程中:
CommandControl
内部使用AgentActions
执行操作- 它自动保存获得的凭证
- 它自动累积奖励
- 它提供了可视化功能
示例3:测试框架使用
actions_test.py
展示了如何测试 AgentActions
类的功能:
def test_exploit_local_vulnerability(actions_on_simple_environment: Fixture) -> None:
# 测试管理员权限提升
result = actions_on_simple_environment.exploit_local_vulnerability("a", "UACME61")
assert isinstance(result.outcome, model.AdminEscalation)
node = actions_on_simple_environment._environment.network.nodes["a"]["data"]
assert model.AdminEscalation().tag in node.properties
# 测试系统权限提升
result = actions_on_simple_environment.exploit_local_vulnerability("c", "UACME67")
assert isinstance(result.outcome, model.SystemEscalation)
node = actions_on_simple_environment._environment.network.nodes["c"]["data"]
assert model.SystemEscalation().tag in node.properties
这个测试:
- 使用
pytest
框架 - 使用
fixture
创建测试环境 - 验证漏洞利用的结果
- 检查节点属性是否正确更新
总结
CyberBattleSim 的 simulation
模块采用了清晰的分层设计:
- 数据模型层(
model.py
)定义了基础数据结构 - 操作层(
actions.py
)实现了对环境的操作 - 命令与控制层(
commandcontrol.py
)提供了更高级的接口
这种设计使得:
- 数据和操作分离,便于测试和扩展
- 不同层次的接口满足不同用户的需求
- 模拟环境可以灵活配置和生成
通过这些组件的协同工作,CyberBattleSim 能够模拟复杂的网络安全场景,支持研究和评估各种攻击和防御策略。