重點摘要
- BoryptGrab 是一個新發現的資訊竊取程式,它會搜刮瀏覽器資料、虛擬加密貨幣錢包以及系統資訊。此外,還會擷取螢幕抓圖、蒐集常見檔案、擷取 Telegram 資訊、Discord 權杖 (token) 以及密碼。
- 惡意程式會經由大量的 Github 公開儲存庫散布,這些儲存庫宣稱提供免費的軟體工具,並使用搜尋引擎最佳化 (SEO) 關鍵字來吸引受害者。其感染程序會在使用者從假 GitHub 下載頁面下載 ZIP 檔案時啟動。
- 其攻擊行動各階段的惡意程式碼中含有俄羅斯文的註解和/或記錄檔訊息。攻擊行動相關的 IP 位址也位於俄羅斯,顯示駭客可能來自俄羅斯。除此之外,惡意程式在攻擊行動中也出現多個不同的組建 (build) 版本。
- TunnesshClient 是攻擊過程中散布的一個新的後門程式,這是一個 PyInstaller 執行檔,可建立反向 SSH 通道來與駭客通訊,並扮演 SOCKS5 代理器 (proxy) 的角色。這起攻擊還會散播現行 Vidar 竊取程式的變種並使用了加密編碼。
簡介
我們最近發現了一個新的資訊竊取程式二進位檔案,它會蒐集瀏覽器與虛擬加密貨幣錢包資料、系統資訊,以及常見的檔案等等。我們將這個新的資訊竊取程式命名為「BoryptGrab」,它的某些變種會下載一個我們稱之為「TunnesshClient」的 PyInstaller 後門程式,TunnesshClient 會建立一個反向的 Secure Shell (SSH) 通道來與駭客通訊。
在追蹤其感染過程時,我們在網路上看到幾個 ZIP 壓縮檔 (全都使用類似的命名方式) 偽裝成常見的軟體工具 (包括遊戲作弊工具)。由於 ZIP 檔案的名稱中有些含有「github-io」字樣,如果依此搜尋類似的軟體工具的話,可找到超過 100 個公開的 Github 儲存庫在散播這個惡意程式。我們發現的 ZIP 檔案最早可追溯至 2025 年底,但當初提交 (commit) 程式碼至最早一個 GitHub 儲存庫的帳號則是在 2025 年 4 月建立。
以下列出幾個 ZIP 檔案名稱中不含「github-io」字樣的範例:
- valorant performance boost fps booster 5.4.9.zip
- voicemod pro download tool 8.2.1 1 .zip
- wondershare info feel 8.4.3.zip
- sk1nchangerforcs24pc 5.8.0.zip
- cod black ops 6 aimbot with esp tool 4.2.4.zip
- abi free esp tool download 9.0.0.zip
- arenabreakoutcheat 8.6.2.zip
- git deployer app 7.7.2.zip
- valorant skin tool 4.1.3.zip
- filmora watermark remover 8.6.7.zip
- sk1nchangerforcs24pc 2.9.5.zip
- r6siege free esp tool 1.8.9.zip
然後,以下是檔名中含有「github-io」字樣的 ZIP 檔案範例:
- vmware-download-github-io-4.83.4.zip
- passathook-cs2-github-io-1.96.4.zip
- meta-skins-github-io-6.98.9.zip
- cs2-skin-changer-premium-github-io-1.88.9.zip
- passathook-cs2-github-io-2.56.2.zip
以下各節,我們將詳細分析 BoryptGrab 竊取程式、TunnesshClient 後門程式,以及攻擊行動中觀察到的其他惡意程式。同時,我們也將深入分析惡意程式的攻擊過程與散布途徑。在攻擊過程不同階段所發現的俄羅斯文註解、記錄檔訊息以及 IP 位址,全都顯示駭客可能擁有俄羅斯背景。
攻擊過程示意圖
初期散布
惡意程式一開始是經由 Github 公開儲存庫散布,假裝提供免費、看似正常的軟體工具。其中某些儲存庫的 README 檔案還含有 SEO 關鍵字,用來提升它們在搜尋結果中的排名。例如,一個位於 hxxps://github[.]com/Voicemod-Pro-Download-Tool 的儲存庫,提供的是假的 Voicemod Pro 工具。這個儲存庫在 Google 搜尋結果中的排名就在正版軟體之下。
假的 Voicemod Pro Github 儲存庫 README 內含有下載網址連至 hxxps://voicemod-pro-download-tool.github[.]io/.github/ 頁面。此下載頁面的原始程式碼位於 hxxps://github[.]com/Voicemod-Pro-Download-Tool/.github,並偽裝成一個正常的 .github 目錄。
其 index.htm 網頁含有俄羅斯文的註解,並且會重新導向至 home.html 網頁。home.html 網頁會從原始程式碼中取得一個寫死的連結 (也就是當前樣本中的 hxxps://kiamatka[.]com/kaiok.kakman),並解開其 base64 編碼的網址,然後重新導向到解碼後的網址。
最後,這個中間網址會重導至 hxxps://best-tinted[.]com/github-download.html 網頁,並下載一個 ZIP 檔案來散布惡意程式。
儘管原始程式碼中寫死的連結與擷取到的中間網址會隨我們發現的 GitHub 儲存庫而異,但這起攻擊行動中發現的其他 GitHub 儲存庫也出現了類似的俄羅斯文註解與網址擷取邏輯。這些儲存庫當中也有很多是假冒各種不同工具,將使用者帶到會下載惡意 ZIP 檔案的網站。在 GitHub 中的某變種 (如 hxxps://github[.]com/PassFab-4WinKey-Windows-Password-Reset),其 index.html 檔案會發送追蹤資訊給駭客。
有些 GitHub 儲存庫 (如 hxxps://github[.]com/Yim-Mod-Menu/.github) 的提交歷史記錄會顯示有一個 script.js 檔案被刪除了。被刪除的檔案會從某個中間連結擷取出一個網址,然後重新導向到擷取出來的網址。
在其他 GitHub 儲存庫中,scripts.js 檔案是用來擷取、AES 解密、重新導向至某個網址 (如 hxxps://github[.]com/Arena-Breakout-Infinite-ESP/.github)。scripts.js 檔案會使用 Base64 編碼的連結來擷取出加密過的網址。
此外,還有幾個 GitHub 儲存庫中的變種 (如 hxxps://github[.]com/Graphic-Editor-Krita/.github),其最近幾次提交的程式碼還新增了 Python 腳本來模擬下載程序。
如需這起攻擊行動中發現的 GitHub 儲存庫清單,請參閱文末的「入侵指標」一節。
下載途徑 1:DLL 側載與加密的啟動器惡意檔案
在攻擊行動散布的 ZIP 檔案變種中,有些包含了一個執行檔,用來側載一個名為 libcurl.dll 的函式庫 (SHA256: fa767391b99865f8533efc1fe6dfa6175215718679fb00ca85fc13c3bd4ae4b7)。
libcurl.dll 函式庫 (SHA256: fa767391b99865f8533efc1fe6dfa6175215718679fb00ca85fc13c3bd4ae4b7) 會從其資源區段載入一個惡意檔案 (SHA256: d295720bc0c1111ce1c3d8b1bc1b36ba840f103b3ca7e95a5a8bf03e2cc44fe5)。接著,它會使用 XOR 運算與 AES 演算法的 CBC 模式從資源區段解開一個啟動器惡意檔案。
libcurl.dll 檔案會執行解開的啟動器惡意檔案所匯出的 EntryWrapper 函式。
解開後的啟動器惡意檔案會使用 XOR 運算來解開加密編碼的網址,然後下載 BoryptGrab 資訊竊取程式 (:5466/api/chromelevator)。
某些啟動器惡意檔案變種含有組建名稱 (名稱不盡相同)。啟動器惡意檔案會在執行它下載的 BoryptGrab 資訊竊取程式時,將組建名稱當成「-b」參數傳入程式當中。舉例來說,下圖所示的組建名稱是「Shrek」。
啟動器變種會發送一些請求 (內含寫死的組建名稱) 來下載其他檔案 (:5466/api/custom_exe?build={BUILD_NAME})。這些檔案是 Vidar 資訊竊取程式的變種 (如後面章節所述)。
我們在網路上已觀察到「/api/custom_exe?build={BUILD_NAME}」這個請求在下載 Vidar 變種時所用的幾個組建名稱:
- CryptoByte
- Kassay
- Leon
- NeoWho
- Shrek
- Sonic
- Yaropolk
- Yarostnick
除此之外,啟動器惡意檔案還會從駭客的伺服器 (:5466/api/client) 下載一個 Pyinstaller 執行檔,我們將它命名為「TunnesshClient」。啟動器惡意檔案會設定排程工作,使用 %TEMP%\client_task_system.xml 和 %TEMP%\client_task_user.xml 兩個 .xml 檔案來執行被下載的 TunnesshClient。
此外,啟動器惡意檔案還會從「:5466/api/lodik」下載一個執行檔,這是一個以 Golang 撰寫的二進位檔案 (我們命名為「HeaconLoad」),它會進一步下載並執行另一個執行檔。
下載途徑 2:下載啟動器 EXE 的 VBS 腳本
有些 ZIP 檔案變種含有一個 VBS 下載器,用來進一步散布其他惡意程式。我們使用其中一個 VBS 下載器腳本 (SHA256: 1bd605ef84b6767df74bd6290f1468eed5a88264df23fcf70b6a75d5bdcf7d76) 來做示範,它含有一些未用到的變數,作為混淆用的垃圾程式碼。
VBS 腳本使用整數陣列來代表字串,它內含一個函式「A」可將整數陣列轉換成對應的字串。此外,腳本還包含了一個名為「EnsureElevatedPrivileges」的函式用來提升權限。
從整數陣列轉換出來的字串都是經過編碼的 PowerShell 惡意檔案。VBS 腳本最終解碼出來的指令會從 hxxps://botshield[.]vu/kFcjld 下載一個二進位執行檔並用 Base64 方式加以解碼。
此外,VBS 腳本最終解碼後的指令還能設定 Microsoft Defender 的排除路徑來防止 Defender 對 C:\ 磁碟執行防毒掃描。
VBS 腳本所下載及解碼的檔案是一個 C/C++ 啟動器二進位檔案,它會發送一個 HTTP 請求 (/api/{BUILD_NAME}) 來進一步下載 BoryptGrab 資訊竊取程式。下圖顯示 C/C++ 啟動器變種 (SHA256:15de71073f44c657c23f5f97caa11f1b12e654d4d17684bfc628cc1e5b6bcdd5) 所發送的 HTTP 請求,它使用的組建名稱為「CryptoByte」。不同的啟動器變種使用的組建名稱不盡相同,這些組建名稱會對應 BoryptGrab 樣本中寫死的組建名稱,如後面章節所述。
此攻擊過程中下載的 BoryptGrab 變種 (SHA256: 4e90d386c1c7d3d1fd4176975795a2f432d95685690778e09313b4a1dbab9997) 有能力自己下載 TunnesshClient 而不須靠啟動器二進位檔案幫它下載。
其他下載途徑
還有一些變種會使用一個 .NET 執行檔 (SHA256: 4264a88035aa0b63e9aef96daa78a58114d60a344ea10168a8ef5ef36bf8edbd) 來解碼並執行一個 Base64 編碼的 VBS 下載器 (SHA256: 433a13cc70396f80dc29d1150c050339d78964fdc91bcdc3f40c67a77add1476)。在我們分析到的樣本當中,這些 VBS 下載器會從「hxxps://botshield[.]vu/KKRkm9」下載並執行一個二進位執行檔。
有些啟動器的變種 (SHA256: 7f2315b89fb9a47e1516def136844d617bfcdce19000a1b0436706692dbe166c) 能視其權限而定,從「:5466/api/app」或「:5466/api/app.zip」下載檔案。還有另一個啟動器變種 (SHA256: 449f528f5ceae8c3f8336d0d8e3e3ec9031d1ad67c31ee7311b67e01d5fdf225) 會從「:5466/api/payload」下載惡意檔案。我們分析到的第三個變種 (SHA256: c40b9913e79c5dd09751b1afb03aaa98658bab61bacf27a299abd84fd44fe707) 也可以從「:5466/api/client2」下載 TunnesshClient。
另外,有些 ZIP 檔案變種直接內含 HeaconLoad 下載器來散布惡意程式。
HeaconLoad:Golang 下載器
HeaconLoad 樣本 (SHA256: 2abe0ef88ba92db79d82cde4c0ed1f382bb347517a54ea82084c841d0f955518) 會在系統登錄的 Run 機碼底下加入一個項目並建立排程工作來常駐在系統內。
HeaconLoad 會經由 HTTP POST 請求發送信標訊息給駭客「:8088/healthcheck」。每則信標訊息都含有蒐集到的系統資訊,以及 HeaconLoad 樣本內的組建標籤值。
以下是我們在 HeaconLoad 變種中觀察到的不同組建標籤值:
- kylka
- leon
- shrek
- sonic
- voblya
- yaropolk
- yarostnick
- yasno
HeaconLoad 接著會檢查駭客回應 HTTP POST 請求時的「bundle_available」和「bundle_hash」欄位。這兩個欄位分別指出某個套件是否可供下載,以及套件的雜湊值 (供下載後驗證用)。
當套件可下載時,HeaconLoad 就會從駭客的伺服器下載並解壓縮套件。它會執行解壓縮後的第一個執行檔。
我們在 HeaconLoad 樣本當中看到了俄羅斯文的記錄檔訊息。
客製化組建執行檔:Vidar 變種與程式碼加密編碼
從「/api/custom_exe?build={BUILD_NAME}」下載的二進位執行檔是現行 Vidar 資訊竊取程式的變種,具備程式碼加密編碼能力。
樣本 (SHA256: 2050468744e44554fac17fb83f1515c95f2f2236716e2b5267a81c2b94205e6a) 具備一個可發送 HTTP POST 請求的功能,其流量特徵與 Vidar 資訊竊取程式相同。它使用 XOR 加密的字串,並含有不透明的前置詞,再加上多餘的程式碼來作為混淆。
此外,Vidar 變種還會動態解析其用於加密編碼的 API,也會使用程式碼注入或 APC 注入技巧。
BoryptGrab:C/C++ 資訊竊取程式
BoryptGrab 可接受一個選擇性的「--output-path」或「-o」參數來指定輸出目錄,以便儲存其蒐集到資料。 視其組建而定,某些 BoryptGrab 變種 (SHA256: fe4e5fb28d2c2b3a640112b6b125ce8c4afa8be28342e3bfda097ad9dd2ef9ee) 也可接受一個選擇性的「--build-name」或「-b」指令列參數作為輸入。當 BoryptGrab 將使用者資訊輸出到 UserInformation.txt 檔案時,此輸入參數會當成「BUILD NAME」欄位的值。若沒有提供「--build-name」參數,那麼 BoryptGrab 變種會使用預設的「No_name」作為組建名稱。
此外,某些 BoryptGrab 變種會使用寫死的數值作為 UserInformation.txt 中的「BUILD NAME」欄位值,而非讀取「--build-name」或「-b」參數值。
請注意,還有一些 BoryptGrab 變種既不含寫死的「BUILD NAME」,也不會讀取「--build-name」或「-b」指令列參數值。同時也不會將「BUILD NAME」欄位寫入 UserInformation.txt 檔案中。
以下列出我們在網路上看到的 BoryptGrab 變種中寫死的一些組建名稱:
- CryptoByte
- Crypto_Byte
- Data
- Kassay
- Leon
- Pisechka
- Shrek
- Sonic
- Sonic2
- Sonic_new1
- Sonic_new2
- Yaropolk
- Yarostnick
- Yasno
- bigdick
- wm_detect
BoryptGrab 會查詢系統登錄項目並檢查虛擬機器相關的檔案來偵測自己是否正在虛擬化環境中執行。
BoryptGrab 還會將執行中的處理程序名稱與其預先定義的清單做比對,這是反制分析檢查的一環。此外,也會試圖利用更高的權限來執行。
當未指定「--output-path」或「-o」參數時,BoryptGrab 會使用當下的時間、對外 IP 位址以及國碼來組合出預設的輸出路徑名稱,接著使用此輸出路徑名稱來建立一個目錄,用來暫存蒐集到的資料。
BoryptGrab 會從許多瀏覽器蒐集資訊,它會使用 Chrome App Bound Encryption 技巧,並含有來自下列公開 GitHub 儲存庫的程式碼:
- https://github[.]com/00nx/Chrome-App-Bound-Encryption-Bypass
- https://github[.]com/xaitax/Chrome-App-Bound-Encryption-Decryption
以下是 BoryptGrab 會對其蒐集資訊的瀏覽器清單:
- Brave Browser
- CentBrowser
- Chromium
- Google Chrome
- Microsoft Edge
- Mozilla Firefox
- Opera
- Vivaldi
- Yandex Browser
BoryptGrab 使用的程式碼與 https://github[.]com/00nx/Chrome-App-Bound-Encryption-Bypass 中的「loadAndDecryptPayload」函式類似,同時也包含一個二進位檔案內含名為「PAYLOAD_DLL」的加密資源,如 GitHub 儲存庫所使用的。
BoryptGrab 的 PAYLOAD_DLL 資源解密之後可看到它含有來自公開 Github 儲存庫 Chrome-App-Bound-Encryption-Bypass 的邏輯。同時,BoryptGrab 解密後的資源還包含了從 Yandex 和 Firefox 瀏覽器蒐集資料的功能。
此外,解密後的 PAYLOAD_DLL 惡意檔案也包含了一些寫死的時間戳記資訊。它會將時間戳記以及已安裝的應用程式資訊寫入「installed_applications.txt」檔案。
為了協助蒐集瀏覽器資料,BoryptGrab 會從「hxxp://45.93.20[.]61:5466/api/x32_chromium」下載一個 Chromium 輔助程式 (SHA256: ed1745cc49b929e499966d87e163219fe0f24069fe88dfacbd69c0ebab85a640),並將它儲存到「%TEMP%\ x32_chromium.exe」。
除了瀏覽器資料之外,BoryptGrab 還可從桌上型電腦虛擬加密貨幣錢包應用程式和瀏覽器擴充功能蒐集資訊。BoryptGrab 接著會擷取螢幕抓圖,並蒐集系統資訊。
以下是 BoryptGrab 會蒐集的虛擬加密貨幣錢包:
- Armory Wallet
- Atomic
- AtomicDEX
- Binance
- Bitcoin Core
- BitPay
- Blockstream Green
- Chia Wallet
- Coinomi
- Copay
- Daedalus Mainnet
- Dash Core
- Dogecoin
- Electron Cash
- Electrum
- ElectrumLTC
- Ethereum
- Exodus
- GreenAddress
- Guarda
- Jaxx Desktop
- Komodo Wallet
- Ledger Live
- Ledger Wallet
- Litecoin Core
- MEW Desktop
- MultiDoge
- MyEtherWallet
- NOW Wallet
- Raven Core
- StakeCube
- Trezor Suite
- Wasabi Wallet
不僅如此,BoryptGrab 還具備「檔案擷取器」功能,可蒐集常見目錄下特定副檔名的檔案,但它將 Filegrabber 拼錯成 「Filegraber」。
最後,BoryptGrab 會蒐集 Telegram 的檔案和瀏覽器密碼,較新的 BoryptGrab 變種還可蒐集 Discord 的權杖 (token)。
資料蒐集好之後,BoryptGrab 會將蒐集到的資料壓縮上傳至駭客的伺服器。
有些 BoryptGrab 變種會從駭客的伺服器下載 TunnesshClient 來執行。不過,並非所有 BoryptGrab 變種都具備這項功能,而且在某些攻擊程序中,TunnesshClient 是由其他下載器所取得。
TunnesshClient:負責建立反向 SSH 通道的 PyInstaller 執行檔
TunnesshClient 是一個 PyInstaller 執行檔,負責流量轉發的工作,並透過反向 SSH 通道來執行駭客的指令。它的程式碼中含有俄羅斯文的註解以及記錄檔訊息,這可能意味著它來自俄羅斯。本文用來示範的 TunnesshClient 樣本 (SHA256: 576692df4bf1c7d8927d3a183f5219a81c3bff3dd22971691f8af6889f80c5a0) 會連上駭客位於「193.143.1[.]104」的伺服器。
TunnesshClient 會先發送 HTTP POST 請求 (/api/get_challenge、/api/get_credentials) 至「hxxp://193.143.1[.]104:5000」來取得 SSH 登入憑證。它會計算出一個 SHA256 雜湊碼來回應駭客的挑戰,接著收到加密的回應。接下來,它會將回應解密,取得 JSON 格式的 SSH 登入憑證。
接著 TunnesshClient 會將系統資訊發送到「/api/get_port」給駭客。它會從駭客的回應中擷取出一個連接埠號碼來作為流量轉發的遠端連接埠,然後使用先前取得的 SSH 登入憑證和流量轉發連接埠號碼來建立反向 SSH 通道,以便與駭客的伺服器通訊。
TunnesshClient 可執行駭客指定的指令,它會經由駭客的連線接收到一個整數值,代表指令要執行的操作類型。
下表列出 TunnesshClient 樣本支援的操作類型及其對應的指令:
| 操作類型 | 說明 |
|---|---|
| 5 | 擔任 SOCKS5 代理器 (proxy)。 |
| 83 | 執行指令列命令。 |
| 76 | 列出指定的檔案。 |
| 68 | 將受害者的檔案以 Base64 編碼傳送給駭客。 |
| 85 | 將來自駭客的 Base64 編碼檔案內容儲存到受害者的電腦。 |
| 70 | 使用指定的查詢來搜尋檔案。 |
| 90 | 將受害者的資料夾以 Base64 編碼的 ZIP 壓縮檔傳送給駭客。 |
表 1:TunnesshClient 樣本及其對應指令所支援的操作類型。
還有另一個 TunnesshClient 變種 (SHA256: 0434437a073a3f3a49e84d5ecb20c99dd551bacc32bf100fbb8cf67a50642181) 會在受害電腦上安裝一個本地端 SSH 伺服器。它會透過 HTTP POST 請求 (hxxp://45.93.20[.]195:5000) 將本地端 SSH 連線的使用者名稱和密碼傳送給駭客。
當操作類型為 83 時,這個 TunnesshClient 變種會將駭客的流量轉發至本地端 SSH 伺服器。此變種只接受類型 5 和類型 83 的操作,而且不像前一個變種那樣會執行駭客的指令。
| 操作類型 | 說明 |
|---|---|
| 5 | 擔任 SOCKS5 代理器 (proxy)。 |
| 83 或其他數值 | 轉發至本地端 SSH。 |
結論
BoryptGrab 攻擊行動呈現出一個不斷演進的威脅生態系,利用假的軟體下載檔案和假的 GitHub 儲存庫來攻擊使用者。這個資訊竊取程式的許多變種都展現出豐富的資料蒐集能力,能動態分階段下載惡意檔案,並藉由虛擬機器反制與除錯反制檢查來躲避分析,將敏感的作業交由加密的惡意檔案來執行,顯示駭客的技術精密度不斷在提升。
這起攻擊行動利用了 SEO 最佳化的 GitHub 儲存庫與假的「免費工具」下載網站,突顯出一項重要趨勢:駭客越來越常利用人們對合法開發人員平台與開放原始碼生態系的信任。數十個儲存庫、不斷變換的惡意檔案,以及網路上看到的眾多組建名稱,從規模就能看出這波攻擊行動是一個活躍而持續中的威脅。
採用 TrendAI Vision One™ 的主動式防護
TrendAI Vision One™ 是一套將資安曝險管理、資安營運以及強大的多層式防護集中在一起的業界領先 AI 驅動企業網路資安平台。
TrendAIVision One™ Threat Intelligence Hub
TrendAI Vision One™ Threat Intelligence Hub 威脅情資中心提供了有關新興威脅與駭客集團的最新洞見、TrendAI™ Research 的獨家戰略性報告,以及 TrendAI Vision One™ 平台的 TrendAI Vision One™ Threat Intelligence Feed 威脅情資來源。
新興威脅: 從假 GitHub 下載儲存庫到反向 SSH 後門程式:分析 BoryptGrab 資訊竊取程式
從假 GitHub 下載儲存庫到反向 SSH 後門程式:分析 BoryptGrab 資訊竊取程式
追蹤查詢
TrendAI Vision One™ 客戶可以使用 Search 應用程式來尋找或追蹤本文提到的惡意指標,看看是否也出現在自己的環境中。
偵測 BORYPTGRAB 樣本
malName: *BORYPTGRAB* AND eventName: MALWARE_DETECTION AND LogType: detection
除此之外,TrendAI Vision One™ 還可啟用 Threat Intelligence Hub 權利來取得更多追蹤查詢。
入侵指標 (IoC)
如需本文提到的入侵指標完整清單,請至此處。