Masimaro's blog - 网络安全
type: channel
link: https://www.masimaro.top/tag/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/
items: 使用Python调用Nessus 接口实现自动化扫描

使用Python调用Nessus 接口实现自动化扫描
type: item
date: 2020-01-12T14:37:00+08:00
description: 之前在项目中需要接入nessus扫描器，研究了一下nessus的api，现在将自己的成果分享出来。Nessus提供了丰富的二次开发接口，无论是接入其他系统还是自己实现自动化扫描，都十分方便。同时Nessus也提供了完备的API文档，可以在 Settings->My Account->API Keys->API documentation认证nessus提供两种认证方式，第一种采用常规的登录后获取token的方式，在https://localhost:8834/api#/resources/session条目中可以找到这种方式，它的接口定义如下:POST /session { "username":{string}, "password":{string} }输入正确的用户名和密码，登录成功后会返回一个token{ "token": {string} }在后续请求中，将token放入请求头信息中请求头的key为X-Cookie，值为 token=xxxx，例如 :X-Cookie: token=5fa3d3fd97edcf40a41bb4dbdfd0b470ba45dde04ebc37f8;，下面是获取任务列表的例子import requests import json def get_token(ip, port, username, password): url = "https://{0}:{1}/session".format(ip, port) post_data = { 'username': username, 'password': password } respon = requests.post(url, data=post_data, verify=False) if response.status_code == 200: data = json.loads(response.text) return data["token"] def get_scan_list() # 这里ip和port可以从配置文件中读取或者从数据库读取，这里我省略了获取这些配置值得操作 url = "https://{ip}:{port}/scans".format(ip, port) token = get_token(ip, port, username, password) if token: header = { "X-Cookie":"token={0}".format(token), "Content-Type":"application/json" } response = requests.get(url, headers=header, verify=False) if response.status_code == 200: result = json.loads(respon.text) return result第二种方式是使用Nessus生成的API Key，这里我们可以依次点击 Settings->My Account->API Keys-->Generate按钮，生成一个key，后续使用时填入头信息中，还是以获取扫描任务列表作为例子def get_scan_list() accessKey = "XXXXXX" #此处填入真实的内容 secretKey = "XXXXXX" #此处填入真实内容 url = "https://{ip}:{port}/scans".format(ip, port) token = get_token(ip, port, username, password) if token: header = { 'X-ApiKeys': 'accessKey={accesskey};secretKey={secretkey}'.format(accesskey=accessKey, secretkey=secretKey) "Content-Type":"application/json" } response = requests.get(url, headers=header, verify=False) if response.status_code == 200: result = json.loads(respon.text) return result对比来看使用第二种明显方便一些，因此后续例子都采用第二种方式来呈现策略模板配置策略模板的接口文档在 https://localhost:8834/api#/resources/policies 中。创建策略模板创建策略模板使用的是 策略模板的create接口，它里面有一个必须填写的参数 uuid 这个参数是一个uuid值，表…