NASim动作类学习
NASim环境的动作相关类包含ActionSpace类和ActionResult类。每个动作都继承自基类Action,基类定义了一些常见的属性和功能,不能类型的动作被实现为动作类的子类。实现的动作类型有:
Exploit,PrivilegeEscalation,ServiceScan,OSScan,SubnetScan,ProcessScan,NoOp
ActionSpace有两种类型的操作空间,取决于是否使用平面操作:
FlatActionSpace,ParameterisedActionSpace
class nasim.envs.action.Action(name, target,cost,prob=1.0,req_access=AccessLevel.USER,**kwargs)
环境中的基本抽象动作类,有多种类型的动作(例如扫描和利用等),但每个动作都有一些共同的属性。
__init__(name, target,cost,prob=1.0,req_access=AccessLevel.USER,**kwargs)
参数:
- name ( str ) – 动作名称
- target ( ( int , int ) ) – 目标地址
- cost ( float ) – 执行动作的成本
- prob ( float , optional ) -- 给定操作的成功概率(默认=1.0)
- req_access ( AccessLevel , optional ) – 执行操作所需的访问级别(默认=AccessLevel.USER)
is_exploit()检查是否是漏洞利用,如果操作被利用,则为True,否则为False
is_noop()检查动作是否是无所事事的动作,如果action是noop动作,则为True,否则为False
is_os_scan()检查操作是否是操作系统扫描,如果操作是操作系统扫描,则为True,否则为False
is_privilege_escalation()检查操作是否是提权操作,如果操作是提权操作,则为True,否则为False
is_process_scan()检查操作是否是进程扫描,如果操作时进程扫描,则为True,否则为False
is_remote()检查动作是否是远程动作,远程操作时目标主机是远程主机的操作(即该操作不在目标本地执行),如果操作是远程的,则为True,否则为False
is_scan()检查操作是否为扫描,如果动作是扫描则为真,否则为False
is_service_scan()检查操作是否是服务扫描,如果操作是服务扫描,则为True,否则为False
is_subnet_scan()检查操作是否是子网扫描,如果操作是子网扫描,则为True,否则为False
class nasim.envs.action.ActionResult(success, value=0.0, services=None, os=None, processes=None, access=None, discovered=None, connection_error=False, permission_error=False, undefined_error=False, newly_discovered=None)
用于存储动作结果的数据类,然后将这些结果用于更新完整状态和观察结果。
__init__(success, value=0.0, services=None, os=None, processes=None, access=None, discovered=None, connection_error=False, permission_error=False, undefined_error=False, newly_discovered=None)
参数:
- success ( bool ) – 如果利用/扫描成功则为 True,否则为 False
- value ( float , optional ) – 从动作中获得的值 (default=0.0)
- services ( dict , optional ) – 由操作标识的服务 (default=None={})
- os ( dict , optional ) – 由操作标识的操作系统 (default=None={})
- processes ( dict , optional ) – 由操作标识的进程 (default=None={})
- access ( dict , optional ) – 通过操作获得的访问权限 (default=None={})
- discovered( dict , optional ) – 通过操作发现的主机地址 (default=None={})
- connection_error ( bool , optional ) – 如果操作因连接错误而失败,则为 True(默认 = False)
- permission_error ( bool , optional ) – 如果操作因权限错误而失败,则为 True(默认 = False)
- undefined_error ( bool , optional ) – 如果操作因未定义的错误而失败,则为真(默认值=False)
- new_discovered ( dict , optional ) – 首次通过操作发现的主机地址(默认=None)
info()以字典形式获取结果,返回行动结果信息,dict
class nasim.envs.action.Exploit(name, target, cost, service, os=None, access=0, prob=1.0, req_access=AccessLevel.USER, **kwargs)
环境中的Exploit操作,从基本动作类继承。
__init__(name, target, cost, service, os=None, access=0, prob=1.0, req_access=AccessLevel.USER, **kwargs)
参数:
- target ( ( int , int ) ) – 目标地址
- cost ( float ) – 执行动作的成本
- service ( str ) – 目标服务
- os ( str , optional ) – 漏洞利用的目标操作系统,如果没有,则漏洞利用适用于所有操作系统(默认=无)
- access ( int , optional ) – 如果利用成功,则在目标上获得的访问级别(默认 = 0)
- prob ( float , optional ) – 成功概率(默认=1.0)
- req_access ( AccessLevel , optional ) – 执行操作所需的访问级别(默认=AccessLevel.USER)
class nasim.envs.action.FlatActionSpace(scenario)
NASim环境的平面操作空间。继承并实现了gym.spaces.Discrete。
__init__(scenario)
参数:
- scenario (Scenario) – 场景描述
- n(int) – 动作空间中的动作数量
- actions(list of Actions) – 动作空间中的动作列表
get_action(action_idx)获取action idx对应的Action对象,Action
class nasim.envs.action.NoOp(*args, **kwargs)
在环境中什么都不做,从基本动作类继承。
__init__ (* args , ** kwargs )
参数:
- name ( str ) – 动作名称
- target ( ( int , int ) ) – 目标地址
- cost ( float ) – 执行动作的成本
- prob ( float , optional ) -- 给定操作的成功概率(默认=1.0)
- req_access ( AccessLevel , optional ) – 执行操作所需的访问级别(默认=AccessLevel.USER)
*class nasim.envs.action.OSScan(target, cost, prob=1.0, req_access=AccessLevel.USER, *kwargs)
环境中的OS扫描操作,从基本动作类继承。
__init__(target, cost, prob=1.0, req_access=AccessLevel.USER, **kwargs)
参数:
- target ( ( int , int ) ) – 目标地址
- cost ( float ) – 执行动作的成本
- prob ( float , optional ) -- 给定操作的成功概率(默认=1.0)
- req_access ( AccessLevel , optional ) – 执行操作所需的访问级别(默认=AccessLevel.USER)
class nasim.envs.action.ParameterisedActionSpace(scenario)
NASim 环境的参数化动作空间。继承并实现了gym.spaces.MultiDiscrete动作空间,其中每个维度对应一个不同的动作参数。动作参数(按顺序)是:
- 动作类型=[0,5],0为利用,1为权限升级,2为服务扫描,3为系统扫描,4为子网扫描,5为进程扫描
- 子网=[0,#subnets-1] -1因为我们不包括互联网子网
- 主机=[0, max subnets size-1]
- 操作系统=[0, #OS]
- 服务=[0, #services - 1]
- 进程=[0, #processes]
请注意,操作系统、服务和进程仅对漏洞利用和权限提升操作很重要。
__init__(scenario)
参数:
- Scenario(Scenario)—场景描述
- nvec (Numpy.Array) — 每个参数的向量大小
- actions (list of Actions) — 动作空间中所有动作的列表
get_action ( action_vector ) (整数列表或整数元组或Numpy.Array)获取动作向量对应的动作对象,返回Action。
笔记:
- 如果host#指定的动作向量大于指定子网中的主机数,则host#将会被变为host# %子网大小。
- 如果操作是一个漏洞,并且参数与场景描述中的任何漏洞定义不匹配,则返回一个 NoOp 操作,成本为 0。
class nasim.envs.action.PrivilegeEscalation(name, target, cost, access, process=None, os=None, prob=1.0, req_access=AccessLevel.USER, **kwargs)
环境中的权限提升操作,从基本动作类继承。
__init__(name, target, cost, access, process=None, os=None, prob=1.0, req_access=AccessLevel.USER, **kwargs)
参数:
- target ( ( int , int ) ) – 目标地址
- cost ( float ) – 执行动作的成本
- access ( int ) – 权限提升产生的访问级别
- process ( str , optional ) – 目标进程,如果 None 动作不需要进程工作(默认=None)
- os ( str , optional ) – 提权操作的目标操作系统,如果没有,则操作适用于所有操作系统(默认=无)
- prob ( float , optional ) – 成功概率(默认=1.0)
- req_access ( AccessLevel , optional ) – 执行操作所需的访问级别(默认=AccessLevel.USER)
class nasim.envs.action.ProcessScan(target, cost, prob=1.0, req_access=AccessLevel.USER, **kwargs)
环境中的进程扫描操作,从基本动作类操作。
__init__(target, cost, prob=1.0, req_access=AccessLevel.USER, **kwargs)
参数:
- target ( ( int , int ) ) – 目标地址
- cost ( float ) – 执行动作的成本
- prob ( float , optional ) -- 给定操作的成功概率(默认=1.0)
- req_access ( AccessLevel , optional ) – 执行操作所需的访问级别(默认=AccessLevel.USER)
class nasim.envs.action.ServiceScan(target, cost, prob=1.0, req_access=AccessLevel.USER, **kwargs)
环境中的服务扫描操作,从基本动作类继承。
__init__(target, cost, prob=1.0, req_access=AccessLevel.USER,**kwargs)
参数:
- target ( ( int , int ) ) – 目标地址
- cost ( float ) – 执行动作的成本
- prob ( float , optional ) -- 给定操作的成功概率(默认=1.0)
- req_access ( AccessLevel , optional ) – 执行操作所需的访问级别(默认=AccessLevel.USER)
class nasim.envs.action.SubnetScan(target, cost, prob=1.0, req_access=AccessLevel.USER, **kwargs)
环境中的子网扫描操作,从基本动作类继承。
__init__(target, cost, prob=1.0, req_access=AccessLevel.USER, **kwargs)
参数:
- target ( ( int , int ) ) – 目标地址
- cost ( float ) – 执行动作的成本
- prob ( float , optional ) -- 给定操作的成功概率(默认=1.0)
- req_access ( AccessLevel , optional ) – 执行操作所需的访问级别(默认=AccessLevel.USER)
nasim.envs.action.load_action_list(scenario)
加载给定场景的环境操作列表。返回环境中的所有动作列表,list