新 MacOS 後門程式,假冒民主獨立組織發活動邀請函

趨勢科技發現了一個新的 MacOS 後門程式 (趨勢科技命名為:OSX_OCEANLOTUS.D) 應該是 OceanLotus(海蓮花) 駭客集團 (又名:APT 32、APT-C-00、SeaLotus 及 Cobalt Kitty) 曾經用過的某惡意程式最新版本。OceanLotus 據報曾攻擊人權組織、媒體機構、研究機關以及造船廠。OSX_OCEANLOTUS.D 專門攻擊裝有 Perl 程式設計語言的 MacOS 電腦。

此 MacOS 後門程式暗藏在一個惡意 Word 文件內,該文件應該是經由電子郵件散布,其檔名為「2018-PHIẾU  GHI  DANH  THAM  DỰ  TĨNH  HỘI HMDC 2018.doc」(越南文,大意為「2018 年 HMDC 大會報名表」)。這份文件似乎是假冒越南某提倡民主獨立的民間組織 HDMC 所舉辦活動的報名表。專門攻擊 Mac 電腦的惡意程式不如 PC 上那麼普遍,但這個最新 MacOS 後門程式提醒我們,不論是何種作業系統,都應培養對抗網路釣魚的良好習慣

圖 1:惡意文件所使用的圖片。

使用者在收到這份惡意文件時,會被提醒要啟用巨集才能開啟檔案。根據趨勢科技的分析,惡意文件的巨集已經過逐字加密編碼,使用的是十進位 ASCII 碼,如下圖所示:

圖 2:加密編碼過的文件片段。

解密之後,我們可以看到惡意程式碼是採用 Perl 程式語言撰寫。它會從 Word 文件當中解出一個名為「theme0.xml」的檔案。這個 theme0.xml 其實是一個檔頭標記為「0xFEEDFACE」的 32 位元 Mach-O 執行檔,它負責在系統當中植入最終的後門程式。theme0.xml 檔案會被解到「/tmp/system/word/theme/syslogd」目錄底下之後再執行。

Figure 3

圖 3:從惡意文件當中解出的 Perl 程式碼。

後門植入程式分析

後門植入程式負責在感染的系統上安裝後門程式以便讓後門程式持續躲藏在系統內。

Figure 4

圖 4:後門程式植入程式的主要功能。

該植入程式當中的所有字串及後門程式本身皆使用某個寫死的 RSA256 金鑰來加密。加密字串有兩種型態:一種是 RSA256 加密字串,另一種是自訂 base64 編碼與 RSA256 加密字串。

Figure 4

圖 5:寫死的 RSA256 加密金鑰前 20 字元。

後門植入程式會先使用 setStartup() 函式來檢查自己是否以系統管理員 (root) 權限執行。接著,GET_PROCESSPATH (取得執行程序路徑) 和 GET_PROCESSNAME (取得執行程序名稱) 就會根據這項資訊來解開後門程式所要安裝的路徑及檔案名稱 (同樣也是寫死的)。其位置在:

  • Root 使用者

路徑: /Library/CoreMediaIO/Plug-Ins/FCP-DAL/iOSScreenCapture.plugin/Contents/Resources/
執行程序名稱:screenassistantd

  • 一般使用者

路徑:~/Library/Spelling/
執行程序名稱:spellagentd

它會實作 Loader::installLoader 函式來讀取寫死的 64 位元 Mach-O 執行檔內容 (檔頭標記為 0xFEEDFACF),然後將內容寫入前面決定的路徑和檔案。

Figure 6

圖 6:植入程式會在系統安裝後門程式,將其屬性設為「隱藏」,然後隨機指定其檔案日期和時間。

當植入程式安裝好後門程式之後,會將其屬性設為「隱藏」,並且利用系統的 touch 指令來設定隨機的檔案日期和時間:「touch –t YYMMDDMM “/path/filename” > /dev/null」。檔案的存取權限也會改成:0x1ed = 755,也就是 u=rwx,go=rx。

Figure 7

圖 7:64 位元 Mach-O 執行檔的檔頭標記 (0xFEEDFACF)。

GET_LAUNCHNAMEGET_LABELNAME 這兩個函式會傳回寫死的 root 使用者的屬性清單 (.plist) 名稱 (com.apple.screen.assistantd.plist) 以及一般使用者的屬性清單名稱 (com.apple.spell.agent.plist)。

要持續躲藏在系統上的檔案會產生在「/Library/LaunchDaemons/」或「~/Library/LaunchAgents/」資料夾內。機碼「RunAtLoad」用來指示 launchd 指令在系統開機時自動執行該程式,而「KeepAlive」則用來指示 launchd 指令讓執行程序一直保持執行。這個持續躲藏在系統內的檔案也是設成「隱藏」屬性,此外也同樣使用隨機產生的檔案日期和時間。

Figure 8

圖 8:屬性清單內用來持續躲藏的設定。

「launchctl load /Library/LaunchDaemons/filename.plist > /dev/nul」或「launchctl load ~/Library/LaunchAgents/ filename.plist > /dev/nul」用來指示作業系統在使用者登入時啟動被植入的後門程式。最後,植入程式會在執行程序結束時將自己刪除。

後門程式分析

後門程式主要會呼叫兩個函式:「infoClient」和「runHandle」。 其中,infoClient 負責蒐集作業系統資訊,並將這些資訊傳送至幕後操縱 (C&C) 伺服器,然後接收進一步的 C&C 通訊。而 runHandle 則負責執行後門功能。

Figure 9

圖 9:後門程式主要會呼叫兩個函式。

infoClient 會蒐集並填妥 HandlePP 類別當中的變數。

Figure 10

圖 10:HandlePP 類別當中的變數。

其中,clientID 是一個利用環境變數產生的 MD5 雜湊碼,strClientID 是一個用 16 進位表示的 clientID 字串。接下來的所有字串都經過 AES256 和 base64 加密且編碼。HandlePP::getClientID 函式會用到以下環境變數:

Figure 11

圖 11:序號。

Figure 12

圖 12:硬體識別碼 (UUID)。

Figure 13

圖 13:網路卡 MAC 位址。

Figure 14

圖 14:隨機產生的識別碼 (UUID)。

在一開始的資訊封包當中,後門程式還會蒐集以下資訊:

Figure 15

圖 15:作業系統版本。

執行「getpwuid ->pw_name」、「scutil – -get ComputerName」和「uname –m」會分別得到以下資訊:

  • Mac OSX 10.12
  • System Administrator
  • <擁有人>’s iMac
  • x86_64

這些資料都會經過編碼並加密之後,傳送至 C&C 伺服器。其詳細過程如下:

  1. 編碼

Parser 類別有幾個函式,分別對應不同的變數類型:Parser::inBytes、Parser::inByte、Parser::inString 及 Parser::inInt。

圖 16:Parser::inBytes 函式。

假設 clientID 為這串位元組:「B4 B1 47 BC 52 28 28 73 1F 1A 01 6B FA 72 C0 73」,該函數會使用其第三個參數「0x10」(將它當成 DWORD) 來計算出編碼後的版本,以每四個位元組為一單位進行 XOR 運算,如下所示。

Figure 17

圖 17:Parser::inByte 函式。

若要對單一位元組編碼時,編碼函式會判斷該位元組是奇數還是偶數。若是奇數,就將該位元組與另一個隨機產生的位元組一同加入陣列。如果是偶數,那就先將隨機產生的位元組加入陣列,然後再加入該位元組。同前例,第三個參數是「1」= 0x31,此時是奇數。所以,「1」會再搭配一個隨機產生的位元組,一起加入最後編碼過的陣列。

Figure 18

圖 18:Parser::inString 函式。

當要編碼的是一個字串時,編碼函式會產生一個長度 5 位元組的序列。首先,它會產生一個隨機的位元組,後面接著 3 個零位元組、再接一個隨機位元組,最後一個位元組是字串長度。比方說,我們要將「Mac OSX 10.12」這串字編碼。其長度為 13 = 0x0d,而隨機產生的兩個位元組分別是 0xf3 和 0x92。所以最後的 5 位元組序列就是「F3 00 00 00 92 0D」。接下來,再將原始字串與這個 5 位元組序列進行 XOR 運算。

Figure 19

圖 19:將「Mac OSX 10.12」這個串字編碼。

  1. 加密檔案

編碼後的位元組序列會回傳給 Packet::Packet 類別的建構函式,該函式會產生一個隨機的 AES256 金鑰,然後以此金鑰將緩衝區內的資料加密。

  1. 將加密金鑰編碼

為了讓 C&C 伺服器能夠解開加密的資料,隨機產生的 AES256 金鑰必須隨著加密的資料一起傳回伺服器。這金鑰的編碼方式是先經過 XOR 0x13 運算,然後每個位元組再經過 ROL 6 運算。

Figure 20

圖 20:負責將 AES256 金鑰編碼的函式。

以下是編碼與加密過程當中抓到的一些螢幕畫面:

Figure 21

圖 21:反白的位元組代表經過編碼的電腦資訊。

Figure 22

圖 22:隨機產生的 AES256 金鑰。

Figure 23

圖 23:編碼過後的 AES256 金鑰 (0xC1 XOR 0x13 = 0xD2, 0xD2 ROL 6 = 0xB4,依此類推)。

Figure 24

圖 24:經過 AES256 金鑰加密過後的電腦資訊。

Figure 25

圖 25:最後準備傳送給 C&C 伺服器的資料:編碼後的 AES256 金鑰為綠色框起來部分,加密過後的電腦資訊為紅色框起來部分,剩餘的位元組都只是隨機產生的雜訊。

當後門程式接收到 C&C 伺服器的回應時,也需要做對應的解密與解碼動作。Packet::getData 負責將接收到的資料解密,Converter::outString 則負責將接收到的資料解碼。

從 C&C 伺服器所接收到的資料,包含以下資訊:

  • HandlePP::urlRequest (/appleauth/static/cssj/N252394295/widget/auth/app.css)
  • HandlePP::keyDecrypt
  • STRINGDATA::BROWSER_SESSION_ID (m_pixel_ratio)
  • STRINGDATA::RESOURCE_ID

這些資料會用於後續的 C&C 通訊,如以下 Wireshark 截圖所示。

Figure 26

圖 26:在交換過作業系統資訊之後的 C&C 通訊。

後門程式主程式碼當中的 runHandle 會呼叫 requestServer 函式來接收幕後操縱指令 (每一指令含有一位元組的代碼,該代碼使用 Packet::getCommand 函式來解碼):

Figure 27

圖 27:getCommand 函式。

下圖顯示其中兩個可能的指令。這兩個指令都會產生一個執行緒,分別負責下載並執行某個檔案,以及執行電腦上的某個指令列程式:

Figure 28

圖 28:用來下載並執行檔案的指令,以及用來執行電腦上某程式的指令。

Figure 29

圖 29:用來上傳與下載檔案的指令。

圖 30:後門程式所支援的指令以及對應的代碼。

可能經由網路釣魚郵件散布

專門攻擊 Mac 電腦的惡意程式不如 PC 上那麼普遍,但這個最新 MacOS 後門程式的發現,以及它很可能經由網路釣魚郵件散布,不由得讓人意識到,不論是何種作業系統,使用者都應培養對抗網路釣魚的良好習慣

除此之外,一般使用者可採用榮獲AV-TEST防禦力及效能認證的 PC-cillin2018雲端版專門為 Mac 電腦設計的防毒軟體,為您的蘋果電腦保持在最安全狀態。企業機構可採用以 XGen™ 防護為基礎的趨勢科技 Smart Protection Suites這套融合跨世代威脅防禦技巧與高準度機器學習的防護,來防止任何使用者活動與任何端點裝置所帶來的資安漏洞。

入侵指標 (IoC)

C&C 伺服器
Ssl.arkouthrie.com
s3.hiahornber.com
widget.shoreoa.com

 

SHA256 雜湊碼
惡意文件 (W2KM_OCEANLOTUS.A):2bb855dc5d845eb5f2466d7186f150c172da737bfd9c7f6bc1804e0b8d20f22a
後門植入程式 (OSX_OCEANLOTUS.D): 4da8365241c6b028a13b82d852c4f0155eb3d902782c6a538ac007a44a7d61b4
後門程式 (OSX_OCEANLOTUS.D): 673ee7a57ba3c5a2384aeb17a66058e59f0a4d0cddc4f01fe32f369f6a845c8f