前言
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 報告轉中文:
- 中文漏洞庫:https://github.com/FunnyKun/NessusReportInChinese
- py2 : https://github.com/Bypass007/Nessus_to_report
- py3 : https://github.com/starnightcyber/Nessus_to_report
歡迎 star,謝謝 ~ :)