這個 Bash 指令碼利用 GVM 進行自動化漏洞掃描,首先接收密碼和目標主機作為引數,接著在 GVM 系統中建立目標和任務,最後啟動掃描任務並輸出結果。指令碼的核心邏輯是透過 gvm-cli 工具與 GVM 伺服器互動,利用 XML 格式的請求建立和管理掃描任務。其中,使用 sed 命令處理目標主機名稱,確保其符合 GVM 的要求。在建立目標和任務時,指令碼會從 GVM 伺服器的 XML 回應中提取 target_id 和 task_id,並檢查是否成功。啟動任務後,指令碼會持續監控任務狀態,直到掃描完成。最後,利用 xmlstarlet 和 awk 等工具從 XML 格式的掃描結果中提取關鍵資訊,並以表格形式呈現,方便使用者檢視。指令碼中還包含了錯誤處理機制,例如在建立目標或任務失敗時,會輸出錯誤訊息並離開。此外,指令碼也示範瞭如何使用 XPath 表示式選取 XML 資料、如何排序和篩選資料,以及如何格式化資料輸出。這些技巧可以幫助使用者更好地理解和分析掃描結果。
根據 Bash 的基礎設施漏洞評估
使用 Bash 進行基礎設施漏洞評估是一種有效的方法,能夠自動化漏洞掃描並分析結果。以下是一個完整的範例指令碼,玄貓將詳細解釋每一步的邏輯及其背後的技術原理。
首先,玄貓來介紹這個指令碼的基本架構。這個指令碼會接受兩個引數:密碼和目標主機。接著,它會在 GVM(Greenbone Vulnerability Manager)系統中建立目標、任務,並啟動掃描任務。
基本引數設定
password="$1"
target_host="$2"
這段程式碼將第一個引數指定給 password 變數,第二個引數指定給 target_host 變數。這樣可以方便地在指令碼中使用這些引數。
生成目標名稱
target_name=$(echo -n "$target_host" | sed 's/\//_/g')
這裡,玄貓使用 sed 命令將目標主機中的所有斜槓替換為底線,以便生成一個合法的目標名稱。
建立目標
echo "[+] Creating target"
target_id=$(gvm-cli --gmp-username admin --gmp-password "$password" socket --xml "<create_target><name>$target_name</name><hosts>$target_host</hosts><port_range>1-65535</port_range></create_target>" | grep -o 'id="[^"]*"' | sed -e 's/id="//' -e 's/"//')
if [ -z "$target_id" ]; then
echo "[-] Failed to create target"
exit 1
fi
內容解密:
gvm-cli --gmp-username admin --gmp-password "$password" socket --xml "<create_target>...</create_target>":這行命令使用gvm-cli工具傳送一個 XML 請求到 GVM 伺服器,建立一個新的掃描目標。<create_target>...</create_target>:這是 XML 請求的內容,其中包含了目標的名稱、主機和埠範圍。grep -o 'id="[^"]*"':這行命令從 XML 回應中提取出id標籤的值。sed -e 's/id="//' -e 's/"//':這行命令去除提取出來的id值中的不必要字元,留下純粹的 ID。- 如果
target_id為空,則表示建立目標失敗,指令碼會輸出錯誤訊息並離開。
建立任務
echo "[+] Creating task"
task_id=$(gvm-cli --gmp-username admin --gmp-password "$password" socket --xml "<create_task><name>Task_$target_name</name><comment>Scanning $target_host</comment><config id='daba56c8-73ec-11df-a475-002264764cea'/><target id='$target_id'/></create_task>" | grep -o 'id="[^"]*"' | sed -e 's/id="//' -e 's/"//')
if [ -z "$task_id" ]; then
echo "[-] Failed to create task"
exit 1
fi
內容解密:
<create_task>...</create_task>:這是 XML 請求的內容,其中包含了任務的名稱、註解、組態和之前建立的目標。- 其餘部分與建立目標類別似,提取
task_id並檢查是否成功。
啟動任務並等待完成
echo "[+] Starting task"
report_id=$(gvm-cli --gmp-username admin --gmp-password "$password" socket --xml "<start_task task_id='$task_id'/>" | grep -oP '(?<=<report_id>).*?(?=</report_id>)')
內容解密:
<start_task task_id='$task_id'/>:這是 XML 請求的內容,用於啟動之前建立的任務。grep -oP '(?<=<report_id>).*?(?=</report_id>)':這行命令使用正規表示式從 XML 回應中提取出report_id的值。(?<=<report_id>)是正向檢視語法,確保比對的文字前面有一個<report_id>標籤。.*?是非貪婪比對模式,比對最少字元。(?=</report_id>)是正向檢視語法,確保比對的文字後面有一個</report_id>標籤。
等待任務完成
echo "[-] Waiting for scan result. This may take a while."
while true; do
output=$(gvm-cli --gmp-username admin --gmp-password "$password" socket --xml "<get_tasks task_id='$task_id'/>" 2>/dev/null | xmllint --format -)
if echo "$output" | grep -q '<status>Done</status>'; then
break
fi
sleep 60
done
echo "[+] The scan is complete."
內容解密:
<get_tasks task_id='$task_id'/>:這是 XML 請求的內容,用於取得任務的狀態。xmllint --format -:這行命令格式化 XML 輸出,使其更易讀。if echo "$output" | grep -q '<status>Done</status>': 嘗試搜尋<status>Done</status>標記以確認掃描完成。如果找到該字串,則表示掃描已完成並跳出迴圈;若未找到則等待六十秒後繼續檢查。
列印掃描結果
echo "[+] Printing scan results..."
gvm-cli --gmp-username admin --gmp-password "$password" socket --xml "<get_results task_id=\"$task_id\" filter='notes=1 overrides=1'/>" |\
xmlstarlet sel -t -m "//result" \
-v "host" -o "|" \
-v "host/hostname" -o "|" \
-v "port" -o "|" \
-v "threat" -o "|" \
-v "name" -o "|" \
-v "severity" -n |
sort -t'|' -k6,6nr |
awk -F'|' '{printf "%s\t%s\t%s\t%s\t%s\n", $1, $2, $3, $4, $5}'
內容解密:
此圖示展示瞭如何根據XPath路徑從XML輸出中提取所需資料: 此圖示展示瞭如何根據XPath路徑從XML輸出中提取所需資料: 此圖示展示瞭如何根據XPath路徑從XML輸出中提取所需資料: 此圖示展示瞭如何根據XPath路徑從XML輸出中提取所需資料: 此圖示展示瞭如何根據XPath路徑從XML輸出中提取所需資料: 此圖示展示瞭如何根據XPath路徑從XML輸出中提取所需資料: 此圖示展示瞭如何根據XPath路徑從XML輸出中提取所需資料:
掃描結果格式化
內容解密:
在分析完以上程式碼後我們可以得知以下步驟:
- 接收來自掃描任務中的結果。
- 接收回傳資訊並利用 XmlStarlet 擷取特定樣式之 JSON 資料(如:主機名稱、威脅型別、嚴重性等)。
- 排序方式順序依照嚴重性排序(由高至低)。
- 排序方式物件為第六欄位(即嚴重性)。
注意事項
在實際應用上可以依照不同用途設計自己的 XMLStarlet 語法範本或改寫前端程式碼以呈現不同樣式之結果。 例如:
- 若需要顯示其他欄位時可自行新增使用
-v <欄位名稱>語法以顯示相對應之欄位。 - 若需要顯示更多細節時可以在額外新增
filter=屬性以呈現更多之細節。
最後希望能幫助讀者更深入瞭解在安全評估過程中採用什麼方式來進行設計漏洞評估系統架構與自動化流程。
此為玄貓第一次嘗試利用 bash 做漏洞評估系統之系統架構與自動化流程
網路與基礎設施測試使用 Bash
使用 XPath 進行 XML 資料選取
XPath 是一種用於導航 XML 檔案的語言,可以用來選取特定的元素。例如,以下 XPath 表示式可以選取 XML 檔案中的所有 result 元素,無論它們在層級結構中的位置:
//result
這樣的表示式可以幫助我們快速定位並提取所需的資料。
排序與篩選資料
在處理大量資料時,排序是一個常見且重要的操作。以下是一些常見的排序命令及其用法:
sort -t'|' -k6,6nr
-t'|':指定分隔符號為|。-k6,6nr:使用第六欄位作為排序鍵,並且以數值形式反向排序。
這樣的命令可以幫助我們快速找到需要的資料,並且能夠更有效地進行後續的分析。
資料格式化與展示
在展示資料時,格式化是非常重要的。以下是一個使用 awk 的範例,展示如何將分隔符號為 | 的資料進行格式化輸出:
awk -F'|' '{printf "%s\t%s\t%s\t%s\t%s\n", $1, $2, $3, $4, $5}'
-F'|':指定分隔符號為|。{ ... }:定義要對每一行進行的操作。printf:用於格式化輸出。"%s\t%s\t%s\t%s\t%s\n":指定輸出格式,每個欄位以\t分隔。$1, $2, $3, $4, $5:分別表示第一到第五個欄位。
這樣的命令可以幫助我們將原始資料轉換為更易讀的格式。
執行許可權設定與指令碼管理
在執行一些需要高許可權的指令碼時,我們需要確保指令碼能夠正確地執行。以下是一些常見的許可權設定步驟:
$ mkdir ~/shared_scripts
$ cp ch10_gvm_scan.sh ~/shared_scripts
$ sudo chmod 775 /home/kali/shared_scripts
$ sudo chown -R kali:_gvm /home/kali/shared_scripts
- 建立目錄:使用
mkdir命令建立一個新目錄。 - 複製指令碼:將指令碼複製到新建立的目錄中。
- 設定許可權:使用
chmod命令設定目錄的許可權,確保使用者和群組都有讀寫和執行的許可權。 - 修改擁有者:使用
chown命令將目錄和內部檔案的擁有者改為kali使用者和_gvm群組。
這樣的步驟可以確保指令碼能夠正確地執行,並且不會因為許可權問題而失敗。
此圖示展示如何執行指令碼並顯示指令碼輸出
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Bash 自動化基礎設施漏洞評估技術與實踐
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此圖示展示瞭如何執行 Greenbone 情報掃描指令碼並顯示掃描結果。從執行指令碼開始,經過指令碼處理後,最終顯示掃描結果。
內容解密:
- 圖示結構解析:圖中包含三個主要節點(A、B、C),分別代表執行指令碼、指令碼輸出以及掃描結果。
- 流程關係:A(執行指令碼)到 B(指令碼輸出)表示當我們執行指令碼時會產生輸出;B(指令碼輸出)到 C(掃描結果)則表示這些輸出最終會轉換為具體的掃描結果。
- 功能與應用:這種流程圖有助於理解從執行指令碼到取得結果之間的過程,特別是在涉及複雜任務或多步驟操作時。
自動化與效率提升
在測試過程中,自動化是提高效率的關鍵。透過自動化工具和指令碼,我們可以將重複性高且耗時的任務交給機器處理,從而節省時間和精力,專注於更深入的分析和問題解決。
透過 Bash 指令碼來進行網路測試和自動化,我們可以大幅提升測試效率。無論是基本的埠掃描還是進階技術,都能夠透過適當的工具和技巧來完成。此外,瞭解常見網路協定及其潛在漏洞也能夠幫助我們更好地進行測試和攻擊。
許可權提升技術概述
許可權提升概念介紹
許可權提升(Privilege Escalation)是指在 Unix/Linux 系統中將低許可權使用者提升至高許可權使用者。這通常涉及到利用系統中的漏洞或誤組態來獲得更高階別的存取許可權。根據其型別,許可權提升可以分為垂直提升(Vertical Privilege Escalation)和水平提升(Horizontal Privilege Escalation)。
- 垂直提升:這種情況下,攻擊者從低許可權使用者提升到高許可權使用者(例如從普通使用者到 root 使用者)。
- 水平提升:攻擊者在相同許可權等級之間獲得其他使用者或系統資源存取。
透過 Bash 做系統列舉
在系統中進行列舉(Enumeration)是首要步驟之一。透過列舉我們可以取得系統組態、已安裝軟體、系統服務等資訊。通常這些資訊對於進行進一步攻擊非常重要。
以下是如何列舉系統中具有 SUID 或 SGID 屬性檔案:
find / -type f -perm -4000 2>/dev/null
find / -type f -perm -2000 2>/dev/null
/: 指定搜尋根目錄下所有檔案。-type f: 搜尋檔案型別為檔案。-perm -4000: 搜尋具有 SUID 屬性檔案。-perm -2000: 搜尋具有 SGID 屬性檔案。2>/dev/null: 忽略錯誤訊息。
這樣可以快速找到系統中可能存在漏洞或被利用的檔案。
巧妙利用服務組態漏洞
除了已知漏洞之外,誤組態也是常見且危險的一類別漏洞。例如未正確設定許可權或軟體版本未更新等都可能成為攻擊者進入系統的一條途徑。
例如:利用未正確設定許可權之 Cron 作業:
# 檢視所有 cron 作業檔案內容:
ls -la /etc/cron*
# 在可寫入作業中植入惡意程式碼:
echo "malicious_command" >> /etc/cron.d/allowable_jobs
- 查詢 cron 作業檔案:首先我們需要找到並檢查可寫入之 cron 作業檔案。
- 植入惡意程式碼:如果發現可寫入作業檔案存在無防護情形之下我們可以直接加入惡意程式碼以達到攻擊目的。
SSH Key 組態導致攻擊面放大
SSH 金鑰通常被認為比密碼更安全但如果沒有正確設定或管理則可能會造成重大安全風險:
# 查詢可寫入 .ssh 授權檔案:
find /home/ -name authorized_keys -perm -0600 2>/dev/null
# 應該檢查 .ssh 授權檔案是否包含合法公開金鑰:
cat /home/username/.ssh/authorized_keys
- 找出合適攻擊面:首先我們需要找出哪些 .ssh 授權檔案允許一般使用者可寫入。
- 植入惡意公開金鑰:接著我們便可以新增自己的公鑰至該授權檔案以實作 SSH 隱密登入目的。
未來趨勢與預防建議
隨著系統越來越複雜和多樣化,預防未來可能出現之問題可考慮以下建議:
- 持續更新與補丁管理:定期更新作業系統及安裝之軟體補丁可減少已知漏洞被利用之風險。
- 嚴謹設定與監控:儘量避免設定過於放鬆之許可模式並且應該定期監控系統中的異常活動。
- 應用最小許可原則:僅授予必要之許可模式以減少潛在攻擊面而影響安全性。
透過上述方法我們便可以大幅度降低被成功之攻擊機會並且確保系統安全效能得以維持。