天天看点

基于Python的nessus API简析——动态创建任务前言一、创建任务

前言

前面两篇文章我们完成了发起任务并获取结果,不过我们之前运行的任务都是事先建好的,而这个任务运行时,我们对这个任务的启动请求将被拒绝。虽然多任务并发的需要并不多见,但是这里还是介绍一下如何动态的创建一个扫描任务。

一、创建任务

创建任务需要的API和文档链接如下:

POST /scans

https://localhost:8834/api#/resources/scans/create

这个API要求用POST方式传输数据,请求的payload如下:

参数 值类型 描述 是否为必要参数
uuid string 扫描模板的UUID TRUE
settings.name string 扫描器名称 TRUE
settings.description string 扫描器描述 FALSE
settings.policy_id integer 扫描模板ID,policy_id FALSE
settings.folder_id integer 扫描所在文件夹ID FALSE
settings.scanner_id integer 扫描ID FALSE
settings.enabled boolean 是否启用计划扫描 TRUE
settings.launch string 扫描频率 (i.e. ON_DEMAND, DAILY, WEEKLY, MONTHLY, YEARLY) FALSE
settings.starttime string 扫描开始时间 (i.e. YYYYMMDDTHHMMSS). FALSE
settings.rrules string

设置扫描运行规则。

频率 (FREQ=ONCE or DAILY or WEEKLY or MONTHLY or YEARLY)

间隔 (INTERVAL=1 or 2 or 3 ... x)

星期 (BYDAY=SU,MO,TU,WE,TH,FR,SA)

例如要创建星期三和星期五每三周运行一次的扫描

'FREQ=WEEKLY;INTERVAL=3;BYDAY=MO,WE,FR'

FALSE
settings.timezone string 扫描时间表的时区。 FALSE
settings.text_targets string 扫描的目标IP列表 TRUE
settings.file_targets string 包含要扫描的目标列表的文件的名称。 FALSE
settings.emails string 以逗号分隔的将接收电子邮件摘要报告的帐户列表。 FALSE
settings.acls array 包含应用于扫描的权限的数组。 FALSE

新建任务必要的参数分别是

扫描器模板ID:uuid,

扫描名:settings.name

是否启用定时器:settings.enabled

扫描目标:settings.text_targets

其他参数都没什么大问题,按照文档给的要求给就行了,但是这里面的UUID怎么生成呢?

需要注意的是,这里的UUID并不是普通的UUID,而是专指nessus的扫描模板自带的UUID。

没错就是下面这张图里的这些模板,在手动创建任务时,我们直接点击便可,而通过API方式创建时就需要我们通过提供UUID的方式来指定了。

基于Python的nessus API简析——动态创建任务前言一、创建任务

那么如何获得uuid呢?可以通过如下的API来获取:

GET/editor/{type}/templates

https://localhost:8834/api#/resources/editor/list

其中{ type }可以是scan,也可以是policy,这里我不展开了,我们查询scan就行,代码如下:

def get_template_uuid(name='advanced'):
    # 调用/editor/{type}/templates
    url = 'https://localhost:8834/editor/{type}/templates'.format(type='scan')
    # 发送请求
    respon = requests.get(url, headers=header, verify=False)
    templates = json.loads(respon.text)['templates']
    for template in templates:
        if template['name'] == name:
            return template['uuid']
    return None
           

接下来我们就可以动态的创建一个任务了,这里我仅创建一个最简单的任务。如果创建成功,返回值中的respon['scan']['id']便是这个任务的scan_id

def create_scan(uuid, name, text_targets):
    # 调用/scans接口
    url = "https://localhost:8834/scans"
    # post的payload
    data = {}
    data['uuid'] = uuid
    data['settings'] = {}
    data['settings']['name'] = name
    data['settings']['enabled'] = True
    data['settings']['text_targets'] = text_targets

    # 发送请求
    respon = requests.post(url, data=json.dumps(data), headers=header, verify=False)
    return json.loads(respon.text)['scan']['id']
           

至此我们已经完成了整个扫描从创建到发起再到分析的所有环节,希望能对大家有所启发。