聊一下 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,謝謝 ~ :)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM