在當代資訊安全領域中,滲透測試已成為評估系統安全態勢的核心手段。然而,測試完成後的報告撰寫工作往往消耗大量人力與時間,且手動操作容易產生格式不一致或內容遺漏等問題。本文將深入探討如何運用 Bash Shell Script 結合 LaTeX 排版系統,建構一套完整的自動化滲透測試報告生成解決方案。透過系統化的開發流程,我們不僅能大幅提升報告產出效率,更能確保文件品質的穩定性與專業性。此外,本文也將深入探討在實際滲透測試環境中,如何有效識別與因應 Antivirus 與 Endpoint Detection and Response 系統的偵測機制,提供完整的技術實作指南。

自動化報告生成的技術架構

建構自動化滲透測試報告系統時,首要考量便是選擇適當的技術棧。Bash Shell Script 作為 Linux/Unix 系統的原生指令介面,具有多項顯著優勢。首先,Bash 能夠無縫整合系統內建的各類命令列工具,無需額外安裝複雜的執行環境。其次,指令碼的執行效率極高,特別適合處理大規模的資料轉換與格式化作業。再者,Bash 指令碼具備優異的可攜性,能夠在各種 Linux 發行版本上直接執行,無需擔心相依性問題。

在文件產出格式的選擇上,LaTeX 排版系統展現出無可比擬的專業性。相較於一般的文書處理軟體,LaTeX 能夠產生高品質的 PDF 文件,特別是在處理複雜的表格結構、數學公式與技術圖表時表現卓越。更重要的是,LaTeX 採用純文字標記語言,完全契合自動化腳本的生成需求。透過程式化的方式產生 LaTeX 原始碼,再經由 pdflatex 編譯器轉換為最終的 PDF 報告,整個流程能夠達到完全自動化的目標。

資料儲存層面採用 SQLite 資料庫系統作為測試結果的暫存媒介。SQLite 是一個輕量級的關聯式資料庫引擎,不需要獨立的伺服器行程,所有資料都儲存在單一檔案中。這種設計使得資料管理變得極為簡便,同時也便於備份與轉移。在實際應用中,滲透測試工具如 Nmap、Nessus 等都能將掃描結果匯出至資料庫格式,或透過中介處理程序將資料寫入 SQLite。透過標準的 SQL 查詢語法,我們能夠靈活地篩選、排序與聚合測試資料,為後續的報告生成提供結構化的資訊來源。

@startuml
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi 300
skinparam shadowing false
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 14
skinparam roundcorner 8
skinparam minClassWidth 100

rectangle "資料來源層" {
  database "SQLite\n資料庫" as DB
  collections "測試工具\n(Nmap/Nessus)" as Tools
}

rectangle "處理邏輯層" {
  component "資料查詢\n模組" as Query
  component "字元轉義\n處理器" as Escape
  component "LaTeX\n生成器" as Generator
}

rectangle "文件產出層" {
  artifact "LaTeX\n原始檔" as Tex
  artifact "PDF\n報告" as PDF
}

Tools --> DB : 寫入測試結果
DB --> Query : SQL 查詢
Query --> Escape : 資料流轉
Escape --> Generator : 處理後資料
Generator --> Tex : 生成原始碼
Tex --> PDF : pdflatex 編譯

@enduml

此架構圖清楚展示了整個系統的資料流向與模組關聯性。測試工具首先將掃描結果寫入 SQLite 資料庫,接著透過查詢模組提取所需資料。由於 LaTeX 對特殊字元有嚴格的語法要求,必須經過轉義處理器進行字元替換,確保編譯過程不會發生錯誤。最後由 LaTeX 生成器將處理後的資料轉換為符合語法規範的原始碼,再透過 pdflatex 編譯器產生最終的 PDF 報告文件。

核心程式碼實作與詳細解析

在開始實作之前,我們需要建立一個清晰的程式碼結構。整個系統主要由三個核心函式組成,分別負責資料庫查詢、字元轉義與 LaTeX 內容生成。以下將逐一說明各函式的實作細節與技術考量。

資料庫查詢模組

資料庫查詢函式是整個系統的資料入口,負責從 SQLite 資料庫中提取滲透測試的結果資料。這個函式的設計採用泛型化的方式,能夠接受任意的 SQL 查詢語句作為參數,提供最大的彈性。

#!/bin/bash

# 定義資料庫檔案路徑
# 請根據實際環境修改此變數
DB_NAME="pentest_results.db"

# 資料庫查詢函式
# 參數:
#   $1 - SQL 查詢語句
# 回傳:
#   CSV 格式的查詢結果,包含欄位標題
query_db() {
  # 使用 sqlite3 命令列工具執行查詢
  # -header 參數:在輸出結果中包含欄位名稱
  # -csv 參數:以 CSV 格式輸出結果,便於後續處理
  # "$DB_NAME" 參數:指定資料庫檔案路徑
  # "$1" 參數:傳入的 SQL 查詢語句
  sqlite3 -header -csv "$DB_NAME" "$1"
}

這個函式的實作相當簡潔,但背後蘊含了多項技術考量。首先,使用 -header 參數能夠確保輸出結果包含欄位名稱,這在後續的資料處理中非常有用。其次,-csv 格式的輸出提供了結構化的資料表示方式,每個欄位以逗號分隔,易於透過 Shell 的文字處理工具進行解析。此外,將資料庫路徑定義為全域變數,便於在整個指令碼中統一管理,當需要變更資料庫位置時只需修改一處即可。

在實際應用中,這個查詢函式可能會被多次呼叫,用以提取不同類型的測試資料。舉例來說,我們可能需要依據 IP 位址分別查詢每個主機的掃描結果,或是彙整所有高風險漏洞的清單。透過彈性的函式設計,這些需求都能夠透過傳入不同的 SQL 語句來達成,無需修改函式本身的實作邏輯。

字元轉義處理模組

LaTeX 排版系統對於某些字元具有特殊的語法意義,若在文件內容中直接使用這些字元,將會導致編譯錯誤或產生非預期的排版效果。因此,在將資料庫查詢結果寫入 LaTeX 文件前,必須先進行字元轉義處理。

# LaTeX 特殊字元轉義函式
# LaTeX 將以下字元視為控制符號,必須加上反斜線進行轉義
# 參數:
#   $1 - 需要轉義的原始字串
# 回傳:
#   轉義後的安全字串
escape_latex() {
  # 使用 sed 串流編輯器進行多重替換
  # s/PATTERN/REPLACEMENT/g 表示全域替換
  # & 字元:在 LaTeX 中用於表格欄位分隔,必須轉義為 \&
  # % 字元:在 LaTeX 中表示註解開始,必須轉義為 \%
  # $ 字元:在 LaTeX 中用於數學模式切換,必須轉義為 \$
  # # 字元:在 LaTeX 中用於參數引用,必須轉義為 \#
  # _ 字元:在 LaTeX 中用於下標符號,必須轉義為 \_
  # { 和 } 字元:在 LaTeX 中用於群組界定,必須轉義為 \{ 和 \}
  sed 's/&/\\&/g; s/%/\\%/g; s/$/\\$/g; s/#/\\#/g; s/_/\\_/g; s/{/\\{/g; s/}/\\}/g' <<< "$1"
}

這個轉義函式使用 sed 指令來執行一系列的字元替換操作。sed 是 Unix/Linux 系統中強大的串流編輯工具,特別適合進行批次的文字處理工作。在這個函式中,我們使用了分號來串接多個替換指令,每個指令都遵循 s/PATTERN/REPLACEMENT/g 的語法格式,其中 g 旗標表示全域替換,確保字串中所有符合的字元都會被處理。

值得注意的是,替換操作的順序具有重要性。由於我們需要在特殊字元前加上反斜線,而反斜線本身在 Bash 中也是特殊字元,因此在 sed 指令中必須使用雙反斜線 \\ 來表示實際的單一反斜線。此外,使用 <<< 重導向運算子能夠直接將字串傳遞給 sed 處理,避免了建立臨時檔案的需要,提升了執行效率。

在實際測試環境中,掃描結果經常包含各種特殊字元。例如,服務版本資訊可能包含百分比符號,漏洞描述可能包含底線或大括號。若未經過適當的轉義處理,這些字元將會導致 LaTeX 編譯失敗,或是在最終文件中產生格式錯誤。透過這個轉義函式,我們能夠確保所有資料都能安全地嵌入 LaTeX 文件中。

LaTeX 文件生成模組

文件生成模組是整個系統最核心的部分,負責將處理後的資料轉換為完整的 LaTeX 文件結構。這個函式產生的輸出包含文件前言、標題資訊、摘要內容,以及依據 IP 位址組織的詳細測試結果表格。

# LaTeX 文件內容生成函式
# 此函式不接受參數,直接輸出完整的 LaTeX 原始碼至標準輸出
# 產生的文件包含標題、摘要與測試結果表格
create_latex_content() {
  # 文件類別宣告:使用標準的 article 類別
  echo "\\documentclass{article}"
  
  # 載入必要的套件
  # geometry 套件:設定頁面邊距為 1 英吋
  echo "\\usepackage[margin=1in]{geometry}"
  
  # longtable 套件:支援跨頁的長表格
  # 這對於包含大量測試結果的報告至關重要
  echo "\\usepackage{longtable}"
  
  # pdflscape 套件:支援橫向頁面配置
  # 測試結果表格通常欄位較多,橫向配置能提供更好的閱讀體驗
  echo "\\usepackage{pdflscape}"
  
  # 文件主體開始
  echo "\\begin{document}"
  
  # 設定文件標題
  # 在實際應用中,標題應根據測試專案動態產生
  echo "\\title{滲透測試評估報告}"
  
  # 設定作者資訊
  # 可以從環境變數或設定檔讀取,增加靈活性
  echo "\\author{資安評估團隊}"
  
  # 產生標題頁
  echo "\\maketitle"
  
  # 第一章節:執行摘要
  echo "\\section{執行摘要}"
  
  # 摘要內容
  # 這部分應該總結整體的測試發現與風險評估
  # 實際應用中可以根據資料庫中的統計資料動態產生
  echo "本次滲透測試評估針對目標網路環境進行全面性的安全檢測。測試過程中發現多個不同嚴重等級的安全漏洞,包含過時的軟體版本、不當的服務設定,以及潛在的存取控制弱點。詳細的測試結果與建議措施請參閱後續章節的完整分析。"
  
  # 第二章節:掃描結果
  echo "\\section{掃描結果}"
  
  # 查詢資料庫取得所有不重複的 IP 位址
  # DISTINCT 關鍵字確保每個 IP 只出現一次
  # 結果以換行符號分隔,便於迴圈處理
  ip_addresses=$(query_db "SELECT DISTINCT ip_address FROM nmap_scans;")
  
  # 設定內部欄位分隔符號為換行符號
  # 這確保 for 迴圈能正確處理包含空格的資料
  IFS=$'\n'
  
  # 針對每個 IP 位址產生獨立的小節
  for ip in $ip_addresses; do
    # 產生小節標題,顯示當前處理的 IP 位址
    echo "\\subsection{主機位址: $ip}"
    
    # 開始橫向頁面環境
    # 表格內容將以橫向方式呈現,提供更多的水平空間
    echo "\\begin{landscape}"
    
    # 開始長表格環境
    # 表格定義了 7 個欄位,每個欄位的寬度使用 p{寬度} 語法指定
    # | 符號表示欄位間的垂直分隔線
    echo "\\begin{longtable}{|p{2cm}|p{2cm}|p{1.5cm}|p{1.5cm}|p{3cm}|p{3cm}|p{4cm}|}"
    
    # 表格頂部水平線
    echo "\\hline"
    
    # 表格標題列
    # \\\\ 表示換行,\\hline 產生水平分隔線
    echo "主機名稱 & IP 位址 & 連接埠 & 通訊協定 & 服務名稱 & 版本資訊 & 漏洞描述 \\\\ \\hline"
    
    # 定義首頁表頭
    # 當表格跨頁時,此標題會出現在第一頁
    echo "\\endfirsthead"
    
    # 定義續頁表頭
    # 表格延續到下一頁時,會自動加上此標題
    echo "\\hline"
    echo "主機名稱 & IP 位址 & 連接埠 & 通訊協定 & 服務名稱 & 版本資訊 & 漏洞描述 \\\\ \\hline"
    echo "\\endhead"
    
    # 查詢當前 IP 的所有掃描結果
    # 使用 WHERE 子句篩選特定 IP 的記錄
    # sed 指令將 CSV 格式轉換為 LaTeX 表格格式
    # s/,/ & /g 將逗號替換為 LaTeX 的欄位分隔符號 &
    # s/$/ \\\\ \\hline/ 在每行結尾加上換行符號與水平線
    query_db "SELECT hostname, ip_address, port, protocol, service, version, vulnerability FROM nmap_scans WHERE ip_address='$ip';" | sed 's/,/ \\& /g; s/$/ \\\\\\\\ \\hline/'
    
    # 結束長表格環境
    echo "\\end{longtable}"
    
    # 結束橫向頁面環境
    echo "\\end{landscape}"
  done
  
  # 文件主體結束
  echo "\\end{document}"
}

這個函式的實作展現了 Bash 與 LaTeX 整合的多項技巧。首先,整個 LaTeX 文件結構都透過 echo 指令輸出,這使得我們能夠在指令碼中靈活地控制文件內容。其次,使用 longtable 套件解決了一般表格無法跨頁的限制,對於包含大量測試結果的報告而言這是必要的功能。再者,pdflscape 套件提供的橫向頁面配置,能夠容納更多的表格欄位,避免內容被壓縮而難以閱讀。

在資料處理方面,程式碼先查詢出所有不重複的 IP 位址,然後針對每個 IP 產生獨立的表格。這種組織方式使得報告結構清晰,便於讀者快速定位特定主機的測試結果。在表格內容的產生過程中,使用 sed 指令將 CSV 格式的查詢結果轉換為 LaTeX 表格語法,這個轉換過程包含兩個步驟:首先將逗號替換為 LaTeX 的欄位分隔符號 &,接著在每行結尾加上換行指令與水平分隔線。

值得特別注意的是,在 Bash 中輸出包含反斜線的字串時,必須小心處理跳脫字元。例如,要輸出 LaTeX 的換行指令 \\,在 Bash 的 echo 指令中必須寫成 \\\\,因為 Bash 會先處理一次跳脫,然後才將字串輸出。這種雙重跳脫的需求是整合 Bash 與 LaTeX 時常見的陷阱,需要格外留意。

完整系統整合與執行流程

將上述三個核心函式整合成完整的可執行指令碼後,我們還需要加入主程式邏輯來串接整個報告生成流程。以下是完整的系統整合實作:

#!/bin/bash

# 設定嚴格的錯誤處理模式
# -e 參數:任何指令執行失敗時立即終止腳本
# -u 參數:使用未定義變數時視為錯誤
# -o pipefail 參數:管線中任一指令失敗時,整個管線視為失敗
set -euo pipefail

# 定義輸出檔案名稱
# 實際應用中可以加入時間戳記,避免檔案覆蓋
OUTPUT_FILE="pentest_report"
LATEX_FILE="${OUTPUT_FILE}.tex"
PDF_FILE="${OUTPUT_FILE}.pdf"

# 主要執行流程函式
main() {
  # 顯示處理進度訊息
  echo "[資訊] 開始生成滲透測試報告..."
  
  # 檢查資料庫檔案是否存在
  if [[ ! -f "$DB_NAME" ]]; then
    echo "[錯誤] 找不到資料庫檔案: $DB_NAME" >&2
    exit 1
  fi
  
  # 生成 LaTeX 原始檔
  echo "[資訊] 正在生成 LaTeX 文件..."
  create_latex_content > "$LATEX_FILE"
  
  # 檢查 LaTeX 檔案是否成功產生
  if [[ ! -f "$LATEX_FILE" ]]; then
    echo "[錯誤] LaTeX 檔案產生失敗" >&2
    exit 1
  fi
  
  # 編譯 LaTeX 文件為 PDF
  echo "[資訊] 正在編譯 PDF 文件..."
  # -interaction=nonstopmode 參數:遇到錯誤時不停止,繼續編譯
  # -output-directory 參數:指定輸出目錄
  pdflatex -interaction=nonstopmode -output-directory=. "$LATEX_FILE" > /dev/null 2>&1
  
  # 第二次編譯以確保交叉引用正確
  # LaTeX 需要多次編譯來處理目錄、引用等動態內容
  pdflatex -interaction=nonstopmode -output-directory=. "$LATEX_FILE" > /dev/null 2>&1
  
  # 檢查 PDF 檔案是否成功產生
  if [[ -f "$PDF_FILE" ]]; then
    echo "[成功] 報告已成功產生: $PDF_FILE"
    
    # 清理暫存檔案
    # LaTeX 編譯過程會產生多個輔助檔案
    rm -f "${OUTPUT_FILE}.aux" "${OUTPUT_FILE}.log" "${OUTPUT_FILE}.out"
    
    # 詢問是否保留 LaTeX 原始檔
    read -p "是否保留 LaTeX 原始檔? (y/n): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
      rm -f "$LATEX_FILE"
      echo "[資訊] 已清理 LaTeX 原始檔"
    fi
  else
    echo "[錯誤] PDF 檔案產生失敗,請檢查 LaTeX 編譯日誌" >&2
    exit 1
  fi
}

# 執行主函式
main

這個主程式展現了完整的錯誤處理與使用者互動機制。透過 set -euo pipefail 指令啟用嚴格模式,確保任何錯誤都能被及時發現。在執行過程中,程式會在關鍵步驟輸出進度訊息,讓使用者瞭解當前的處理狀態。資料庫檔案與生成檔案的存在性檢查能夠避免後續處理時發生錯誤。

LaTeX 的編譯過程需要執行兩次,這是因為 LaTeX 在首次編譯時會建立交叉引用的索引檔案,第二次編譯才能正確解析這些引用。編譯完成後,程式會自動清理中間產生的輔助檔案,保持工作目錄的整潔。透過詢問使用者是否保留 LaTeX 原始檔,系統提供了適度的彈性,方便進階使用者進行後續的客製化調整。

規避技術與環境偵察策略

在實際的滲透測試工作中,僅僅產出詳盡的報告並不足夠。測試人員經常需要面對目標環境中佈署的各種安全防護措施,包含 Antivirus 與 Endpoint Detection and Response 系統。這些防護機制會主動監控系統行為,並在偵測到可疑活動時觸發告警或直接阻斷操作。因此,瞭解如何識別與因應這些防護系統,成為滲透測試專業人員的必備技能。

在開始任何測試活動之前,環境偵察是至關重要的前置作業。透過系統化的資訊蒐集,我們能夠瞭解目標環境的安全態勢,包含已安裝的防護軟體類型、執行中的監控服務,以及可能影響測試活動的系統設定。這些資訊不僅能夠幫助我們規劃更有效的測試策略,也能夠降低被偵測的風險,避免觸發不必要的安全告警而中斷測試流程。

環境偵察的重要性體現在多個面向。首先,不同的安全產品具有不同的偵測邏輯與弱點,瞭解具體的產品型號能夠讓我們針對性地選擇規避手法。其次,某些 EDR 系統會記錄完整的系統活動軌跡,若未能識別這些系統的存在,測試活動可能會在事後被完整重建,失去紅隊演練的意義。再者,掌握環境資訊能夠讓我們評估測試的風險等級,在高敏感環境中採取更謹慎的作法,避免對營運造成影響。

@startuml
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi 300
skinparam shadowing false
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 14
skinparam roundcorner 8

start

:啟動環境偵察;

:列舉執行中的程序;
note right
  使用 ps aux 指令
  配合 grep 篩選
  尋找 AV/EDR 相關程序
end note

:分析檔案系統結構;
note right
  檢查 /opt 與 /etc 目錄
  搜尋特定名稱的檔案
  識別安全軟體安裝路徑
end note

:檢查網路連線狀態;
note right
  使用 netstat 或 ss 指令
  識別對外通訊的連接埠
  追蹤管理伺服器位址
end note

:列舉系統服務;
note right
  使用 systemctl 指令
  檢視服務執行狀態
  分析服務設定檔
end note

:檢查核心模組;
note right
  使用 lsmod 指令
  識別安全相關模組
  分析模組相依性
end note

if (偵測到 AV/EDR) then (是)
  :記錄防護系統資訊;
  :規劃規避策略;
  :調整測試方法;
else (否)
  :確認無防護機制;
endif

:產生偵察報告;

stop

@enduml

此流程圖展示了完整的環境偵察程序。偵察工作從程序列舉開始,透過檢視執行中的程序清單來識別可能的安全軟體。接著分析檔案系統,尋找安全產品的安裝目錄與設定檔。網路連線分析能夠揭示系統與管理伺服器的通訊,這對於瞭解 EDR 的回報機制極為重要。服務列舉則關注以背景服務形式執行的防護程式。最後,核心模組檢查能夠發現深層的系統監控機制。所有資訊彙整後,我們就能夠判斷環境的安全等級,並據此調整測試策略。

程序列舉與識別技術

程序列舉是環境偵察的首要步驟。在 Linux 系統中,所有執行中的程序都會在作業系統中註冊,我們能夠透過多種工具來查詢這些程序資訊。最基本的方式是使用 ps 指令搭配適當的參數來列出程序清單。

#!/bin/bash

# 程序列舉指令碼
# 用於識別系統中可能的 AV/EDR 程序

# 列出所有程序的詳細資訊
# a 參數:顯示所有使用者的程序
# u 參數:顯示程序的擁有者資訊
# x 參數:包含沒有控制終端機的程序
echo "[資訊] 列舉所有執行中的程序..."
sudo ps aux

echo ""
echo "[資訊] 篩選可能的安全防護程序..."

# 使用 grep 配合正規表示式篩選可能的安全程序
# -E 參數:啟用延伸正規表示式
# -i 參數:忽略大小寫
# 搜尋關鍵字包含:av, edr, protect, defend, guard, security
sudo ps aux | grep -iE "(av|edr|protect|defend|guard|security|antivirus|endpoint)" | grep -v grep

# 備註:此方法可能產生誤判
# 許多合法程序的名稱也可能包含這些關鍵字
# 需要人工判讀結果以確認真正的安全軟體

# 進階篩選:查詢已知的安全產品程序名稱
echo ""
echo "[資訊] 檢查已知的安全產品..."

# 定義常見安全產品的程序名稱陣列
KNOWN_SECURITY_PROCESSES=(
  "clamav"
  "sophos"
  "crowdstrike"
  "carbonblack"
  "cylance"
  "sentinel"
  "defender"
  "mcafee"
  "symantec"
  "trendmicro"
)

# 迴圈檢查每個已知的安全產品
for process in "${KNOWN_SECURITY_PROCESSES[@]}"; do
  # 使用 pgrep 指令搜尋特定名稱的程序
  # -i 參數:忽略大小寫
  # -l 參數:顯示程序名稱
  if pgrep -il "$process" > /dev/null 2>&1; then
    echo "[發現] 偵測到 $process 相關程序"
    pgrep -il "$process"
  fi
done

程序列舉的挑戰在於如何從大量的程序資訊中精確識別安全軟體。單純使用關鍵字搜尋會產生許多誤判,因為合法的系統程序或應用程式可能恰好包含類似的字串。因此,更可靠的方式是維護一份已知安全產品的程序名稱清單,透過精確比對來提高識別準確度。使用 pgrep 指令而非 grep 的優勢在於,pgrep 是專門用於程序搜尋的工具,能夠直接回傳程序識別碼,避免了 grep 本身的程序也出現在結果中的問題。

檔案系統分析技術

除了程序列舉,檔案系統分析也是重要的偵察手段。安全軟體在安裝時通常會在特定目錄建立檔案與設定,透過檢查這些位置能夠發現系統中安裝的防護工具。

#!/bin/bash

# 檔案系統分析指令碼
# 用於識別安全軟體的安裝檔案與設定檔

echo "[資訊] 檢查常見的安全軟體安裝目錄..."

# 檢查 /opt 目錄
# 許多第三方軟體會安裝在此目錄下
if [[ -d /opt ]]; then
  echo "[資訊] 分析 /opt 目錄內容..."
  ls -la /opt | grep -iE "(av|antivirus|edr|protect|security|defend)"
fi

# 檢查 /etc 目錄
# 安全軟體的設定檔通常存放於此
if [[ -d /etc ]]; then
  echo "[資訊] 分析 /etc 目錄內容..."
  ls -la /etc | grep -iE "(av|antivirus|edr|protect|security|defend)"
fi

echo ""
echo "[資訊] 搜尋特定名稱的安全軟體檔案..."

# 使用 find 指令搜尋整個檔案系統
# -name 參數:依檔案名稱搜尋
# -o 參數:邏輯 OR 運算子
# 2>/dev/null:將錯誤訊息重導向到 /dev/null,避免權限錯誤干擾輸出
find / \( -name "*antivirus*" -o -name "*edr*" -o -name "*defend*" \) 2>/dev/null | head -n 20

echo ""
echo "[資訊] 檢查已知安全產品的安裝路徑..."

# 定義常見安全產品的安裝路徑
KNOWN_PATHS=(
  "/opt/sophos"
  "/opt/CrowdStrike"
  "/opt/carbonblack"
  "/opt/cylance"
  "/opt/sentinelone"
  "/etc/clamav"
  "/etc/defender"
)

# 檢查每個已知路徑是否存在
for path in "${KNOWN_PATHS[@]}"; do
  if [[ -e "$path" ]]; then
    echo "[發現] 偵測到安全產品目錄: $path"
    # 顯示目錄內容
    ls -la "$path" | head -n 10
  fi
done

echo ""
echo "[資訊] 檢查可疑的設定檔..."

# 搜尋可能的安全軟體設定檔
CONF_DIRS=("/etc" "/opt")
for dir in "${CONF_DIRS[@]}"; do
  if [[ -d "$dir" ]]; then
    # 搜尋 .conf 結尾的設定檔
    find "$dir" -maxdepth 3 -type f -name "*.conf" 2>/dev/null | \
    while read -r conf_file; do
      # 檢查設定檔內容是否包含安全相關關鍵字
      if grep -qiE "(antivirus|malware|threat|protection)" "$conf_file" 2>/dev/null; then
        echo "[發現] 可疑的設定檔: $conf_file"
      fi
    done
  fi
done

檔案系統分析需要權衡搜尋範圍與執行效率。全系統搜尋雖然最為徹底,但會耗費大量時間且容易觸發檔案存取監控。因此,實務上會優先檢查已知的常見安裝路徑,再針對特定懷疑對象進行深入分析。此外,設定檔的內容檢查也能提供有價值的資訊,例如防護軟體的版本號、啟用的功能模組,以及監控的範圍等。

網路連線追蹤技術

現代的 EDR 系統通常會與中央管理伺服器保持持續的網路連線,用於回報偵測事件、更新威脅情資,以及接收控制指令。透過分析系統的網路連線狀態,我們能夠識別這些通訊管道,進而推斷 EDR 系統的存在與類型。

#!/bin/bash

# 網路連線分析指令碼
# 用於識別與安全管理伺服器的通訊

echo "[資訊] 列出所有活躍的網路連線..."

# 使用 netstat 指令顯示網路連線
# -t 參數:顯示 TCP 連線
# -u 參數:顯示 UDP 連線
# -l 參數:顯示監聽中的通訊埠
# -n 參數:以數字格式顯示位址與埠號
# 備註:netstat 在某些新版系統中被 ss 指令取代
if command -v netstat &> /dev/null; then
  netstat -tuln
else
  # 使用 ss 作為替代方案
  # ss 是較新的網路統計工具,效能更佳
  ss -tuln
fi

echo ""
echo "[資訊] 檢查對外的已建立連線..."

# 篩選 ESTABLISHED 狀態的連線
# 這些是目前活躍的通訊連結
if command -v netstat &> /dev/null; then
  netstat -tnp | grep ESTABLISHED
else
  ss -tnp state established
fi

echo ""
echo "[資訊] 分析常見的管理伺服器通訊埠..."

# 定義常見的管理協定通訊埠
MGMT_PORTS=(
  "443"   # HTTPS
  "8080"  # HTTP 替代埠
  "8443"  # HTTPS 替代埠
  "22"    # SSH
  "3389"  # RDP
  "5985"  # WinRM HTTP
  "5986"  # WinRM HTTPS
)

for port in "${MGMT_PORTS[@]}"; do
  echo "[檢查] 通訊埠 $port 的連線狀態..."
  if command -v netstat &> /dev/null; then
    netstat -tnp | grep ":$port" | grep ESTABLISHED
  else
    ss -tnp state established "( sport = :$port or dport = :$port )"
  fi
done

echo ""
echo "[資訊] 檢查 DNS 查詢記錄..."

# 分析 /etc/resolv.conf 取得 DNS 伺服器資訊
if [[ -f /etc/resolv.conf ]]; then
  echo "[資訊] 設定的 DNS 伺服器:"
  grep nameserver /etc/resolv.conf
fi

# 檢查最近的 DNS 快取
# 某些系統會執行本地 DNS 快取服務
if command -v systemd-resolve &> /dev/null; then
  echo "[資訊] 查詢 systemd-resolved 統計資訊..."
  systemd-resolve --statistics 2>/dev/null
fi

網路連線分析能夠揭示許多有價值的資訊。持續性的外部連線往往指向管理伺服器的存在,特別是那些使用非標準通訊埠或加密通道的連線。DNS 查詢記錄也值得關注,因為許多 EDR 系統會定期解析廠商特定的網域名稱。透過綜合分析這些網路活動模式,我們能夠建立起目標環境的網路拓撲圖,瞭解資訊流向與監控架構。

本文介紹的自動化滲透測試報告生成系統展現了 Bash 指令碼在資訊安全領域的強大應用潛力。透過系統化的開發方法,我們能夠將繁瑣的報告產出工作自動化,大幅提升測試效率並確保文件品質。同時,深入探討的環境偵察與規避技術,也為實際測試工作提供了完整的理論基礎與實務指南。在持續演進的資訊安全領域中,掌握這些自動化與對抗技術,將成為專業測試人員不可或缺的核心能力。