Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86383508

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

今年4月,JAMF的研究人員就詳細介紹了一場針對macOS用戶的複雜APT活動,該活動利用多階段惡意軟件,最終形成了能夠在受感染的設備上下載和執行下一步惡意軟件的Rust後門,他們稱之為“RustBucket”,根據已有的證據,研究人員認為其幕後組織是朝鮮黑客組織“BlueNoroff”,“BlueNoroff”通常被認為是Lazarus的分支。

RustBucket能夠被植入到受害者的設備中,隨時自動調整各項配置,以逃避殺毒軟件的檢測,因此非常難以被察覺。 RustBucket 利用AppleScript,當用戶打開某些特定網站時,會加載相關惡意組件,然後將這款木馬儲存在本地。之後,黑客則可以通過NSTask 啟動這款木馬並收集受害者的隱私信息。 為了能夠持續收集用戶信息,攻擊者會將這款木馬加入名為LaunchAgents 的開機自啟文件夾中,並且會不斷調整木馬的各項配置,以盡可能地迴避殺毒軟件的檢測。 目前,該惡意軟件還無法被檢測到,因此用戶在實際的使用過程中,往往非常難以察覺這款惡意木馬的存在。

今年5月,ESET發布了針對macOS用戶的第二個RustBucket變體的詳細信息,隨後在6月,Elastic發現了第三個變體,其中包括以前未見過的持久化功能。

值得注意的是,RustBucket在惡意軟件的各個階段所採取的反逃避和反分析措施的範圍和類型。我們將在本文回顧該活動中使用的多種惡意軟件有效負載,並強調了RustBucket為逃避分析和檢測而部署的新技術。

階段1:AppleScript Dropper攻擊始於一個偽裝成PDF Viewer應用程序的Applet。 Applet只是以.app格式保存的經過編譯的AppleScript。與常規的macOS應用程序不同,Applet通常缺乏用戶界面,其功能僅作為開發人員向用戶傳播AppleScript的一種方式。

惡意攻擊者選擇不將腳本保存為僅運行,這允許我們使用內置的osadecompile工具輕鬆地反編譯腳本,實際上,這就是蘋果GUI腳本編輯器在查看編譯腳本時在後台運行的內容。

1.png

階段1執行三個“執行shell腳本”命令來設置階段2

該腳本包含三個do shell腳本命令,用於下載和執行下一階段。在JAMF描述的變體中,這是一個名為內部PDF查看器的基本PDF查看器。

階段1將階段2寫入/Users/Shared/文件夾,該文件夾不需要權限,惡意軟件無需繞過TCC即可訪問。與Elastic描述的階段1變體的不同之處在於,它將階段2作為隱藏文件寫入/Users/Shared/.pd。

階段1很容易成為攻擊鏈中最簡單和最容易被檢測到的部分。 do shell腳本命令的參數應該出現在Mac的統一日誌中,並作為命令行工具(如ps實用程序)的輸出。

階段1的成功在很大程度上取決於攻擊者使用社會工程策略的程度。在JAMF描述的示例中,攻擊者使用了一個精心設計的技巧,要求“內部”PDF閱讀器讀取所謂的機密或“受保護”文件。受害者被要求執行階段1,相信它能夠閱讀他們收到的PDF文件。事實上,階段1只是一個dropper,旨在保護階段2順利運行,以防沒有惡意PDF的人偶然發現它。

階段2:用Swift和Objective-C編寫的有效負載研究人員發現了許多不同的Stage 2有效負載,有些是用Swift編寫的,有些是用Objective-C編寫的,並且都是為英特爾和蘋果的矽架構編譯的。階段2示例的大小和代碼工件各不相同。通用的“fat”二進製文件在160Kb到210Kb之間。

2.png

大小不一

在這些示例中,可以找到各種用戶名字符串。到目前為止,我們在階段2的二進製文件中觀察到內容如下所示:

3.png

儘管在大小和代碼構件方面存在差異,但是階段1、2的有效負載都具有從命令和控制服務器檢索階段3的共同任務。階段2有效負載需要一個特製的PDF來解鎖代碼,這將導致下載階段3,並提供一個異或密鑰來解碼附加在PDF末尾的混淆C2。

在一些變體中,這些數據是在之前的研究人員所描述的downAndExecute函數中執行的,在其他情況下,研究人員注意到下一階段的下載是在名為down_update_run函數中執行的。此函數會因示例而異。例如,在b02922869e86ad06ff6380e8ec0be8db38f5002b中,它通過system()運行硬編碼命令。

4.png

階段2通過system()調用執行shell命令來檢索並運行階段3

但是,相同的函數在其他示例中(例如,d5971e8a3e8577dbb6f5a9aad248c842a33e7a26)使用NSURL API和完全不同的邏輯。

5.png

不同示例的代碼差異很大,這可能表明開發人員不同

Elastic的研究人員進一步指出,在用Swift編寫的階段2的一個新變體中,User Agent字符串都是小寫的,而在早期的Objective-C示例中則不是。

6.png

User Agent字符串從階段2的Objective-C版本微妙地更改為Swift版本

雖然User-Agent字符串本身不區分大小寫,但如果這是一個有意的更改,則攻擊者可能正在服務器端解析User-Agent字符串,以排除對C2的不必要調用。也就是說,在RustBucket示例的其他地方(例如,階段1中的“/users/shared”)可以看到大小寫方面的粗心,並且大小寫差異可能是不同開發人員使用不同標準的結果。

在最近的示例中,在受害者的設備上執行之前,階段2檢索的有效負載在_CS_DARWIN_USER_TEMP(又名$TMPDIR,通常位於/var/folders/……/……/t /)中以“ErrorCheck.zip”的形式寫入磁盤。

階段3:新版本釋放持久性LaunchAgent到目前為止,階段3的有效負載有兩種不同的變體:

A: 182760cbe11fa0316abfb8b7b00b63f83159f5aa Stage3

B: b74702c9b82f23ebf76805f1853bc72236bee57c ErrorCheck, System Update

這兩個變體都是從Rust源代碼編譯的Mach-O通用二進製文件。變體A比變體B大得多,前者的通用二進製文件重11.84MB,而變體B的通用二進製文件重8.12MB。精簡後的新變體導入的crate要少得多,並且較少使用兩者中的sysinfo crate。值得注意的是,變體B取消了變體A中用於收集環境信息和通過查詢system_profiler的SPHardwareDataType值來檢查虛擬機中的執行情況的webT類。

7.png

webT類出現在階段3有效負載的變體A中

然而,變體B並沒有清除代碼中的所有webT構件,對缺失模塊的引用仍然可以在字符串中找到。

8.1.png

8.2.png

在階段3變體B中仍然可以找到引用缺失的webT模塊的字符串

子字符串“Trojan”在早期變體中沒有出現,它也出現在同一字符串引用的文件路徑中。

重要的是,變體B包含了一個在早期版本的RustBucket中不存在的持久機制。它採用了硬編碼的LaunchAgent的形式,它被寫入磁盤~/Library/LaunchAgents/com.apple.systemupdate.plist。 ErrorCheck文件也將自己的副本寫入~/Library/Metadata/System Update,並作為LaunchAgent的目標可執行文件。

因為階段3需要URL作為啟動參數,因此在屬性列表中提供URL作為程序參數。奇怪的是,在啟動時傳遞給ErrorCheck的URL被附加到LaunchAgent plist中的這個硬編碼URL。

9.png

RustBucket LaunchAgent將硬編碼的URL與啟動時提供的URL聯繫起來

在變體A的webT方法中發現的許多惡意軟件功能,在變體B中,現在隱藏在巨大的symm .updator:main函數中。它負責監視環境並解析啟動時接收到的參數、處理命令、收集磁盤信息等。這個龐大的函數超過22Kb,包含501個基本塊。不過經過分析,除了Elastic之前描述的功能之外,該功能還收集磁盤信息,包括主機設備的磁盤是SSD還是舊的rotational platter 類型。

10.png

updator:main的任務之一是收集磁盤信息

在收集環境信息後,惡意軟件調用symm .updator:send_request,使用以下User-Agent字符串(這次不是小寫)將數據發佈到C2:

11.png

惡意軟件將比較兩個硬編碼值0x31和0x30的響應結果

12.png

檢查來自C2的響應值

在Elastic分析的樣本中,0x31會導致惡意軟件自我終止,而0x30允許操作者在_CS_DARWIN_USER_TEMP目錄中再釋放一個有效負載。

Rust的選擇和階段3二進製文件的複雜性表明,攻擊者願意投入大量精力來阻止對有效負載的分析。由於已知的C2在進行分析時沒有響應,所以研究人員無法獲得惡意軟件下一階段的樣本,但在操作時,惡意軟件已經收集了大量的主機信息,實現了持久性,並為進一步的惡意活動打開了後門。

緩解措施SentinelOne Singularity可以保護客戶免受已知RustBucket惡意軟件組件的攻擊。在macOS設備上安裝持久性機制的嘗試也會被代理動態檢測和阻止。

13.png

SentinelOne Agent用戶界面

14.png

總結RustBucket活動說明,該攻擊者(之前的研究人員將其歸因於朝鮮的BlueNoroff APT)已經投入了大量資源,專門針對macOS用戶開發了多階段攻擊,並不斷嘗試改進,以阻止分析。