身為滲透測試者,我深知在 Linux 系統上進行測試時,繞過 AV(防毒軟體)和 EDR(端點偵測及回應)等安全機制的重要性。這不僅能幫助我們更準確地評估目標系統的安全性,還能最大限度地降低被偵測的風險,尤其在紅隊演練或測試生產系統時至關重要。
本文將分享我多年來積累的實戰經驗,透過一系列 Bash 指令碼和技術,帶領讀者深入瞭解如何在 Linux 環境中巧妙地避開這些安全防線。
環境偵察:知己知彼,百戰不殆
在正式展開攻擊之前,充分了解目標環境的防禦措施是至關重要的。這就好比兵法中的「知己知彼,百戰不殆」。我們需要先摸清敵人的底細,才能制定有效的攻擊策略。
以下列舉幾種常用的偵察技巧,並輔以 圖表和程式碼範例,方便讀者理解和實作。
程式列舉:找出蛛絲馬跡
graph LR A[執行 ps aux] --> B{過濾 AV/EDR 程式} --> C(分析結果)
透過 ps aux
指令,我們可以列出系統中所有正在執行的程式。接著,使用 grep
指令過濾出與 AV/EDR 相關的程式,例如:
sudo ps aux | grep -E "(av|edr|protect|defend|guard)"
此指令利用正規表示式搜尋程式名稱中包含 “av”、“edr” 等關鍵字的程式。由於這些關鍵字可能存在於其他非 AV/EDR 程式中,因此需要仔細分析結果,避免誤判。
檔案系統分析:挖掘隱藏的線索
erDiagram AV_EDR_Files { string filename string path string permissions }
除了程式之外,AV/EDR 軟體通常也會在檔案系統中留下痕跡。我們可以透過搜尋特定的檔案或目錄來發現它們的存在。例如:
find / -name "*antivirus*" -o -name "*edr*" 2>/dev/null
此指令使用 find
命令搜尋檔案系統中名稱包含 “antivirus” 或 “edr” 的檔案。2>/dev/null
將錯誤訊息導向空裝置,避免幹擾輸出結果。
網路連線檢查:追蹤通訊軌跡
sequenceDiagram participant Client participant EDR_Server Client->>EDR_Server: 傳送遙測資料 activate EDR_Server EDR_Server-->>Client: 回應 deactivate EDR_Server
許多 AV/EDR 軟體會定期向遠端伺服器傳送遙測資料。透過監控網路連線,我們可以找出這些通訊軌跡,進而識別出 AV/EDR 軟體的存在。
ss -tuln | grep -E "(8080|443|22)"
此指令使用 ss
命令列出所有網路連線,並過濾出使用常用埠號(例如 8080、443 和 22)的連線。這些埠號通常被 AV/EDR 軟體用於與遠端伺服器通訊。
整合偵察技術:開發全方位偵測方案
為了更有效地偵測 AV/EDR 軟體,我通常會將上述幾種技術整合到一個 Bash 指令碼中。以下是一個簡化的範例:
#!/usr/bin/env bash
# 檢查程式
ps aux | grep -E "(av|edr|protect)"
# 檢查檔案系統
ls -l /opt /etc | grep -E "(av|antivirus|edr)"
# 檢查網路連線
ss -tuln | grep -E "(8080|443)"
這個指令碼結合了程式檢查、檔案系統檢查和網路連線檢查,可以更全面地偵測 AV/EDR 軟體的存在。
深入分析與思考
除了上述基本技術之外,我還會根據具體情況運用其他方法,例如檢查系統服務、核心模組、系統日誌、套件管理器中繼資料以及環境變數等。透過多種途徑收集資訊,才能更準確地判斷目標環境的安全狀態。
在實際滲透測試中,我經常需要根據目標環境的特性調整偵察策略,並結合自身的經驗和技術判斷,才能在複雜的環境中找到突破口。這是一個不斷學習和精進的過程,也是身為滲透測試者的最大挑戰和樂趣所在。
在資訊安全領域,混淆技術扮演著至關重要的角色,它能有效地隱藏惡意程式碼,使其規避安全檢測機制。我多年來在滲透測試的過程中,不斷精進指令碼混淆技巧,累積了豐富的實戰經驗。本文將分享這些心得,並引導你使用 Bash 建立一個自動化混淆框架,使你的指令碼更具隱蔽性和規避能力。
這個框架的核心概念是將各種混淆技術模組化,並動態地將它們應用於指令碼的每一行或每個指令。這種方法不僅增加了混淆的複雜性,也使其更難以被預測和檢測。
基礎混淆技術:編碼與變數名混淆
首先,我們從基礎的混淆技術開始,包括 Base64 編碼和變數名混淆。以下程式碼片段展示瞭如何使用 Bash 函式實作這些功能:
#!/usr/bin/env bash
# Base64 編碼函式
encode_base64() {
echo "$1" | base64
}
# 變數名混淆函式,產生隨機變數名稱
obfuscate_var_name() {
echo "var_$(openssl rand -hex 4)"
}
# 指令混淆函式,將指令轉換為十六進位制字串
obfuscate_command() {
local cmd="$1"
local hex_cmd=$(echo "$cmd" | od -A n -t x1 | tr -d ' \n')
printf "\\x%s" "$hex_cmd"
}
encode_base64()
函式:這個函式的功能相當簡潔,它接收一個字串作為輸入,並使用base64
指令將其編碼後輸出。我經常使用這個函式來編碼指令或敏感資料,增加程式碼的隱蔽性。obfuscate_var_name()
函式:為了避免使用容易被識別的變數名稱,我設計了這個函式。它利用openssl
產生隨機的十六進位制字元,並將其作為變數名的一部分,使得變數名稱更加難以預測。obfuscate_command()
函式:這個函式的核心是使用od
指令將指令轉換為十六進位製表示,再利用printf
將十六進位制值格式化為\x
開頭的字串,方便後續在程式碼中使用。這樣的轉換可以有效地隱藏指令的真實意圖。
進階混淆:動態指令生成與執行
接下來,我們將結合這些基礎函式,構建一個更強大的混淆引擎。這個引擎將接收一個指令作為輸入,並動態地生成混淆後的程式碼,然後在記憶體中執行,避免將混淆後的程式碼寫入磁碟。
# 混淆引擎函式
obfuscate_and_execute() {
local cmd="$1"
local obfuscated_cmd=$(obfuscate_command "$cmd")
eval "printf \"%s\" \"$obfuscated_cmd\" | xargs bash -c"
}
# 使用範例
obfuscate_and_execute "whoami"
obfuscate_and_execute "ls -l"
obfuscate_and_execute()
函式:這個函式是混淆引擎的核心。它首先使用obfuscate_command()
函式將輸入的指令轉換為十六進位製表示。然後,它使用eval
、printf
、xargs
和bash -c
的組合,在記憶體中動態地構建並執行混淆後的指令。這種方法避免了將混淆後的程式碼寫入磁碟,進一步提高了隱蔽性。
持續進化:建構更複雜的混淆策略
這個框架只是自動化混淆的起點。未來,我們可以整合更多更複雜的混淆技術,例如:
- 控制流混淆: 改變程式碼的執行順序,使其更難以追蹤。
- 字串加密: 將敏感字串加密,僅在執行時解密。
- 多型化技術: 動態地改變程式碼的外觀,使其每次執行都不同。
透過不斷地研究和創新,我們可以構建更強大的混淆框架,有效地提升指令碼的規避能力,在資訊安全攻防中佔據更有利的優勢。
混淆流程示意圖
graph LR A[輸入指令] --> B(指令混淆); B --> C{十六進位制編碼}; C -- \x 格式 --> D[混淆後的指令]; D --> E(記憶體執行); E --> F[輸出結果];
圖表説明: 此流程圖展示了指令從輸入到混淆,再到最終執行的完整過程。
graph LR subgraph 混淆引擎 A[輸入指令] --> B{混淆函式}; B --> C[混淆後的指令]; end C --> D(執行); D --> E[輸出結果];
圖表説明: 此流程圖簡化了混淆過程,突出了混淆引擎的作用。
透過這個自動化混淆框架,滲透測試人員可以更有效率地生成規避指令碼,提升測試的效率和成功率。同時,這個框架也為更深入的混淆技術研究提供了堅實的基礎。
我經常思考如何在資訊安全領域中更有效地保護指令碼,避免被輕易分析和破解。根據這個想法,我開發了一個 Bash 自動化混淆框架,它能產生難以預測的混淆指令碼,大幅提升指令碼的規避能力。
模組化混淆技術:靈活運用與擴充套件
為了讓框架更具彈性,我將混淆技術模組化,並儲存在一個陣列中。以下程式碼片段展示瞭如何新增和應用混淆技術:
# 儲存混淆技術的陣列
obfuscation_techniques=()
# 新增混淆技術的函式
add_obfuscation_technique() {
obfuscation_techniques+=("$1")
}
# 範例混淆技術:Base64 編碼
obfuscate_base64() {
echo "echo '$1' | base64 -d | bash"
}
# 範例混淆技術:十六進位制編碼
obfuscate_hex() {
echo "echo -e '$(echo "$1" | od -A n -t x1 | tr -d ' \n')' | bash"
}
# 範例混淆技術:Eval 混淆
obfuscate_eval() {
echo "eval '$1'"
}
# 新增技術到陣列
add_obfuscation_technique obfuscate_base64
add_obfuscation_technique obfuscate_hex
add_obfuscation_technique obfuscate_eval
# 應用隨機混淆技術的函式
apply_random_obfuscation() {
local content="$1"
local technique_index=$((RANDOM % ${#obfuscation_techniques[@]}))
local chosen_technique="${obfuscation_techniques[$technique_index]}"
$chosen_technique "$content"
}
這個設計的核心概念是將不同的混淆方法視為可插拔的模組。obfuscation_techniques
陣列扮演著混淆技術容器的角色,而 add_obfuscation_technique()
函式則負責動態地將新的混淆技術加入到這個容器中。apply_random_obfuscation()
函式則巧妙地利用 RANDOM
變數,實作了混淆技術的隨機選取和應用,增加了指令碼分析的難度。
建立混淆指令碼產生器
接著,我將所有模組整合起來,建立一個完整的混淆指令碼產生器:
# 產生混淆指令碼的主函式
generate_obfuscated_script() {
local original_script="$1"
local obfuscated_script=""
while IFS= read -r line; do
obfuscated_line=$(apply_random_obfuscation "$line")
obfuscated_script+="$obfuscated_line"$'\n'
done < "$original_script"
echo "$obfuscated_script"
}
# 使用範例
original_script="original_script.sh"
obfuscated_script=$(generate_obfuscated_script "$original_script")
echo "$obfuscated_script" > obfuscated_script.sh
generate_obfuscated_script()
函式是整個框架的核心,它讀取原始指令碼,並逐行應用隨機選取的混淆技術。這樣的設計確保了每一行指令碼都可能以不同的方式被混淆,極大地增加了逆向分析的複雜度。
外部函式庫匯入與動態混淆
為了提升框架的擴充套件性,我設計了一個獨立的規避函式庫,並在主指令碼中匯入使用:
source ch14_evasion_library.sh # 假設的函式庫名稱,實際應用需自行建立
透過 source
指令匯入外部函式庫,可以將混淆技術的實作細節與主指令碼分離,提高程式碼的可維護性和重用性。此外,這種模組化的設計也方便日後新增或更新混淆技術,無需修改主指令碼。
流程圖
graph LR A[原始指令碼] --> B{讀取指令碼}; B --> C{逐行處理}; C --> D{應用隨機混淆技術}; D --> E{組合混淆後的指令碼}; E --> F[輸出混淆指令碼];
圖表説明: 此流程圖清晰地展現了指令碼混淆的過程,從讀取原始指令碼到輸出混淆後的指令碼,每一個步驟都一目瞭然。
模組化混淆架構圖
graph LR A[主指令碼] --> B(混淆技術函式庫); B --> C{Base64 編碼}; B --> D{十六進位制編碼}; B --> E{Eval 混淆}; B --> F{其他混淆技術};
圖表説明: 此架構圖突出了框架的模組化設計,混淆技術函式庫作為核心,提供各種不同的混淆方法,主指令碼則根據需要呼叫這些方法。
這個框架提供了一個堅實的基礎,您可以根據實際需求新增更多混淆技術,例如字串反轉、控制流混淆等,使其更加完善。透過這個自動化混淆框架,您可以輕鬆地產生難以預測的混淆指令碼,有效提升指令碼的規避能力,在資訊安全領域中發揮更大的作用。