现在许多企业都在使用AD域服务进行管理,我们现在通俗理解里面蕴含着许多重要资产。
对于这个东西有下列的描述:
1、攻击他能够获得用户权限
2、里面存在许多的计算机资产,当攻击者攻击其中的一台机器,可以通过某种手段在域中的环境横向移动。
3、这玩意存在于内网中。
大概的描述就是上面的了,网上的解释我看不懂,我现在觉得他是一个类似管理资源的应用,存放在域控主机上,然后这个攻击者需要通过横向移动来控制到这个主机。
所以微软的365 Defender团队就发布了这个开源的人工智能攻防对抗模拟工具。项目专注于对网络攻击后横向移动阶段进行威胁建模,用于模拟抽象企业网路环境中运行的自动化代理的交互。(自动化代理可以模拟一些人工行为,自动化执行一些行为。)
项目调用了基于python的Open AI Gym接口使用强化学习训练自动化Agent。
技术使用了DQN模拟攻击方和防御方,部署了一些经典的漏洞、脆弱性的资产。不同的服务器资产被攻取可以获得到不同的分数。跟强化学习的思想结合起来,可以获得到一个最佳的攻击路径、攻击手法和防御策略。在这个过程中通过变换不同的防守策略、网络拓扑,可以得到很多的副本,从而进一步的训练攻击者和防守方的策略。(我们知道强化学习需要给智能体的行为给定一个评分,然后让这个智能体最后得到高分。那么我是说,当然他会向着得分最高的目标,这里当然是域控主机。我的意思是,,如何设置智能体的行为是需要细致考虑的,比方说,选取了什么漏洞,这个漏洞是否可行,使用过后是否会被系统检测出来。在这里是有一套复杂的设置)
再者,作为防御方,我们想要对系统进行威胁建模,但是就我所知道的,威胁建模对于建模的人来说,建模是挖掘威胁的工具,我们在进行建模前是不知道威胁是什么的,那么强化学习需要设置对智能体设置行为规范,让他去学习,从而去发现潜在的威胁。看上去是不是有点冲突,不过仔细想想是我搞混了威胁建模的概念(写的比较绕了,其实需要区别的是威胁建模不是挖创新型的0day,而是去根据已经有的资料去查询系统,在这个层面其实看起来是可以使用强化学习的。但是我总觉得在这个层面上,需要对智能体的行为不要设置需要多样性一点,要是设置的太具体,宏观,我觉得就简化了攻击方式,也就是量化智能体行为细度需要做一些研究)
---10.2更新
在对程序进行运行和解读后,对项目有了一些新的理解:
首先是项目文件,这里附上主要项目文件结构
|-- 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
需要快速了解项目的可以尝试使用jupyter noterbook,当然在调试的过程中还是遇到各种各样的bug,(烦死了(猴子
据说使用docker可以流畅构建,但是项目原来的注册表的登陆密码不共享,需要自行重新拉取构建,我doker水平不太好,拉了半天没搞定。(一定要去学精点
轻度观察项目后,感觉这个项目是个沙盘模拟哇,和上面之前写的理解有点相关,这个模拟的精细度怎么说呢,比较宏观,到流量那种肯定是没有的,根据一些特点,比方说什么样的机器存在什么样子的漏洞,通过控制机器达到横向移动。
CyberBattleSim中建模:
有向图,结点表示计算机,边表示其他结点的知识或节点间通信。
环境:状态就是网络,单个代理,部分可观测(代理无法观测到所有的结点和边),静态的,确定性的,离散的,post-breach
行动空间(代理可以逐步探索网络):本地攻击,远程攻击,认证连接
观测空间:发现结点,获取结点,发现凭证,特权提升,可用攻击
奖励:基于结点的内在价值,如SQL server比测试机器重要
可以在这两个教学文件当中看到项目对应网络和节点的定义
本地agent如上,定义了其包含的漏洞,漏洞类型,漏洞描述,端口,价值,花费,服务等。
防御agent预测节点被攻击后会采用一种re-image的方式防御,似乎是重装镜像??
攻击者通过初始化的攻击节点开始,由于无法获取到当前整个环境当中的网络拓扑图与链接方式,攻击者agent只有三种能力进行横向扩散:本地攻击、远程攻击、链接到其他节点。通过不同的结点的权限和不同的动作典型的比如数据泄露、泄露、权限失陷等行为,分别给不同的分数。
对于漏洞的定义:
漏洞建模
- 先决条件漏洞是否在给定的节点上被激活
- 漏洞被攻击者成功利用的概率
- 漏洞成功利用的side-effects
每个结点都有一组分配的命名属性,先决条件可表示为基于可能结点属性集合的布尔表达式
漏洞结果
每个漏洞都有预定义的结果,可能包括:
泄露凭证集合
泄露引用网络中的另一个结点
泄露结点信息/属性
对结点拥有所有权
节点上的特权提升
远程漏洞例子:
一个SharePoint站点泄露了ssh凭证
一个ssh漏洞可以获取计算机的访问权限
一个github项目泄露了commit历史
一个SharePoint站点的文件包含到存储用户的SAS token
本地漏洞例子:
从系统缓存中提取token或凭据
提升到system权限
提升到管理员权限
漏洞可以在结点级别使用时定义,也可以由全局定义,并由先决条件布尔表达式激活
建模主要是关注了用户角色与凭证(根据凭证登录其他机器),连接性(发现其他机器以及到其他机器的连接),漏洞(漏洞的前提条件及漏洞利用效果)
目前看到的agent感觉不太涉及到多智能体联合协作,目前跑到的像是单智能体。比方说多个智能体如何协同攻击或者协同防御,项目给我的感觉就是将我最一开始学习强化学习的小车走网格的PLUS版本。
该项目的攻击方式包括本地攻击,远程攻击和连接其他节点,每种攻击只举了几个例子,然而实际过程中应该远远不止于此(虽然我攻防学习的不是很好,但是看同学打过,像是这种攻防可能需要结合类似知识图谱??要是能够跟漏洞库结合起来感觉还不错,但是带来的实际计算开销目前我无法估计。
TODO
1、emmm尝试diy下节点和agent试一下
2、将剩下的代码跑通