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

那么如何获得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']
至此我们已经完成了整个扫描从创建到发起再到分析的所有环节,希望能对大家有所启发。