返回文章列表

Nessus OpenVAS 弱點掃描器 API 互動

本文探討 Nessus 和 OpenVAS 兩款主流弱點掃描器的 API 互動方式,提供 Python 程式碼範例,示範如何使用 Nessus 和 OpenVAS API 進行掃描任務管理、結果分析及資訊擷取,並解析 OpenVAS 的 Docker 安裝流程及網頁介面操作。

資安 Web 開發

在網路安全領域,弱點掃描是保護系統的關鍵步驟。本文將探討如何使用 Python 與 Nessus 和 OpenVAS 這兩款常見的弱點掃描器互動,包含 API 使用、程式碼範例以及 OpenVAS 的安裝和操作。透過 API 的整合,可以自動化掃描任務、分析結果並提升弱點管理效率。文章將提供實務程式碼,協助讀者快速上手並應用於實際場景,強化網路安全防護。

import requests
import json

class NessusClient:
    def __init__(self, nessusServer, nessusPort):
        self.nessusServer = nessusServer
        self.nessusPort = nessusPort
        self.url = 'https://' + str(nessusServer) + ':' + str(nessusPort)
        self.token = None
        self.headers = {}
        self.bodyRequest = {}

    def get_request(self, url):
        response = requests.get(url, data=self.bodyRequest, headers=self.headers, verify=False)
        return json.loads(response.content)

    def post_request(self, url):
        response = requests.post(url, data=self.bodyRequest, headers=self.headers, verify=False)
        return json.loads(response.content)

    def request_api(self, service, params={}):
        self.headers = {'Host': str(self.nessusServer) + ':' + str(self.nessusPort),
                        'Content-type': 'application/x-www-form-urlencoded',
                        'X-Cookie': 'token=' + self.token}
        content = self.get_request(self.url + service)
        return content

    def login(self, nessusUser, nessusPassword):
        headers = {'Host': str(self.nessusServer) + ':' + str(self.nessusPort),
                   'Content-type': 'application/x-www-form-urlencoded'}
        params = {'username': nessusUser, 'password': nessusPassword}
        self.bodyRequest.update(params)
        self.headers.update(headers)
        content = self.post_request(self.url + "/session")
        if "token" in content:
            self.token = content['token']
        return content

與弱點掃描器互動:Nessus API 的 Python 應用

在前面的章節中,我們探討瞭如何利用 Python 來存取 Nessus API。現在,讓我們進一步瞭解如何與 Nessus 伺服器互動。

初始化 Nessus 掃描器

要從 Python 與 Nessus 伺服器互動,我們需要使用 ness6rest.Scanner 類別來初始化掃描器,並傳遞使用者名稱和密碼作為 URL 引數來存取 Nessus 伺服器例項。

import nessrest
from nessrest import ness6rest

# 初始化掃描器
scanner = ness6rest.Scanner(url="https://server:8834", login="username", password="password")

內容解密:

  • ness6rest.Scanner 是用於與 Nessus 伺服器互動的主要類別。
  • 初始化時需要提供 Nessus 伺服器的 URL、登入使用者名稱和密碼。
  • 在預設情況下,Nessus 使用自簽名憑證,但可以透過設定 insecure=True 來停用 SSL 憑證檢查。

與 Nessus 伺服器互動

在初始化掃描器後,我們可以使用它提供的方法來執行各種操作,例如新增掃描、執行掃描、取得掃描結果等。

# 新增掃描目標
scan.scan_add(targets="ip_address")

# 執行掃描
scan.scan_run()

# 取得掃描列表
scan.scan_list()

# 取得特定掃描的詳細資訊
scan.scan_details(scan_name)

內容解密:

  • scan_add 方法用於新增掃描目標。
  • scan_run 方法用於執行掃描。
  • scan_list 方法用於取得掃描列表。
  • scan_details 方法用於取得特定掃描的詳細資訊。

範例程式碼:取得 Nessus 掃描列表

以下是一個完整的範例程式碼,示範如何連線到本地的 Nessus 伺服器並取得掃描列表。

#!/usr/bin/env python3
import ness6rest
import argparse

nessus_url = "https://localhost:8834"

parser = argparse.ArgumentParser()
parser.add_argument('--login', required=True)
parser.add_argument('--password', required=True)
args = parser.parse_args()

scan = ness6rest.Scanner(url=nessus_url, login=args.login, password=args.password, insecure=True)

print(scan.scan_list())

scans = scan.scan_list()['scans']
for detail_scan in scans:
    print(scan.scan_details(detail_scan['name']))

內容解密:

  • 程式碼首先匯入必要的模組,並設定 Nessus 伺服器的 URL。
  • 使用 argparse 模組來解析命令列引數,取得登入使用者名稱和密碼。
  • 初始化 ness6rest.Scanner 物件,並呼叫 scan_list 方法來取得掃描列表。
  • 對於每個掃描,呼叫 scan_details 方法來取得其詳細資訊。

直接使用 Nessus API

除了使用 ness6rest 模組外,我們也可以直接使用 Nessus API 來與伺服器互動。Nessus API 的檔案可以在 https://localhost:8834/api#/overview 找到。

#!/usr/bin/env python3
import requests
import json

class NessusClient():
    def __init__(self, nessusServer, nessusPort):
        self.nessusServer = nessusServer
        self.nessusPort = nessusPort

    # 其他方法實作...

內容解密:

  • 直接使用 Nessus API 需要自行處理 HTTP 請求和 JSON 資料的解析。
  • 可以使用 requests 模組來傳送 HTTP 請求,並使用 json 模組來處理 JSON 資料。

與漏洞掃描器互動:Nessus 與 OpenVAS 技術深度解析

在網路安全領域中,漏洞掃描器扮演著至關重要的角色,用於識別系統和網路中的潛在安全漏洞。本篇文章將探討兩款流行的漏洞掃描工具——Nessus 和 OpenVAS——並提供與其互動的技術細節。

Nessus 漏洞掃描器互動實務

Nessus API 連線與認證實作

Nessus 提供了一套完整的 API,允許開發者與其進行互動。以下是一個 Python 類別 NessusClient 的範例,用於建立與 Nessus 伺服器的連線並執行相關操作:

import requests
import json

class NessusClient:
    def __init__(self, nessusServer, nessusPort):
        self.nessusServer = nessusServer
        self.nessusPort = nessusPort
        self.url = 'https://' + str(nessusServer) + ':' + str(nessusPort)
        self.token = None
        self.headers = {}
        self.bodyRequest = {}

    def get_request(self, url):
        response = requests.get(url, data=self.bodyRequest, headers=self.headers, verify=False)
        return json.loads(response.content)

    def post_request(self, url):
        response = requests.post(url, data=self.bodyRequest, headers=self.headers, verify=False)
        return json.loads(response.content)

    #### 內容解密:
    # 上述程式碼定義了 `NessusClient` 類別的基本結構,包括初始化方法、GET 和 POST 請求方法。
    # `get_request` 和 `post_request` 方法封裝了與 Nessus API 互動的 HTTP 請求。

    def request_api(self, service, params={}):
        self.headers = {'Host': str(self.nessusServer) + ':' + str(self.nessusPort),
                        'Content-type': 'application/x-www-form-urlencoded',
                        'X-Cookie': 'token=' + self.token}
        content = self.get_request(self.url + service)
        return content

    #### 內容解密:
    # `request_api` 方法負責設定請求頭並執行 GET 請求,用於與 Nessus API 互動。

    def login(self, nessusUser, nessusPassword):
        headers = {'Host': str(self.nessusServer) + ':' + str(self.nessusPort),
                   'Content-type': 'application/x-www-form-urlencoded'}
        params = {'username': nessusUser, 'password': nessusPassword}
        self.bodyRequest.update(params)
        self.headers.update(headers)
        content = self.post_request(self.url + "/session")
        if "token" in content:
            self.token = content['token']
        return content

    #### 內容解密:
    # `login` 方法用於登入 Nessus 伺服器並取得認證 token,以便進行後續操作。

# 使用範例
parser = argparse.ArgumentParser()
parser.add_argument('--user', required=True)
parser.add_argument('--password', required=True)
args = parser.parse_args()
user = args.user
password = args.password
client = NessusClient('127.0.0.1', '8834')
client.login(user, password)
print(client.request_api('/server/status'))
scans = client.request_api('/scans')['scans']
for scan in scans:
    vulnerabilities = client.request_api('/scans/' + str(scan['id']))['vulnerabilities']
    for vuln in vulnerabilities:
        print(vuln['plugin_family'], vuln['plugin_name'])

#### 內容解密:
# 上述程式碼展示瞭如何使用 `NessusClient` 類別登入 Nessus 伺服器、取得掃描列表及其詳細資訊。

OpenVAS 漏洞掃描器簡介與安裝

OpenVAS(開放漏洞評估系統)是一款廣泛使用的開源漏洞掃描和管理解決方案。以下是 OpenVAS 的安裝步驟:

  1. 安裝 OpenVAS:在根據 Debian 的系統中,可以使用 apt-get 安裝 OpenVAS。
    $ sudo apt-get install OpenVAS
    
  2. 設定 OpenVAS:執行 OpenVAS-setup 命令以完成初始設定,包括下載最新的漏洞簽名、建立管理員使用者等。
    $ sudo OpenVAS-setup
    
  3. 啟動 OpenVAS 服務:使用 OpenVAS-start 命令啟動必要的服務。
    $ OpenVAS-start
    
  4. 檢查服務狀態:驗證 OpenVAS 相關服務是否正常執行。
    $ systemctl status openvas-scanner.service
    $ systemctl status openvas-scanner.manager
    $ systemctl status greenbone-security-assistant.service
    

內容解密:

上述步驟指導如何在 Linux 系統上安裝和設定 OpenVAS,用於漏洞掃描和管理。

OpenVAS 弱點掃描器介紹與操作

OpenVAS(開放式弱點評估系統)是一款強大的弱點掃描工具,主要由三個服務組成:掃描服務、管理服務和客戶端服務。掃描服務負責執行弱點分析;管理服務負責結果的過濾、分類別以及資料函式庫的管理;客戶端服務則提供圖形化的網頁介面,用於組態 OpenVAS 和呈現掃描結果。

安裝 OpenVAS

安裝 OpenVAS 的方式有多種,其中一種簡便的方法是使用 Docker 映像檔。使用者可以在 https://github.com/mikesplain/openvas-docker 找到相關的 Docker 映像檔。安裝 Docker 後,只需下載映像檔並執行以下命令即可啟動 OpenVAS 服務:

$ docker run -d -p 443:443 -p 9390:9390 --name OpenVAS mikesplain/openvas

內容解密:

此命令使用 Docker 啟動 OpenVAS 容器,將容器的 443 和 9390 連線埠對應到主機的相同連線埠,並命名容器為 OpenVAS。其中:

  • -d 表示以分離模式執行容器。
  • -p 用於連線埠對應,使外部能夠存取容器內的服務。
  • --name 用於指定容器的名稱。

使用 OpenVAS 網頁介面

成功安裝並啟動 OpenVAS 後,可以透過網址 https://localhost:9392 存取其網頁介面。首次登入時,使用者名稱為 admin,密碼則是在初始組態過程中自動生成的。

OpenVAS 網頁介面主要功能

  1. 儀錶板(Dashboard):提供有關弱點管理、已掃描主機和最近發布的弱點揭露等資訊。
  2. 掃描管理(Scan Management):允許使用者建立新的掃描任務或修改現有的任務。
  3. 資產管理(Asset Management):列出已分析的主機及其發現的弱點數量。
  4. 安全資訊(SecInfo):儲存所有弱點的詳細資訊及其 CVE 編號。
  5. 組態(Configuration):允許使用者組態掃描目標、分配存取憑證、設定掃描引數和排程掃描任務等。

使用 OpenVAS 掃描主機

使用 OpenVAS 掃描主機的過程包括以下步驟:

  1. 建立目標(Target):指定要掃描的主機 IP 位址或範圍,並選擇要掃描的連線埠。
  2. 建立任務(Task):將目標與掃描組態關聯起來,並可設定掃描排程。
  3. 排程任務:設定掃描的型別和強度,例如「完整且快速」或「完整且非常深入」。
  4. 分析報告:檢視掃描結果,瞭解主機上的弱點。

建立目標

在 OpenVAS 網頁介面中,點選具有藍色背景和白色星號的圖示以建立新的目標。在彈出的視窗中,輸入目標名稱和 IP 位址,並選擇要掃描的連線埠範圍。

建立目標關鍵設定

  • 手動輸入目標 IP 位址。
  • 選擇要掃描的連線埠列表,例如所有 TCP 和 UDP 連線埠。

建立任務

建立任務時,需要選擇之前建立的目標,並組態掃描選項,例如掃描強度和排程。

任務組態關鍵選項

  • 掃描目標(Scan Targets):選擇要掃描的目標。
  • 最小檢測品質(Min QoD):設定 OpenVAS 顯示可能的真實威脅。
  • 掃描組態(Scan Config):選擇掃描的強度,例如「完整且快速」或「完整且非常深入」。

分析報告

在「掃描管理 | 報告」部分,可以檢視每個已執行任務的報告。點選報告名稱即可檢視詳細的弱點資訊。

報告分析重點

  • 弱點的嚴重程度和詳細描述。
  • 弱點的 CVE 編號和相關資訊。

與弱點掃描器的互動作用

在以下的螢幕截圖中,我們可以看到按照嚴重性(高、中、低)分類別的結果摘要: 此圖示顯示了OpenVAS掃描報告的摘要。分析掃描結果時,我們可以按照嚴重性等級、作業系統、主機和埠號對弱點進行分類別,如前面的螢幕截圖所示。

當我們點選任何弱點名稱時,都會獲得有關該弱點的詳細資訊概述。以下詳細資訊適用於與使用預設憑證存取OpenVAS Manager工具相關的弱點: 此圖示顯示了OpenVAS弱點的詳細資訊。在這個畫面上,我們可以看到已發現的弱點詳細資訊。對於每個弱點,除了對問題的一般性描述外,我們還可以看到一些有關如何解決問題的詳細資訊(通常涉及更新特定程式函式庫或軟體的版本)。

OpenVAS弱點掃描器介紹

OpenVAS提供了一個資料函式庫,使安全研究人員和軟體開發人員能夠識別哪個版本的程式修復了特定的問題。如前面的螢幕截圖所示,我們還可以找到指向軟體製造商網站的連結,其中包含有關如何修復弱點的詳細資訊。

當分析任務完成後,我們可以點選報告日期以檢視我們正在分析的機器中可能存在的風險。最後,我們還可以將報告以多種格式匯出。我們可以透過從下拉式選單中選擇所需的格式並點選綠色的匯出圖示來實作這一點。在報告部分,GreenBone為我們提供了不同的匯出格式,其中我們重點介紹HTML、PDF和CSV: 此圖示顯示了OpenVAS匯出選項。

使用Python存取OpenVAS

我們可以使用python-gvm模組自動取得儲存在OpenVAS伺服器中的資訊。該模組提供了一個介面,用於與OpenVAS伺服器的弱點掃描功能進行互動。

程式碼範例1:取得OpenVAS版本

#!/usr/bin/env python3
import gvm
from gvm.protocols.latest import Gmp

connection = gvm.connections.TLSConnection(hostname='localhost')
with Gmp(connection=connection) as gmp:
    version = gmp.get_version()
    print(version)

內容解密:

  1. 使用gvm模組建立與OpenVAS伺服器的連線。
  2. 使用TLSConnection類別連線到本地主機上的伺服器。
  3. 使用Gmp類別與OpenVAS伺服器進行互動,並取得其版本資訊。
  4. 列印出OpenVAS伺服器的版本。

程式碼範例2:取得OpenVAS資訊

#!/usr/bin/env python3
import gvm
from gvm.protocols.latest import Gmp
from gvm.transforms import EtreeCheckCommandTransform
from gvm.errors import GvmError

connection = gvm.connections.TLSConnection(hostname='localhost')
username = 'admin'
password = 'admin'
transform = EtreeCheckCommandTransform()

try:
    with Gmp(connection=connection, transform=transform) as gmp:
        gmp.authenticate(username, password)
        # 取得使用者、任務、目標、掃描器、組態、饋送和NVT的資訊
        users = gmp.get_users()
        tasks = gmp.get_tasks()
        targets = gmp.get_targets()
        scanners = gmp.get_scanners()
        configs = gmp.get_configs()
        feeds = gmp.get_feeds()
        nvts = gmp.get_nvts()
        
        # 列印出各類別資訊
        print("Users\n
---
-
---
-
---
-")
        for user in users.xpath('user'):
            print(user.find('name').text)
        
        print("\nTasks\n
---
-
---
-
---
-")
        for task in tasks.xpath('task'):
            print(task.find('name').text)
        
        # 省略其他類別的列印程式碼...
except GvmError as e:
    print(f"Error: {e}")

內容解密:

  1. 使用gvm模組建立與OpenVAS伺服器的連線,並進行身份驗證。
  2. 使用Gmp類別提供的方法取得各種資訊,如使用者、任務、目標等。
  3. 使用XPath表示式解析XML回應,並列印出所需資訊。
  4. 處理可能發生的GvmError例外。