身為滲透測試者,我深知在 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() 函式將輸入的指令轉換為十六進位製表示。然後,它使用 evalprintfxargsbash -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{其他混淆技術};

圖表説明: 此架構圖突出了框架的模組化設計,混淆技術函式庫作為核心,提供各種不同的混淆方法,主指令碼則根據需要呼叫這些方法。

這個框架提供了一個堅實的基礎,您可以根據實際需求新增更多混淆技術,例如字串反轉、控制流混淆等,使其更加完善。透過這個自動化混淆框架,您可以輕鬆地產生難以預測的混淆指令碼,有效提升指令碼的規避能力,在資訊安全領域中發揮更大的作用。