欢迎来到starnight_cyber的博客

聊一下 Nessus REST API 封装

前言

Nessus 作为主机扫描的一款经典工具,功能比较丰富,工具本身就不多做介绍了。

我们希望能将 Nessus Scanner 节点进行封装,作为自研扫描调度系统中的一类扫描节点,作为基础例行安全扫描。

Github : https://github.com/starnightcyber/nessus_api

此外,官方已有封装(Nessus 6):https://github.com/tenable/nessrest,但这个已经比较陈旧了。

准备工作

Nessus 环境搭建

简单介绍下环境搭建部分,我们使用前人已经搭好的 Docker 镜像 leishianquan/awvs-nessus,致敬。

# docker search awvs
NAME                          DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
secfa/docker-awvs             AWVS 14.6.211220100  Linux Version Crack By …   74                                      
leishianquan/awvs-nessus 25 
...
# 拉取镜像
docker pull leishianquan/awvs-nessus:v1
# 启动
docker run -it -d -p 13443:3443 -p 8834:8834 leishianquan/awvs-nessus:v1
# 查看容器
docker ps –a
# 启动容器
docker start container-id
# 进入容器
docker exec –it container-id /bin/bash
# 进入容器后,启动nessus
/etc/init.d/nessusd start
# 访问扫描器地址和账号密码
Nessus:
https://127.0.0.1:8834/#/
account:leishi/leishianquan
Awvs13:
https://127.0.0.1:13443/
account:admin@admin.com/Admin123

Note: awvs-nessus镜像比较大,9.01GB,请自行解决。

修改默认密码,请参考 https://www.cnblogs.com/Hi-blog/p/Nessus-AWVS-Docker.html

Nessus REST API AK/SK 生成

安装启动,登录之后,点击右上角图标 >> My Account >> API Keys,或者直接访问如下链接:

https://127.0.0.1:8834/#/settings/my-account/api-keys

点击 Generate >>

 

 

Note:保存好该 AK/SK(64位),只会展示一次,eg.

ak = '91f4e8d70e828f63df0d2d9c0c593f19e0e6f5f5406b88cc4f5be9a53fd4f572'
sk = '0b78e392b54f4847ba91a95833f09b308ad7018f1f34556923de46e16aa7baf1'

后续就只使用该 AK/SK,不会使用 Nessus console 登录的用户名密码。

Nessus REST API Doc

安装好 Nessus 扫描器之后,会自带 API 文档,https://127.0.0.1:8834/api#/overview

Resource Type

所有资源类型如下:

agent-groups
agents
editor
file
folders
groups
mail
migration
permissions
plugin-rules
plugins
policies
proxy
scanners
scans
server
session
settings
software-update
tokens
users

我们不会封装所有的接口,只需要封装其中一部分即可达成我们的需求,而且有些操作的参数较多,具体可以查看上述文档链接。

后面会介绍如何自己动手去封装所需的操作。

AK/SK 使用示例

 认证授权 https://127.0.0.1:8834/api#/authorization

需要设置 HTTP 请求头 X-ApiKeys,填充 AK/SK 信息

X-ApiKeys: accessKey={accessKey}; secretKey={secretKey};

curl 示例说明 

curl -H "X-ApiKeys: accessKey={accessKey}; secretKey={secretKey}" https://localhost:8834/scans

获取 folders 信息示例

curl -k -H "X-ApiKeys: accessKey=91f4e8d70e828f63df0d2d9c0c593f19e0e6f5f5406b88cc4f5be9a53fd4f572; secretKey=0b78e392b54f4847ba91a95833f09b308ad7018f1f34556923de46e16aa7baf1" https://127.0.0.1:8834/folders | python -m json.tool
{
    "folders": [
        {
            "custom": 0,
            "default_tag": 0,
            "id": 6,
            "name": "Trash",
            "type": "trash",
            "unread_count": null
        },
        {
            "custom": 0,
            "default_tag": 1,
            "id": 7,
            "name": "My Scans",
            "type": "main",
            "unread_count": 13
        }
    ]
}

REST API 封装

到这里我们可以尝试自己封装一下 Nessus REST API 提供的操作,以创建一个扫描任务,这里可以借助我们的好伙伴 BurpSuite,可以让我们更直观的查看需要设置的参数。

我们在 Nessus console 操作,使用自定义扫描策略,创建一个扫描任务。

 

 同时对照着官方文档说明,封装对应的功能操作, https://127.0.0.1:8834/api#/resources/scans/create

    def create_scan(self, targets, name='nessus scan', description='nessus', folder_id='', policy_id='8'):
        '''
        创建扫描任务,需至少填充扫描策略参数,建议备注清楚 name 及其它参数
        Create a scan, must set policy_id parameter to specify the scan policy
        :param targets: scan target ips
        :param name: scan task name
        :param description: scan task description
        :param folder_id: put the task to folder_id
        :param policy_id: using which scan policy
        :return: None
        '''
        print('[*] create_scan ...')
        # POST /scans
        url = '{}/{}'.format(self.url, 'scans')
        # print('url => {}'.format(url))
        # nesssus 创建任务时,使用 burpsuite 抓个包,就是需要填充的数据字段
        data = {
            "uuid": "ad629e16-03b6-8c1d-cef6-ef8c9dd3c658d24bd260ef5f9e66",
            "settings": {
                # "emails": "",
                # "filter_type": "and",
                # "filters": [],
                "launch_now": 'true',      # 是否立即执行,设置为 true 则直接执行,否则只创建任务
                "name": name,
                "description": description,
                "folder_id": folder_id,     # 没有设置 folder_id, 则在 All Scans 可以看到
                "scanner_id": "1",
                "policy_id": policy_id,
                "text_targets": targets,
                # "file_targets": ""
            }
        }
        try:
            resp = requests.post(url=url, headers=self.headers,
                                 data=json.dumps(data, ensure_ascii=False).encode("utf-8"), verify=False)
            if resp.status_code == 200:
                # print(json.dumps(json.loads(resp.content), indent=4, ensure_ascii=False))
                # 创建扫描任务成功,输出 scan_id 和 uuid
                scan_id = json.loads(resp.content)['scan']['id']
                uuid = json.loads(resp.content)['scan']['uuid']
                print('[+] Scan [No.{}] -- {} created succeed ...'.format(scan_id, uuid))
            else:
                print(str(resp.content))
        except Exception as e:
            print(str(e))

不是所有参数都是必要提供的,可以略去一部分非必要参数。为保持完整,代码中仍然保留了。

已封装的功能

目前已封装如下基本操作,能完成当前所需功能,大家可以根据自身需求进一步封装和二次封装。

函数说明
show 展示当前 nessus scanner 节点、扫描策略、目录和扫描任务信息
gen_random_str 生成随机小写字符和数字组合的字符串,默认 6 位
list_folders 列出当前 nessus scanner 的扫描目录
create_folder 创建目录
delete_folder 删除目录
clear_all_folders 删除所有目录
get_scanners 获取 nessus scanner 节点信息
get_scan_policies 获取自定义扫描策略
create_scan 创建扫描任务
launch_scan 启动扫描任务
launch_all_scan 启动所有扫描任务
get_scan_detail 获取扫描任务详细信息
get_all_scans 获取所有扫描任务信息
stop_scan 停止扫描任务
delete_scan 删除扫描任务
clear_all_scans 清理/删除所有扫描任务
export_scan_result 导出扫描任务结果
export_all_scan_results 导出所有扫描任务结果
clear_all 清楚所有自定义目录和扫描任务

使用示例

大家可以使用示例 https://github.com/starnightcyber/nessus_api/blob/main/sample.py

 

 

Further

  • 这里相当于是单个 Nessus 扫描节点,可实现一个类似于 Nessus Manager 的调度功能,来集中展示当期所有 Nessus 扫描节点的情况,根据任务负载更灵活调度。
  • 获取的扫描报告结果,可按漏洞等级进行数据展示,以及报告的中文翻译。

感兴趣的朋友可以一起封装一下,进一步完善,可 PR。

MISC

Nessus REST API 封装:

https://github.com/starnightcyber/nessus_api

个人收藏集合(值得一看):

https://github.com/starnightcyber/Miscellaneous

Nessus 报告转中文:

欢迎 star,谢谢 ~ :)

 

posted @ 2022-02-14 10:47  starnight_cyber  阅读(942)  评论(0编辑  收藏  举报