返回文章列表

Bash 結合 Nmap 與 Masscan 的網路安全測試技術

本文探討如何結合 Bash、Nmap 和 Masscan 進行網路安全測試,涵蓋了從基本網路掃描到進階應用,並提供實用指令碼與操作指令,有效提升網路測試效率與準確性。同時也介紹了 tmux 的基本操作、網路封包捕捉技術以及 Greenbone

網路安全 Web 開發

在現今複雜的網路環境中,網路安全測試的重要性日益凸顯。本文將引導讀者運用 Bash 指令碼結合 Nmap 和 Masscan 這兩個強大的網路掃描工具,有效提升網路測試的效率和準確性。從基本的網路掃描到進階應用,文章將逐步深入,並提供實用的指令碼與操作指令,讓讀者能快速上手並應用於實際場景。此外,文章也涵蓋了 tmux 終端複用工具的使用、網路封包捕捉技術,以及 Greenbone 漏洞掃描工具的整合與自動化,提供全方位的網路安全測試解決方案。透過這些技術的整合運用,讀者將能更有效率地發現網路中的潛在漏洞,並提升整體網路安全性。文章也探討瞭如何使用 NetExec 工具列舉網路主機,並示範如何透過 SMB 空會話來取得分享資訊和使用者列表。此外,文章還介紹瞭如何使用 Greenbone 進行自動化漏洞掃描,包含建立掃描目標、建立掃描任務、啟動掃描任務、檢視任務狀態以及下載報告等步驟,並提供了一個 Bash 指令碼來自動化整個掃描過程,並解析報告結果。

網路及基礎設施測試技術

在進行網路測試時,有效地使用工具和技術是成功的關鍵。本文將探討如何使用Bash進行網路測試,並結合Nmap和Masscan這兩個強大的工具來進行網路掃描。玄貓將透過實際案例和技術深度分析,幫助讀者瞭解如何在測試環境中應用這些工具。

tmux的基本操作

tmux是一個非常強大的終端複用工具,能夠讓我們在同一個終端會話中管理多個終端視窗。這在進行長時間的網路測試時特別有用。以下是一些基本操作:

首先,我們可以使用Ctrl + b作為字首鍵來控制tmux。要從tmux會話中分離出來,可以按Ctrl + b後再按d。當我們重新連線到SSH會話時,可以使用tmux attach -t [session name]來重新連線到之前的會話。

要建立一個新的視窗,可以按Ctrl + b後再按c。如果想要手動重新命名視窗,可以按Ctrl + b後再按,(逗號),然後輸入新的名稱並按回車鍵。

圖示解說:
  • A(開始):從tmux的基本操作開始。
  • B(分離tmux會話):使用Ctrl + b, d來分離當前會話。
  • C(重新連線到SSH會話):使用tmux attach -t [session name]來重新連線。
  • D(建立新視窗):使用Ctrl + b, c來建立新的視窗。
  • E(重新命名視窗):使用Ctrl + b, ,來手動重新命名視窗。

基本網路掃描與Nmap

在瞭解瞭如何使用tmux之後,我們來看看如何使用Nmap進行基本的網路掃描。Nmap是一個功能強大的網路掃描工具,能夠幫助我們發現網路中的主機和開放的埠。

基本Nmap掃描

以下是一個最基本的Nmap掃描命令:

nmap 10.2.10.0/24

這個命令會對10.2.10.0/24這個子網進行掃描,並列出所有活動主機及其開放的埠。注意,這裡的IP地址可能與你的測試環境不同。

圖示解說:
  • A(開始):從基本Nmap掃描開始。
  • B(執行Nmap掃描):使用命令nmap 10.2.10.0/24進行掃描。
  • C(取得活動主機及開放埠):列出所有活動主機及其開放的埠。

高速網路掃描與Masscan

除了Nmap之外,Masscan也是一個非常強大的高速網路掃描工具。它能夠在短時間內對整個網際網路進行掃描。以下是一些基本操作:

基本Masscan命令

以下是一個基本的Masscan命令範例:

sudo masscan -p 22,445 --open -oL [outputfile] -iL [inputfile] --rate=5000

這個命令會對指定範圍內的主機進行掃描,並儲存結果到指設定檔案中。

內容解密:

  • -p 22,445: 指定要掃描的埠,例如22(SSH)和445(SMB)。
  • --open: 只顯示開放的埠。
  • -oL [outputfile]: 將結果儲存到指設定檔案中。
  • -iL [inputfile]: 指定範圍檔案。
  • --rate=5000: 每秒傳送5,000個TCP SYN包。

處理掃描結果

在完成掃描後,我們需要處理並分析掃描結果。以下是一些常見操作:

提取活躍主機

要提取活躍主機並將其儲存到檔案中,可以使用以下命令:

awk '$1 == "open" { print $4 }' masscan.lst | sort -uV > livehosts.txt

這個命令會從Masscan輸出檔案中提取活躍主機並儲存到livehosts.txt檔案中。

內容解密:

  • awk '$1 == "open" { print $4 }' masscan.lst: 提取第4列中的活躍主機IP地址。
  • sort -uV: 對IP地址進行排序並去重。
  • > livehosts.txt: 將結果儲存到livehosts.txt檔案中。

參考資料

玄貓建議讀者進一步閱讀相關資料以深化理解:

  • Nmap官方檔案:https://nmap.org/book/
  • Masscan官方檔案:https://github.com/robertdavidgraham/masscan

網路掃描技術的進階應用

在網路安全測試中,掃描技術是不可或缺的一部分。其中,Nmap 是最常用的網路掃描工具之一。以下是玄貓常用的 Nmap 操作指令,這些指令在進行網路測試時特別有效。

$ sudo nmap -sS -sV -sC -p 21,22,23,25,53,80,81,88,110,111,123,137-139,161,389,443,445,500,512,513,548,623-624,1099,1241,1433-1434,1521,2049,2483-2484,3268,3269,3306,3389,4333,4786,4848,5432,5800,
5900,5901,5985,5986,6000,6001,
7001,8000,8080,8181,8443,10000,
16992-16993,
27017,
32764 --open -oA [output file] -iL [input file] --exclude-file [exclude file]

操作指令說明

以下是指令的詳細說明:

  • -sS:進行 SYN 掃描,也稱為半開掃描。這種方式只傳送 TCP 握手的第一個部分,比起完成整個三次握手的連線掃描來得快速。
  • -sV:版本掃描,能夠識別服務名稱和版本,而不是僅顯示與埠號碼相關聯的預設服務名稱。
  • -sC:執行 Nmap 指令碼對所有開放的埠進行測試。這些指令碼的輸出經常會顯示重要甚至可利用的資訊。
  • -p [port list]:要掃描的埠列表。這些埠號碼是經驗上發現最常見且可利用的埠。如果要掃描單一主機或少數主機,或必須找到所有開放埠,可以使用 -p- 來代替,這是所有埠的縮寫。
  • --open:只記錄開放埠,不顯示已關閉或過濾埠。
  • -oA [output file]:將輸出儲存為三種格式(nmap、gnmap 和 xml),以便日後分析和使用。
  • -iL [input file]:包含要掃描的 IP 地址、網路地址或主機名稱的檔案。
  • --exclude-file [exclude file]:包含要從掃描中排除的 IP 地址、網路地址或主機名稱的檔案。參考測試協設定檔案中的排除清單。

內容解密:

玄貓在此提供了詳細說明每個引數功能:

  • 使用 sudo 提升許可權:進行網路掃描通常需要高許可權,因此在指令前加上 sudo 是必要的。
  • -sS 快速找出開放埠而不完成 TCP 握手:這樣可以大大減少掃描時間並減少被檢測到的風險。
  • -sV 識別服務版本以進行針對性攻擊:這對於後續的漏洞利用非常重要,因為不同版本可能存在不同漏洞。
  • -sC 執行 Nmap 指令碼查詢可利用資訊:這些指令碼可以自動化識別系統中的安全問題,節省了大量手動工作。
  • 指定特定埠列表而不是所有埠來節省時間且更精確:根據經驗選擇最常見且最危險的埠進行掃描。
  • --open 只顯示開放埠來簡化結果分析:這樣可以快速定位目標並忽略不相關資訊。

從快速到深入掃描

快速掃描適用於大型網路測試時節省時間,但深入掃描則能發現更多細節和潛在漏洞。因此,在面對小型網路時,玄貓通常會選擇完整掃描所有埠;但在大型網路測試中則先進行快速掃描以取得初步結果,同時後台執行深入全面的埠掃描。

網路封包捕捉

除了 Nmap 外,封包捕捉也是網路安全測試中的重要步驟。以下是玄貓常用的一個 Bash 指令碼範例:

#!/usr/bin/env bash
if [ "$#" -ne 1 ]; then
echo "你必須指定一個網路介面作為引數。"
echo "使用方法: $0 [network adapter]"
exit 1
fi

echo "[+] 請稍等;正在捕捉 $1 上的網路流量 2.5分鐘"
sudo timeout 150 tcpdump -i "$1" -s 0 -w packetcapture.pcap

echo "[+] 測試預設 HSRP 密碼 'cisco'..."
tcpdump -XX -r packetcapture.pcap 'udp port 1985 or udp port 2029' | grep -B 4 cisco

echo "[+] 測試 DHCPv6..."
tcpdump -r packetcapture.pcap '(udp port 546 or 547) or icmp6'
sudo rm packetcapture.pcap

echo "[+] 請稍等;正在執行 Responder 5分鐘"
echo "[+] 若捕捉到密碼雜湊值,請尋找 Hashcat 或重新執行 Responder 與 impacket-ntlmrelayx 一起"
responder=$(sudo timeout 300 responder -I "$1")
cat /usr/share/responder/logs/Responder-Session.log

內容解密:

此段程式碼逐項詳細說明:

#!/usr/bin/env bash

首先是 shebang 行,表示這個指令碼使用 Bash 做為執行環境。

if [ "$#" -ne 1 ]; then
    echo "你必須指定一個網路介面作為引數。"
    echo "使用方法: $0 [network adapter]"
    exit 1
fi

這段程式碼檢查使用者是否提供了一個引數(即網路介面),若沒有則顯示使用方法並離開指令碼。

echo "[+] 請稍等;正在捕捉 $1 上的網路流量 2.5分鐘"
sudo timeout 150 tcpdump -i "$1" -s 0 -w packetcapture.pcap

告知使用者正在捕捉流量並執行 tcpdump 捕捉流量兩分鐘半。

tcpdump -XX -r packetcapture.pcap 'udp port 1985 or udp port 2029' | grep -B 4 cisco

檢查 HSRP 預設密碼 cisco 是否存在於捕捉到的 UDP 流量中。

tcpdump -r packetcapture.pcap '(udp port 546 or 547) or icmp6'

檢查 DHCPv6 流量是否存在於捕捉到的封包中。

responder=$(sudo timeout 300 responder -I "$1")

執行 Responder 工具五分鐘以捕捉 NTLM 雜湊值。

啟用 Responder 工具

Responder 工具專門用來捕捉和攻擊 LLMNR、NBT-NS 和 MDNS 則是 Windows 網域上常見的協定。當它們被廣播時,可能會導緻密碼雜湊洩露或被重新轉發攻擊到其他系統上。

啟用 Responder 的程式碼解析:

responder=$(sudo timeout 300 responder -I "$1")

啟動 Responder 工具並讓它在指定網路介面上執行五分鐘(timeout 300)。

cat /usr/share/responder/logs/Responder-Session.log

讀取並顯示 Responder 工具抓取到的日誌資料(通常會包含密碼雜湊值)。

嘗試破解 Hashcat

有了雜湊值之後就可以使用 Hashcat 嘗試破解。

Hashcat 常用命令:

$ sudo hashcat -m 5700 hashes.txt /usr/share/wordlists/rockyou.txt.gz

此命令將從 hashes.txt 中讀取 NTLM 雜湊值並嘗試使用 rockyou.txt.gz 作為字典來破解。

對於 LLMNR、NBT-NS 和 MDNS 的觀察

玄貓指出這些協定往往是 Windows 網域中最危險且易於攻擊的一環。儘管它們不是直接提供可利用入口點來獲得 shell 控制權,但卻可能暴露出敏感資訊如密碼雜湊值或被轉發攻擊到其他系統上。因此在安全測試過程中不可忽視它們存在所帶來之威脅。

在寶貴時間內抓住每個細節

玄貓總結說明每個步驟之間如何相互配合以達成最佳效果:

首先快速探勘目標環境從而取得初步資訊後再深入調查特定目標機器與服務幾乎可以做到無縫接軌同時也能確保不漏過任何細節與安全威脅;此外封包捕捉與 Responder 工具則強化了探測範圍與準確性並加快反應速度與效率產生更好的測試結果與報告內容。

根據 Bash 的網路與基礎設施漏洞測試

在網路安全領域中,基礎設施漏洞評估是確保系統安全的重要步驟。Bash 這款強大的命令列工具可以幫助我們自動化網路主機發現和漏洞掃描,從而提高評估效率和準確性。這篇文章將介紹兩種關鍵技術:使用 NetExec 列舉網路主機,以及使用 Greenbone 自動化漏洞掃描。這些技術能夠有效地降低手動操作的工作量,同時提升漏洞檢測的準確性。

使用 NetExec 列舉網路主機

從未經授權的角度開始,我們可以檢查 TCP 埠 445,因為這個埠歷史上存在許多漏洞且能提供大量資訊。我們將使用 NetExec 工具來列舉網路主機。

首先,我們嘗試使用 SMB 空會話來列舉 SMB 分享。執行以下命令,將網路地址替換為您實驗室例項的適當地址:

netexec smb 10.2.10.0/24 -u a -p '' --shares

內容解密:

  • netexec smb:指定 NetExec 應該使用的協定。NetExec 命令支援多種協定,包括 SMB。
  • 10.2.10.0/24:目標位於 netexec 和協定名稱之後。目標可以是 IP 地址、主機名稱、網路地址或包含目標的檔案(每行一個)。
  • -u a -p '':指定一個隨機使用者名稱 a 和空密碼。
  • --shares:NetExec 命令用來列舉 SMB 分享。

接下來,我們嘗試使用 SMB 空會話來列舉使用者。執行以下命令:

netexec smb 10.2.10.0/24 -u a -p '' --users

這條命令與前一條唯一的不同之處在於將 --shares 改為 --users。如果沒有成功列舉使用者,我們可以修改命令再試一次:

netexec smb 10.2.10.0/24 -u '' -p '' --users

這次我們沒有指定使用者名稱,而是使用空使用者名稱。

自動化漏洞掃描

市場上有許多頂尖的漏洞掃描產品,但我們應該學會如何從 Bash 殼層自動化這些掃描以節省時間。當我負責一家全球企業的漏洞掃描時,我使用 Bash 殼層與掃描器 API 介面來自動化我的工作,包括收集統計資料以生成自定義報告。

我們將使用 Greenbone 的社群版本(以前稱為 OpenVAS)。如果您想在自己的實驗室中跟隨這些步驟,請先檢視「技術需求」部分,確保您已經安裝了 Greenbone。

建立掃描目標

建立掃描目標如下,將密碼和網路替換為您自己的值:

sudo -u _gvm gvm-cli --gmp-username admin --gmp-password [password] socket --xml "<create_target><name>My Target</name><hosts>10.2.10.0/24</hosts><port_range>1-65535</port_range></create_target>"

建立掃描任務

複製目標 ID 建立全面快速掃描任務:

sudo -u _gvm gvm-cli --gmp-username admin --gmp-password [password] socket --xml "<create_task><name>My Task</name><comment>Scanning 10.2.10.0/24</comment><config id='daba56c8-73ec-11df-a475-002264764cea'/><target id=29590015-db97-4d3e-8aab-694abb3b1c4c/></create_task>"

啟動掃描任務

使用前一個命令回應中的任務 ID 啟動任務:

sudo -u _gvm gvm-cli --gmp-username admin --gmp-password [password] socket --xml "<start_task task_id=abc324d4-7464-4415-8a77-de8dfa13606b'/>"

檢視任務狀態

使用以下命令檢查任務狀態:

sudo -u _gvm gvm-cli --gmp-username admin --gmp-password [password] socket --xml "<get_tasks task_id=7f6996b2-bdf5-49e8-8bb0-699cad0778ec'/>" | xmllint --format -

下載報告

使用前一個命令輸出中的報告 ID 下載報告:

sudo -u _gvm gvm-cli --gmp-username admin --gmp-password [password] socket --xml "<get_reports report_id='7c39338b-8c15-4e3a-93ff-bca125ff2ddf' format_id='c402cc3e-b531-11e1-9163-406186ea4fc5'/>" > scan_result.xml

自動化指令碼

接下來,我們來編寫一個指令碼來自動化這個過程並解析報告。以下是完整的指令碼範例:

#!/usr/bin/env bash
# User and argument validation
if [ "$(whoami)" != "_gvm" ]; then
echo "This script must be run as user _gvm."
exit 1
fi

if [ $# -lt 2 ]; then
echo "Usage: $0 <password> <target_host>"
exit 1
fi

PASSWORD=$1
TARGET_HOST=$2

# Create target and task, start scan, check status, and download report.
TARGET_ID=$(sudo -u _gvm gvm-cli --gmp-username admin --gmp-password $PASSWORD socket --xml "<create_target><name>My Target</name><hosts>$TARGET_HOST</hosts><port_range>1-65535</port_range></create_target>" | xmllint --xpath 'string(//create_target_response/target/id)' -)

TASK_ID=$(sudo -u _gvm gvm-cli --gmp-username admin --gmp-password $PASSWORD socket --xml "<create_task><name>My Task</name><comment>Scanning $TARGET_HOST</comment><config id='daba56c8-73ec-11df-a475-002264764cea'/><target id='$TARGET_ID'/></create_task>" | xmllint --xpath 'string(//create_task_response/task/id)' -)

sudo -u _gvm gvm-cli --gmp-username admin --gmp-password $PASSWORD socket --xml "<start_task task_id='$TASK_ID'/>"

while true; do
STATUS=$(sudo -u _gvm gvm-cli --gmp-username admin --gmp-password $PASSWORD socket --xml "<get_tasks task_id='$TASK_ID'/>" | xmllint --xpath 'string(//get_tasks_response/task/status)' -)
if [ "$STATUS" == "Done" ]; then
break
fi
sleep 60
done

REPORT_ID=$(sudo -u _gvm gvm-cli --gmp-username admin --gmp-password $PASSWORD socket --xml "<get_reports task_id='$TASK_ID'/>" | xmllint --xpath 'string(//get_reports_response/report/id)' -)

sudo -u _gvm gvm-cli --gmp-username admin --gmp-password $PASSWORD socket --xml "<get_reports report_id='$REPORT_ID' format_id='c402cc3e-b531-11e1-9163-406186ea4fc5'/>" > scan_result.xml

echo "Scan completed and report saved as scan_result.xml"

內容解密:

這段指令碼首先檢查當前使用者是否為 _gvm 使用者(Greenbone 安裝過程中建立的使用者)。如果不是該使用者執行指令碼,則輸出錯誤資訊並離開。

接著指令碼檢查是否提供了足夠的引數(密碼和目標主機)。如果缺少引數,則輸出使用說明並離開。

然後指令碼進行一系列操作:

  • 建立掃描目標並取得其 ID。
  • 建立掃描任務並取得其 ID。
  • 啟動掃描任務。
  • 在掃描完成之前持續檢查任務狀態。
  • 取得報告 ID。
  • 下載報告並儲存為 scan_result.xml

最後輸出完成訊息。

領域概念圖示

此圖示展示了 NetExec 和 Greenbone 的關係及其工作流程。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Bash 結合 Nmap 與 Masscan 的網路安全測試技術

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

測試結果與未來改進

透過這些步驟和技術,玄貓能夠有效地自動化網路基礎設施的漏洞評估過程。然而,仍需注意以下幾點:

當前範例中的不足之處:目前示範僅針對特定網段進行了基本操作。若要應用於更大規模或複雜環境中時可能需要更多的調整和最佳化。

未來改進方向:可以考慮加入更多先進的漏洞探測模組和技術(例如:利用 Machine Learning 提升掃描精確度),並且建立更完善的報告系統以便於後續分析和追蹤修復進度。