微软开源网络攻防模拟工具CyberBattleSim介绍及源码分析

介绍

项目主页:cyberbattlesim - 微软官方页面

Gtihub主页:microsoft/CyberBattleSim

微软尝试利用AI和机器学习来解决安全挑战,研究智能体是如何在模拟的企业网络内进行交互强化学习技术如何帮助提高安全性

CyberBattleSim是用于研究网络攻防模拟的套件,这个实验研究项目探索在抽象模拟的企业环境中智能体是如何运作的。该模拟环境提供了对计算机网络和网络安全概念高层次抽象。使用基于python的OpenAI Gym接口来使用强化学习训练智能体。

模拟环境是一种参数化的固定的网络拓扑和一组代理可以用来横向移动的漏洞集合。攻击者的目标是通过利用植入计算机结点的漏洞获得部分网络的控制权。当攻击者试图在网络中进行横向移动时,防御者观察网络活动并尝试检测任何正在发生的攻击,并通过驱逐攻击者减轻对系统的影响。

CyberBattleSim提供了一个基于随机的防御者,通过预先定义的成功概率来检测和缓解正在进行的攻击。通过重新镜像受感染的结点来实施缓解措施,一个抽象的建模为跨越多个模拟步骤的操作的过程。

代理性能指标

  • 达到其目标所采取的模拟步骤数目
  • 整个训练轮数中的模拟步骤的累计奖励

项目目标

鼓励研究社区探索在这种网络环境中,网络空间代理的相互作用和进化。

Why模拟,Why Simple

模拟环境性能要求低,更轻量,速度快,抽象,并且可控性更强,适用于强化学习实验

  • 抽象级别高,只需要建模系统重要的方面;例如应用层网络通信相比于包级别的网络模拟,我们忽略了低层的信息。
  • 灵活性:定义一个新的机器是很容易的,不需要考虑底层的驱动等,可以限制动作空间为可以管理且相关的子集。
  • 全局的状态可以有效地捕获,从而简化调试与诊断。
  • 轻量:运行在一台机器/进程的内存中

CyberBattleSim的仿真固然简单,但是简单是具有优势的。高度抽象的性质使得无法直接应用于现实系统,从而防止了潜在的恶意训练的自动化代理使用。同时,这种简单可以使我们更专注于特定的安全性方面,例如研究和快速试验最新的机器学习和AI算法。

例如当前的实现方式侧重于横向移动,希望理解网络拓扑和配置并施加影响。基于这一目标,没有必要对实际的网络流量进行建模。这只是未来系统中可能要解决的一个重要局限性的例子。

挑战

在算法方面提供了一些基础的代理作为出发点,但是我们很想知道如何将最新的强化学习算法和他们进行比较。我们发现与其他应用程序(视频游戏或机器人)相比,计算机系统具有的大型动作空间是强化学习的一个特殊挑战。在面对代理通常不具有内部记忆的强化学习技术时,训练可以存储和检索凭证的代理是另外一个挑战

应用

还有一些可以用于研究的问题:

  • 如何设计一个可以给防御者带来固有优势的企业网络?
  • 如何进行安全的研究以保护企业免受自动化网络攻击,同时防止此类技术的恶意使用。

设计原则

  • 仅对足够复杂的模型进行建模以表示来自ATT&CK矩阵的攻击技术
  • 同时保持使用强化学习技术有效训练代理需要的简单性

建模

在这里插入图片描述

如何模拟(建模)

在这里插入图片描述

专注于所有post-breach攻击固有的横向移动技术。
强化学习建模:

  • 有向图,结点表示计算机,边表示其他结点的知识或节点间通信。
  • 环境:状态就是网络,单个代理,部分可观测(代理无法观测到所有的结点和边),静态的,确定性的,离散的,post-breach
  • 行动空间(代理可以逐步探索网络):本地供给,远程攻击,认证连接
  • 观测空间:发现结点,获取结点,发现凭证,特权提升,可用攻击
  • 奖励:基于结点的内在价值,SQL server比测试机器重要

漏洞建模

  • 先决条件漏洞是否在给定的节点上被激活
  • 漏洞被攻击者成功利用的概率
  • 漏洞成功利用的side-effects

每个结点都有一组分配的命名属性,先决条件可以表示为基于可能结点属性集合的布尔表达式

漏洞结果

每个漏洞都有预定义的结果,可能包括:

  • 泄露凭证集合
  • 泄露引用网络中的另一个结点
  • 泄露结点信息/属性
  • 对结点拥有所有权
  • 节点上的特权提升

远程漏洞举例:

  • 一个SharePoint站点泄露了ssh凭证
  • 一个ssh漏洞可以获取计算机的访问权限
  • 一个github项目泄露了commit历史
  • 一个SharePoint站点的文件包含到存储用户的SAS token

本地漏洞举例:

  • 从系统缓存中提取token或凭据
  • 提升到system权限
  • 提升到管理员权限

漏洞可以在结点级别使用时定义,也可以由全局定义,并由先决条件布尔表达式激活

建模分析

主要关注了用户角色与凭证(有凭证才可以登录其他机器),连接性(发现其他机器以及到其他机器的连接),漏洞(漏洞的前提条件及漏洞利用效果)

代码分析

重点:建议使用docker构建运行,自己安装可能会出现各种问题

toyctf环境

toyctf环境由cyberbattle/samples/toyctf/toy_ctf.py文件定义.

为了简单起见,这个环境中没有防御者,且是完全静态的(攻击者的两次行动之间没有外部事件)

打开上述notebook,运行命令:

env.plot_environment_graph()
plot()

c2.run_attack('client', 'SearchEdgeHistory')
plot()

c2.run_remote_attack('client', 'Website', 'ScanPageContent')
plot()

c2.run_remote_attack('client', 'Website', 'ScanPageSource')
plot()

c2.run_remote_attack('client', 'Website.Directory', 'NavigateWebDirectoryFurther')
plot()

c2.connect_and_infect('client', 'Website', 'SSH', 'ReusedMySqlCred-web')
plot()

效果:
在这里插入图片描述

chain环境

按照可以从与节点关联的属性中学习的特殊模式定义的一组网络。

模式为:Start ---> (Linux ---> Windows ---> ... Linux ---> Windows)* ---> Linux[Flag]

对每一个XXX ---> Windows/Linux,XXX结点将RDP密码或SSH凭据暴露给Windows/Linux的本地漏洞,同时暴露一些成本高昂但是没有结果的陷阱漏洞

该链式网络由一个带flag的reward结点终止

该环境由cyberbattle/samples/chainpattern/chainpattern.py文件定义

随机代理由cyberbattle.agents.random_agent文件定义

链式网络中的随机代理基准测试notebook:notebooks/chainnetwork-random.ipynb

基准测试

评估chain网络完全控制需要的时间

在这里插入图片描述
上图显示了应用不同攻击者代理时,轮数和获取整个网络控制权的迭代次数之间的关系。迭代次数越少越好,说明攻击者可以更快的获得网络的控制权,这个模拟被设置为在攻击者获取整个网络后终止。可以看到效果最好的是Deep Q-Learning
应用了四种攻击者代理:

  • Tabular Q-learning
  • epsilon-greedy
  • Deep Q-Learning
  • Exploiting Q-function learnt from DQL

在这里插入图片描述
上图展示了不同攻击者代理的累计奖励。一旦所有网络结点都被攻击者拥有后,利用获得结点上的漏洞扔可能获得其他奖励,但是在该实验中,一旦攻击者拥有了所有结点,便终止游戏忙着解释了为什么为网络所有权优化的DQL代理虽然击败了其他的代理,但是却无法获得最大的回报。

Gym的Done函数可以针对特定的奖励被重新配置,在这种情况下DQL仍然打败了其他代理。

特征选择

  • 左:在把与网络大小相关的特征(例如发现的节点数)进行训练时Q学习可以得到最佳效果
  • 右:当使用不依赖于网络大小的特征时,也会获得还不错的结果
对比Size agnostic featuresSize-dependant features
Tabular Q vs Random在这里插入图片描述在这里插入图片描述

chain网络下的迁移学习

衡量从一种环境中学习的策略并将其应用于不同规模的类似环境的能力。在x大小的环境中训练,在y>x的环境中进行评估。

使用与环境大小成比例的特征(如节点数,凭据数)无法提供最佳结果。但是当使用最近发现的端口和节点属性的滑动窗口时,代理的性能会更好。(翻译不太对可能)

对比Train on size 4 , evaluated on size 10Train on size 10, evaluated on size 4
Tabular Q vs Random在这里插入图片描述在这里插入图片描述

防御者代理

目前的版本提供了两个防御者代理,定义于文件cyberbattle/_env/defender.py,分别是

  • ScanAndReimageCompromisedMachines:随机扫描机器随机概率确定该机器受感染,然后reimage该机器
  • ExternalRandomEvents:随机采取一系列的结点重新配置操作包括:对结点随机修补漏洞,随机停止服务,随机植入漏洞,随机移除防火墙规则,随机添加防火墙规则

添加了防御者代理的示例:cyberbattle/agents/baseline/notebooks/notebook_withdefender.py

动作空间及reward

定义于`cyberbattle/simulation/actions.py``文件

项目结构

|-- Dockerfile
|-- ...
|-- cyberbattle
|   |-- ...
|   |-- _env	//环境相关定义
|   |-- agents	//代理
|   |   |-- baseline	//基准代理
|   |   |   |-- agent_dql.py
|   |   |   |-- agent_randomcredlookup.py
|   |   |   |-- agent_tabularqlearning.py
|   |   |   |-- agent_wrapper.py
|   |   |   |-- baseline_test.py
|   |   |   |-- learner.py
|   |   |   |-- notebooks	//基准代理对应的notebook
|   |   |   |   |-- notebook_all_agents_benchmark.py
|   |   |   |   |-- notebook_ctf_dql.py
|   |   |   |   |-- notebook_dql.py
|   |   |   |   |-- notebook_randlookups.py
|   |   |   |   |-- notebook_tabularq.py
|   |   |-- random_agent.py
|   |-- samples		//网络环境定义
|   |   |-- chainpattern	//链式网络
|   |   |-- simple		//随机生成网络
|   |   |-- toyctf		//toyctf网络
|   |-- simulation		//模型定义
|-- notebooks
|   |-- c2_interactive_interface.ipynb
|   |-- chainnetwork-optionwrapper.ipynb
|   |-- chainnetwork-random.ipynb
|   |-- random_plot.png
|   |-- randomnetwork.ipynb		//随机网络环境生成
|   |-- toyctf-blank.ipynb
|   |-- toyctf-random.ipynb
|   |-- toyctf-solved.ipynb

Todo

  • 更高级的防御者,通过对环境的观测来做出行动
  • 不同的网络结构对攻击者的影响
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
一个awd攻防比赛的裁判平台。 版本:beta v2.0 开发语言:python3 + django 平台分为两个部分 裁判机 靶机 通过特定接口,来实现靶机flag与服务器的通信 搭建流程 裁判机 安装所需环境 裁判机:python3+django 全局搜索woshiguanliyuan,并修改为随机字符串,此处为管理平台地址 /untitled/urls.py path('woshiguanliyuan/',views.admin,name='admin'), path('woshiguanliyuan/table/',views.admin_table,name='admin_table'), /app/views.py if 'woshiguanliyuan' not in request.META['HTTP_REFERER']: 第31和47换为你的目录 列:("/var/www/awd_platform/app/qwe.txt","a") 修改app/management/commands/init.py,添加用户 #['用户名','用户靶机token','用户靶机token'] user=[ ['123456','FF9C92C7SDFABB71566F73422C','FF9C92C7SDFABB71566F73422C'], ['aaabbb','311F8A54SV9K6B5FF4EAB20536','311F8A54SV9K6B5FF4EAB20536'] ] 修改/app/views.py第行d89f33b18ba2a74cd38499e587cb9dcd为靶机中设置的admin_token值的md5 if('d89f33b18ba2a74cd38499e587cb9dcd'==hl.hexdigest()): 运行 python3 manage.py init python3 manage.py manage.py runserver --insecure 靶机 安装所需环境 靶机:python+requests 修改send_flag.py参数,并将其放入靶机,设权限700。 靶机 sudo python send_flag.py。 靶机生成flag脚本,send_flag.py import requests import time import random import string import hashlib token='woshiwuxudong' # 红队 baji='311F8A54SV9K6B5FF4EAB20536' def getFlag(): #return ''.join(random.sample(string.ascii_letters + string.digits, 48)) m = hashlib.md5(''.join(random.sample(string.ascii_letters + string.digits, 48)).encode(encoding="utf-8")).hexdigest() return m while(1): f=open('/flag','w') flag=getFlag() f.write(flag) data={ 'flag':flag, 'token':token, 'baji':baji, } r=requests.post('http://127.0.0.1/caipanflag/',data=data) print(r.text) f.close() time.sleep(300) 重要须知 更新作者基础上: 1.增加flag验证一次性失效性,使得每个用户都并且仅可以提交一次flag 2.增加排名情况 3.flag改为MD5 4.增加丢失flag一轮扣100分

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏打呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值