惡意程式
採用 Node.js 框架撰寫的 Facebook 個人檔案竊取程式
趨勢科技分析了一個採用 Node.js 框架撰寫的資訊竊取程式,它會封裝成一個執行檔,然後透過 Telegram 機器人 API 和一個 C&C 伺服器將偷到的資料外傳,並使用 GraphQL 作為 C&C 通訊方式。
之前我們在研究一起使用 Facebook 資訊竊取程式的攻擊行動 時,發現了另一個值得探討的資訊竊取程式。它採用 Node.js 伺服器端JavaScript框架撰寫,並封裝成一個執行檔,然後透過 Telegram 機器人 API 和一個幕後操縱 (C&C) 伺服器將偷到的資料外傳,並使用 GraphQL 作為 C&C 通訊方式。本文詳細說明這個新的資訊竊取程式,並深入分析其行為和能力。
感染途徑
近期行動
如同之前的攻擊行動,我們發現這個資訊竊取程式是經由大型語言模型 (LLM) 主題的 Facebook 惡意廣告散播。這些惡意廣告內含連結指向一個 Google Sites 上的網頁,該網頁再指向一個 Trello (線上專案與工作管理工具) 上的一個壓縮檔。
先前的行動
再往前搜尋一點,我們就發現之前舊的攻擊行動同樣使用 Trello 來散播含有資訊竊取程式的壓縮檔。其檔案名稱會使用一些特殊的關鍵詞,例如:「marketing specialist」(行銷專員)、「marketing recruitment」(行銷人員招募)、「CV sample」(學經歷範例)、「advertising campaign」(廣告活動)、「marketing project」(行銷專案) 以及一些知名的數位平台服務,例如:Google、Facebook 和 TikTok。
另一個樣本假冒成 CapCut 視訊編輯器的網站來誘騙受害者下載惡意程式套件。
Node.js 封裝
此壓縮檔會包含一個 50 – 70MB 大小的單一執行檔。請注意,資訊竊取程式本身的 JavaScript 程式碼相當小 (不到 100KB),但其內嵌的 Node.js 二進位檔案以及所有的 pkg 套件會讓整個檔案變大。由於所有需要的檔案都已經封裝在單一檔案中,所以就不需要再下載或安裝其他相依元件。在封裝過程中,pkg 會使用一個 source map (原始碼對照檔) 將所有原始檔合併成單一檔案。
這個 source map 的位移和長度記錄在封裝後的執行檔末端。研究人員可利用其提供的資訊來從套件當中擷取出想要的原件。如圖 5 所示,「app.js」 (主檔案) 是應用程式的起始點。
資訊竊取程式
當資訊竊取程式執行時,它的主函式可從各種基於 Chromium 的網頁瀏覽器竊取 cookie 和登入憑證,然後將資料外傳到 C&C 伺服器以及 Telegram 機器人。此外也會透過訂閱的方式將用戶端登錄到使用 GraphQL 的 C&C 伺服器。當 C&C 伺服器發送訊息給用戶端時,用戶端就會再次執行資訊竊取功能。
主函式行為
- 主函式會避免資訊竊取程式執行得太過頻繁,所以資訊竊取程式會將其上次執行的時間戳記寫入使用者目錄 (c:\Users\<username>) 的一個文字檔案中。如果上次執行到這次執行之間的間隔還不到 30 分鐘左右 (確切數字是:0x1cd6d0 毫秒 = 1890000毫秒 = 1890 秒 = 31.5 分鐘),那麼資訊竊取程式這次就會跳過不執行。
- 此外,它會查詢「<C&C server>/bk/map.txt」這個檔案以便找出備用的 C&C 伺服器位址 (該位址採用 Base64 編碼)。這個備用位址也會儲存到使用者目錄中的另一個文字檔以供後續使用。
- 它利用 whoer.net 網站來取得其外部 IP 位址。
- 它會初始化 graphql-ws、ws 及其他必要函式庫來啟用 GraphQL,並透過 websockets 與 C&C 伺服器通訊,接著再初始化 Apollo Client 來存取一個自行代管的超圖 (supergraph)。
- 它會向 C&C 伺服器訂閱來讓 C&C 伺服器能推播訊息到受害的電腦。它使用 zen-observable 函式庫來訂閱具備回呼 (callback) 功能的 observable。訂閱動作包含一個外部 IP 位址作參數,其回應 (也就是推播訊息的內容) 會傳回一個字串 (value _id)。
- 它會執行資訊竊取流程。
- 最後將自己複製到使用者目錄,然後設定好開機自動執行。
處理推播訊息
當駭客推播一個訊息給受感染的用戶端時,用戶端收到的訊息會使用 JSON 格式,如圖 6 所示。此訊息的目的是要指派一個「_id」(識別碼) 給受感染的用戶端。
當用戶端收到 _id 後,就會再發送一個訊息回去給 C&C 伺服器來修改一些後端資料 (在 GraphQL 中的用語叫作 mutation)。這個 mutation 動作含有先前指派的 _id,後面跟著一個狀態訊息以及當下的日期和時間,接著是所有從瀏覽器竊取的登入憑證。
完成資訊竊取流程之後,用戶端會再發送一個狀態訊息給伺服器,告訴它資訊竊取流程已經完成。萬一伺服器在資訊竊取流程進行當中推播了一個訊息給用戶端,用戶端會回覆一個「wait for the completion」(請等候完成) 的訊息。
這些訊息是用來啟動資訊竊取流程。駭客會維護一份等候啟動 (也就是等候接收訊息) 的受感染用戶端 IP 位址清單。每當駭客推播訊息給用戶端時,就會再次啟動竊取流程。
資訊竊取流程
資訊竊取程式主要瞄準以下瀏覽器:
- Microsoft Edge
- Google Chrome
- Opera / OperaGX
- Brave
資訊竊取程式會搜尋每一個瀏覽器存放在「User Data」資料夾當中的個人檔案,然後蒐集使用者目錄的路徑、個人檔案路徑、User Data 路徑,以及「\User Data\Last Version 」檔案的版本資訊。接著,它會從「\User Data\Local State 」擷取加密後的金鑰 (用來解開 Chrome 的 cookie 和密碼) 並將它解密。最後,它會終止瀏覽器的處理程序。
針對每一個可蒐集到的個人檔案,資訊竊取程式會從「<profile>\Network\Cookies」 蒐集所有已儲存的 cookie。接著,檢查一個名為「xs 」的 Facebook cookie 是否存在。這個 cookie 是一個連線階段 ID,代表使用者已登入這個 Facebook 個人檔案。如果 cookie 存在,那就跳過該個人檔案。
接著,它會擷取所有屬於 Facebook、Google 和 Outlook (live.com) 的 cookie,並使用先前從「\User Data\Local State」取得的金鑰將它們全部解開。此外,還會從「<profile path>\Login Data」擷取所有已儲存的登入憑證資料庫。
不只如此,資訊竊取程式還會解開所有 Facebook、Google 和 Outlook 的登入資訊 (使用者名稱、電子郵件和密碼),同樣也是使用「\User Data\Local State」中的金鑰。
接下來,它會檢查 MetaMask 擴充功能是否存在於「 <profile path>\Local Extension Settings\」當中,然後將整個 MetaMask 擴充功能的目錄壓縮成一個 zip 檔案,經由 Telegram 機器人外傳。
它會取得 Facebook 的「c_user 」這個 cookie 以及其他的瀏覽器相關資訊,例如:作業系統、版本、架構。此外,也會試圖竊取 Facebook 的存取金鑰 (access token)。如果不成功,就將 Facebook 的 cookie、瀏覽器名稱、執行檔路徑、儲存的登入資訊、IP 位址以及國碼等資訊外傳。然後略過這個個人檔案,繼續讀取下一個個人檔案。
接下來,它會依序將下列資料透過 GET 請求外傳到 C&C 伺服器:
- Facebook 識別碼、使用者全名、電子郵件地址、生日、存取金鑰、Facebook cookie、瀏覽器名稱、執行檔路徑、已儲存的登入資訊、IP 位址、國碼。
- Gmail 登入憑證與 cookie。
- Outlook 登入憑證與 cookie。
- 其他 Facebook 資訊,如:電子郵件地址與定位資訊。
- 商業帳號資訊,例如使用者名稱和識別碼 (ID)。針對每一個商業帳號,它會竊取其名稱、廣告帳號上限、建立時間、商業識別碼 (ID)、允許的角色、驗證狀態,以及與其相關聯的商業使用者數量。
- 頁面資訊,包括使用者名稱和頁面存取金鑰。
- 廣告帳號資訊,包含使用者名稱。針對每個廣告帳號,資訊竊取程式會擷取廣告帳號識別碼、廣告帳號代理商、花費上限、延展信用 (發票及收費頻繁度)、貨幣對美元的匯率、時區、下次付費日期、建立時間、付費門檻、帳戶餘額、付款卡、付款卡有效期限、付款卡驗證狀態、廣告帳號分析資訊、帳號狀態。
先前擷取的資訊也會儲存至一個文字檔案並發送到 Telegram 機器人,這很可能是為了備份。
外傳到 C&C 伺服器
惡意程式偷到的資料是透過 GET 請求的方式外傳至 C&C 伺服器的一個隨機產生的路徑 (<server>/image/<random 26-character ID>.png)。外傳的內容是放在Authorization 標頭中傳遞。
Authorization 標頭中的內容會經過加密並使用十六進位編碼。駭客原本可能打算使用一個很簡單的助記詞來執行加密,如以下程式碼所示。
不過在程式中,其加密和解密方式卻不當或不合邏輯地使用 map/reduce 函式來實作。這表示,所有助記詞中的字元會經過 XOR 運算,結果變成了一個單一位元組的加密金鑰。
反制分析功能
為了讓資安研究人員更難分析,惡意程式會使用 node-hide-console-window 套件中的 hideConsole 指令將其命令列視窗隱藏起來。
駭客背景
趨勢科技在程式碼當中注意到有幾個使用越南文的備註、狀態訊息和變數名稱,顯示惡意程式的作者很可能懂越南文。
四步驟降低惡意廣告風險
資訊竊取程式 (例如本文分析的案例) 所竊取的資訊量通常相當驚人,這意味著使用者需格外小心提防,因為這類惡意程式通常會導致重大的資訊外洩,也可能造成日後遭到進一步的攻擊。如同往常一樣,隨時保持警戒並養成良好的資安習慣,有助於大幅提升個人的線上安全。
以下是使用者可採取的一些步驟來降低惡意程式經由惡意廣告散布的風險:
- 避免點選廣告,尤其是看起來可疑或者內容太過好康的廣告。
- 小心彈出式廣告或要求提供個人資訊的廣告,除非您確認您使用的應用程式或造訪的網站真實性絕對沒問題,否則切勿提供機敏資訊。
- 投資一套信譽良好的防毒或惡意程式防護技術,這類工具有助於偵測及防範經由廣告散布的惡意軟體以避免其危害。
- 學會如何分辨惡意廣告最常見的一些跡象,如:錯字、句法有問題,還有就是太過好康的內容。
- 當下載軟體或點選軟體的宣傳廣告時,請確認它們來自信譽良好的來源。務必只從官方應用程式商店或信賴的網站下載工具和應用程式。
入侵指標 (IoC)
如需本文中提到的入侵指標,請參閱此處。