返回文章列表

Nmap指令碼漏洞探索與Nessus自動化掃描

本文介紹如何使用 Nmap 指令碼探索 SSH 和 FTP 等服務漏洞,並探討 Nessus 和 OpenVAS 漏洞掃描器的使用,包含安裝、設定、執行掃描及產生報告。此外,文章也示範如何使用 Python 的 `nessrest` 和 `python-gvm`

資安 Web 開發

Nmap 提供豐富的指令碼,能有效探索特定服務並檢測漏洞,例如使用 ssh2-enum-algos 指令碼列舉 SSH 伺服器支援的演算法,或使用 ftp-anon 指令碼檢測 FTP 匿名登入漏洞。文章也提供 Python 指令碼範例,示範如何非同步執行 Nmap 指令碼,提升掃描效率。除了 Nmap,Nessus 和 OpenVAS 也是常用的漏洞掃描工具。Nessus 提供網頁介面設定掃描任務、檢視報告,並能匯出不同格式的報告檔案。OpenVAS 則是一個開源的漏洞掃描器,提供全面的安全評估。透過 Python 的 nessrestpython-gvm 模組,可以分別與 Nessus 和 OpenVAS 互動,自動化執行掃描、取得結果並客製化報告流程,大幅提升資安評估的效率和彈性。

使用 Nmap 指令碼探索服務與漏洞

Nmap 提供了一系列指令碼,用於探索特定服務和檢測漏洞。這些指令碼能夠提供有關目標系統的額外資訊,有助於進一步的安全評估。

使用 Nmap 指令碼探索 SSH 服務

Nmap 的 ssh2-enum-algos 指令碼可用於列舉 SSH 伺服器支援的演算法。以下範例展示瞭如何使用此指令碼:

$ sudo nmap -sSV -p22 --script ssh2-enum-algos scanme.nmap.org

內容解密:

此命令使用 Nmap 對 scanme.nmap.org 的 22 埠進行掃描,並執行 ssh2-enum-algos 指令碼,以取得 SSH 伺服器支援的演算法資訊。

  • -sSV 引數用於進行 TCP SYN 掃描並檢測服務版本。
  • -p22 指定掃描的埠為 22(SSH 埠)。
  • --script ssh2-enum-algos 指定要執行的 Nmap 指令碼。

執行結果將顯示 SSH 伺服器支援的金鑰交換演算法、伺服器主機金鑰演算法等資訊。

使用 Nmap 指令碼檢測 FTP 服務漏洞

Nmap 提供了多個指令碼用於檢測 FTP 服務的漏洞。例如,ftp-anon 指令碼可用於檢測是否允許匿名登入。

$ sudo nmap -sSV -p21 --script ftp-anon ftp.be.debian.org

內容解密:

此命令對 ftp.be.debian.org 的 21 埠進行掃描,並執行 ftp-anon 指令碼,以檢測是否允許匿名 FTP 登入。

  • 如果允許匿名登入,指令碼將顯示 FTP 根目錄下的檔案和目錄列表。

非同步執行 Nmap 指令碼

以下 Python 指令碼範例展示瞭如何非同步執行 Nmap 指令碼,以檢測 FTP 服務的漏洞:

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

def callbackFTP(host, result):
    try:
        script = result['scan'][host]['tcp'][21]['script']
        print("Command line: " + result['nmap']['command_line'])
        for key, value in script.items():
            print('Script {0} --> {1}'.format(key, value))
    except KeyError:
        pass

class NmapScannerAsyncFTP:
    def __init__(self):
        self.portScanner = nmap.PortScanner()
        self.portScannerAsync = nmap.PortScannerAsync()

    def scanning(self):
        while self.portScannerAsync.still_scanning():
            print("Scanning >>>")
            self.portScannerAsync.wait(10)

    def nmapScanAsync(self, hostname, port):
        try:
            print("Checking port " + port + " ..........")
            self.portScanner.scan(hostname, port)
            self.state = self.portScanner[hostname]['tcp'][int(port)]['state']
            print(" [+] " + hostname + " tcp/" + port + " " + self.state)
            if (port == '21') and self.portScanner[hostname]['tcp'][int(port)]['state'] == 'open':
                print('Checking ftp port with nmap scripts......')
                self.portScannerAsync.scan(hostname, arguments="-A -sV -p21 --script ftp-anon.nse", callback=callbackFTP)
                self.scanning()
                # 繼續執行其他 FTP 相關指令碼
        except Exception as exception:
            print("Error to connect with " + hostname + " for port scanning", str(exception))

# 使用範例
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Nmap Scanner Async FTP')
    parser.add_argument('--host', help='Hostname or IP address', required=True)
    args = parser.parse_args()
    scanner = NmapScannerAsyncFTP()
    scanner.nmapScanAsync(args.host, '21')

內容解密:

此 Python 指令碼使用 nmap 模組非同步執行 Nmap 指令碼,以檢測 FTP 服務的漏洞。

  • callbackFTP 函式在 Nmap 掃描完成後被呼叫,用於處理掃描結果。
  • NmapScannerAsyncFTP 類別封裝了 Nmap 掃描的功能,包括同步和非同步掃描。
  • nmapScanAsync 方法用於非同步執行 Nmap 指令碼,並在檢測到 FTP 埠開放時執行相關指令碼。

與漏洞掃描器互動

在本章中,我們將學習Nessus和OpenVAS漏洞掃描器,以及它們為報告伺服器和Web應用程式中的漏洞提供的報告工具。同時,我們還將介紹如何使用Python透過nessrestpython-gvm模組以程式設計方式使用它們。在獲得有關系統(包括其服務、連線埠和作業系統)的資訊後,這些工具提供了一種方法,可以從網際網路上不同的資料函式庫(如CVE和NVD)取得漏洞資訊。

技術需求

安裝模組

sudo apt-get install python3
sudo apt-get install python3-setuptools
sudo pip3 install nessrest
sudo pip3 install python-gvm

內容解密:

上述指令用於在根據Debian的Linux作業系統環境中安裝Python 3以及nessrestpython-gvm模組。其中:

  • sudo apt-get install python3:安裝Python 3。
  • sudo apt-get install python3-setuptools:安裝Python 3的setup工具。
  • sudo pip3 install nessrest:使用pip3安裝nessrest模組,用於與Nessus互動。
  • sudo pip3 install python-gvm:使用pip3安裝python-gvm模組,用於與OpenVAS互動。

瞭解漏洞和漏洞利用

漏洞是指應用程式碼中的錯誤或組態問題,攻擊者可以利用這些問題來改變應用程式的行為,例如注入程式碼或存取私人資料。漏洞也可能是指系統安全性中的弱點,可以被利用來取得對系統的存取許可權。這些漏洞可以透過兩種方式被利用:遠端和本地。

遠端攻擊與本地攻擊

遠端攻擊是指從與被攻擊機器不同的機器上發起的攻擊,而本地攻擊則是在被攻擊的機器上本地執行的攻擊。這些攻擊根據一系列技術,旨在取得對該機器的存取許可權並提升許可權。

Nessus漏洞掃描器簡介

Nessus是一款廣泛使用的漏洞掃描工具,用於識別系統和網路中的安全漏洞。它提供了詳細的報告和修復建議,幫助管理員解決安全問題。

OpenVAS漏洞掃描器簡介

OpenVAS(開放式漏洞評估系統)是另一個強大的漏洞掃描工具,提供對系統和網路的全面安全評估。它支援多種掃描技術,並提供詳細的報告和建議。

使用Python存取OpenVAS

透過python-gvm模組,開發者可以使用Python與OpenVAS互動,自動化漏洞掃描和報告流程。

範例程式碼

from gvm.connections import UnixSocketConnection
from gvm.protocols.gmp import Gmp

# 建立與OpenVAS的連線
connection = UnixSocketConnection()
with Gmp(connection=connection) as gmp:
    # 取得所有任務
    tasks = gmp.get_tasks()
    print(tasks)

內容解密:

此範例程式碼展示瞭如何使用python-gvm模組與OpenVAS建立連線並取得所有任務。其中:

  • from gvm.connections import UnixSocketConnection:匯入用於建立Unix通訊端連線的類別。
  • from gvm.protocols.gmp import Gmp:匯入GMP(Greenbone管理協定)類別,用於與OpenVAS互動。
  • connection = UnixSocketConnection():建立一個Unix通訊端連線。
  • with Gmp(connection=connection) as gmp::使用GMP類別建立一個上下文管理器,以便與OpenVAS互動。
  • tasks = gmp.get_tasks():取得所有任務。
  • print(tasks):列印取得的任務資訊。

本章介紹瞭如何使用Python與Nessus和OpenVAS這兩個流行的漏洞掃描器互動,從而自動化安全評估流程並取得詳細的漏洞報告。透過結合Python的靈活性和這些工具的功能,安全專業人員可以更有效地識別和管理系統中的安全風險。

弱點與漏洞攻擊的理解

自動化掃描器的一個主要問題是無法測試所有型別的弱點,且可能產生需要手動調查和分析的誤報。有些弱點未被檢測到,或被歸類別為低優先順序,但實際上可能對系統至關重要,因為我們可以輕易在公開的漏洞資料函式庫(如https://www.exploit-db.com)中找到相關的弱點或漏洞攻擊。

弱點檢測的挑戰

弱點的檢測需要足夠詳細地瞭解應用程式如何與作業系統或其連線的不同服務互動,因為連線的服務中的弱點可能會間接影響正在分析的應用程式。

什麼是漏洞攻擊?

隨著軟體和硬體產業的發展,推出的產品出現了各種弱點,這些弱點被攻擊者發現並利用,以破壞使用這些產品的系統的安全性。

漏洞攻擊的定義

漏洞攻擊是指利用錯誤、故障或弱點的軟體或指令碼,以引起系統或應用程式的不當行為,使惡意使用者能夠強制改變其執行流程,並有可能完全控制系統。

零日漏洞攻擊

有些弱點僅被少數人知曉,稱為零日弱點,可以透過某些漏洞攻擊來利用,這些漏洞攻擊也僅被少數人知曉。這些漏洞攻擊稱為零日漏洞攻擊,因為它們尚未被公開。只要存在暴露視窗,即從發現弱點到製造商提供解決方案之前的時間內,就可能發生透過這些漏洞攻擊發起的攻擊。

弱點格式

弱點由MITRE Corporation建立的通用弱點和暴露(CVE)程式碼格式唯一標識。該程式碼允許使用者以更客觀的方式瞭解程式或系統中的弱點。

CVE程式碼格式

CVE程式碼的格式為CVE-年份-編號;例如,CVE-2020-01標識2020年發現的弱點,編號為01。有多個資料函式庫提供有關不同現有弱點的資訊,其中包括:

  • CVE,代表資訊安全弱點名稱的標準:https://cve.mitre.org/cve
  • 國家弱點資料函式庫(NVD):http://nvd.nist.gov

通常,已發布的弱點會透過概念驗證的方式分配相應的漏洞攻擊。這允許組織的安全管理員測試弱點的真實存在並衡量其在組織內的影響。

CVE資料函式庫的使用

CVE提供了一個非常有用的弱點資料函式庫,除了分析相關弱點外,還提供了大量參考資料,其中我們經常發現直接連結到攻擊該弱點的漏洞攻擊。

範例:查詢OpenSSL相關弱點

如果我們在CVE中搜尋openssl,它會提供在特定函式庫中發現的相關弱點,這些函式庫正在使用此安全模組:https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=openssl。

CVE-2020-7224弱點詳情

在以下URL中,我們可以看到CVE-2020-7224弱點的詳細資訊:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-7224。 在CVE的詳細資訊中,我們可以看到對弱點的描述,包括受影響的版本和作業系統、更多詳細資訊的參考資料、建立日期以及是否已分配解決方案。

使用NIST NVD取得更多資訊

如果我們使用NIST NVD取得有關前述CVE程式碼的資訊,那麼我們可以看到更多資訊,包括弱點的嚴重性、通用弱點評分系統(CVSS)程式碼和根據嚴重性級別的基本評分:https://nvd.nist.gov/vuln/detail/CVE-2020-7224。

CVSS程式碼的作用

CVSS程式碼提供了一套標準化的標準,使我們能夠確定哪些弱點更有可能被成功利用。CVSS程式碼引入了一個評分系統,考慮了一套標準化和易於衡量的標準。

弱點掃描報告中的嚴重性級別

在掃描報告中,根據CVSS為CVE分配的分數,弱點被賦予高、中或低嚴重性。供應商的分數被大多數弱點掃描器用來可靠地衡量嚴重性:

  • 高:弱點的基本CVSS分數範圍從8.0到10.0。
  • 中:弱點的基本CVSS分數範圍從4.0到7.9。
  • 低:弱點的基本CVSS分數範圍從0.0到3.9。

CVSS的三個主要指標群組

CVSS旨在評估弱點的影響,由以下三個主要指標群組組成:

  • 基本群組:涵蓋了與時間和環境無關的弱點固有特徵。
  • 時間群組:隨著時間變化的弱點特徵。
  • 環境群組:與使用者環境相關的弱點特徵。

CVSS版本3的新特性

CVSS版本3的建立旨在修改某些指標並新增一些新的指標,例如範圍指標,試圖補充基本指標的全域評估,並根據利用弱點所影響的許可權和資源,給結果賦予更多或更少的價值。

Nessus弱點掃描器簡介

Nessus是由Tenable公司(https://www.tenable.com)建立的一種具有客戶端-伺服器架構的弱點掃描解決方案。該工具是市場上最流行和結構最完善的弱點掃描器之一。其範圍從作業系統弱點掃描到Web應用程式掃描。

安裝Nessus

我們將首先檢視在您的作業系統上安裝Nessus的主要步驟。

與弱點掃描器 Nessus 互動

安裝與執行 Nessus 弱點掃描器

首先,從官方網站下載 Nessus 安裝程式。下載網址為 https://www.tenable.com/products/nessus/select-your-operating-system,請依照您的作業系統指示進行安裝。

  1. 在安裝過程中,系統會要求您輸入啟動金鑰。請至 https://www.tenable.com/products/nessus/activation-code 註冊並取得啟動碼。

  2. 若下載的是適用於 Debian 作業系統的 .deb 檔案,可以使用以下指令進行安裝:

    $ dpkg -i Nessus-8.11.0-ubuntu1110_amd64.deb
    

    安裝完成後,您可以透過執行 /etc/init.d/nessusd start 來啟動 Nessus 掃描器。

  3. 開啟瀏覽器並存取 https://127.0.0.1:8834 以組態掃描器。首次執行時,Nessus 需要更新和安裝外掛程式,這可能需要 30 分鐘或更長時間。

重點注意事項

Nessus 使用網頁介面來設定、搜尋和顯示報告。首次連線時,您需要接受憑證。請注意,在正式環境中使用自簽憑證並非最佳實踐。

設定與執行 Nessus 掃描

  1. 在 Nessus 主介面,您可以啟動主機探索掃描以識別網路上可用的主機。
  2. 在「My Scans」標籤中,您可以檢視掃描結果。例如,您可以對本機執行基本掃描:

    基本掃描範例

    使用「Basic Network Scan」範本對組織內部系統進行全面掃描。

Nessus 弱點報告

Nessus 提供的報告包含依嚴重性等級排序的弱點摘要。「Vulnerabilities」標籤顯示了發現的弱點名稱、使用的外掛程式、類別、出現次數和嚴重性。

弱點報告詳細資訊

報告中包含每個弱點的詳細資訊,例如名稱、嚴重性和 CVSS 風險資訊。您可以將報告匯出為 PDF、HTML 或 CSV 格式。

使用 Python 存取 Nessus API

Python 的 nessrest 模組提供了一個與 Nessus 弱點掃描器互動的介面,讓您可以自動化執行掃描和取得掃描清單的流程。

程式碼範例:使用 nessrest 模組

import nessrest

# 初始化 Nessus 連線
conn = nessrest.NessusRestAPI(url='https://127.0.0.1:8834', 
                              username='your_username', 
                              password='your_password')

# 取得掃描清單
scans = conn.get_scans()

# 列出掃描結果
for scan in scans['scans']:
    print(scan['name'])

內容解密:

  1. 匯入 nessrest 模組:首先,我們需要匯入 nessrest 模組以便使用其提供的 Nessus API 介面。
  2. 初始化 Nessus 連線:使用 NessusRestAPI 類別初始化與 Nessus 伺服器的連線,提供 URL、使用者名稱和密碼。
  3. 取得掃描清單:透過 get_scans() 方法取得目前的掃描清單,並將結果儲存在 scans 變數中。
  4. 列出掃描結果:遍歷 scans['scans'] 中的每個掃描,並列印出其名稱。

Nessus 提供了一個功能強大的弱點掃描解決方案,不僅能夠進行全面的系統掃描,還能夠提供詳細的弱點報告和分析。透過 Python 的 nessrest 模組,您可以進一步自動化 Nessus 的操作,提升安全性管理的效率。