受影響平台:Microsoft Windows
受影響群體:Microsoft Windows
影響範圍:收集受害電腦的資訊
嚴重等級:高風險
2025 年 1 月,FortiGuard Labs觀察到針對台灣使用者的攻擊事件,攻擊者偽裝成台灣國稅局,透過電子郵件傳播名為winos 4.0的惡意程式。在我們持續監控之下,我們發現更多與此活動相關的惡意程式樣本。在新的樣本中,有封於 2025 年 3 月發送的釣魚郵件,其附件檔案包含與另一次攻擊活動相關的連結。
圖1: 釣魚郵件中的HTML檔案
第一個連結屬於twszz[.]xin網域,該網域利用與針對台灣使用者之活動相似的命名模式。第二個連結指向關於稅務檢查的圖片檔,HTML檔案名稱宣稱其包含帳戶對帳單的詳細資訊。
這個連結讓我們得以追蹤攻擊活動並進一步找出其他惡意程式樣本,以及更多遠端連結。圖2是簡化後的威脅情資圖。左側的檔案是 2024 年 6 月攻擊活動中所使用的XLS檔,右側則是圖1提到的釣魚郵件。
圖2: 威脅情資圖
在過去幾個月,該駭客集團同樣藉由釣魚郵件來散布惡意程式並攻擊台灣使用者。該惡意程式修改自HoldingHands RAT(又稱Gh0stBins),包含多個檔案並以ZIP壓縮檔的形式夾帶在釣魚郵件中。
圖3: 攻擊鏈
釣魚郵件
此次攻擊中寄件者通常會偽裝成政府或商業夥伴。郵件以稅金、退休金、發票等內容誘導收件人開啟附件。有時候郵件內容可能是一張帶有超連結的圖片,要求收件人點擊,進而無意中下載惡意程式。
圖4: 釣魚郵件內嵌有超連結的圖片案例
附件中的PDF檔藉由與釣魚郵件相關的內容來誘騙收件人點擊連結。在較新的攻擊鏈中,該連結導向一個下載頁面。
圖5: 釣魚郵件
圖6: 圖3中郵件的附件PDF檔案
該下載頁面比PDF檔案和郵件簡潔許多,內容只包含文字說明和下載鈕。在某些攻擊鏈中,惡意程式受密碼保護,而密碼則位於下載頁面上。這可以有效防止從非下載頁面取得ZIP檔的分析人員進行分析。
圖7: 包含密碼的下載頁面
ZIP檔案
駭客在攻擊過程中使用相當多檔案,包括合法可執行檔與其所需的DLL、加密的shellcode,以及shellcode加載器。在使用者點擊合法可執行檔之後,shellcode加載器將以側載方式啟動,解密並執行加密的shellcode。
圖8: ZIP中的檔案執行流程
圖8為ZIP檔中的檔案和執行流程範例。「條例檔案」是用來加載dokan2.dll的合法可執行檔。除了主要執行流程所用到的檔案之外,其他還有加密過後的shellcode(支援持久性)及空白檔案(提供其特殊的檔案名稱)。從不同PDF檔和網頁下載的ZIP檔可能擁有不同的資料夾結構和檔案,但其執行流程皆與圖8相似。有時,ZIP檔僅包含一個可執行檔,再由該執行檔產生相當於圖8中用到的檔案,並依相似方式執行。根據可執行檔案的映像偵錯目錄,該惡意程式修改自HoldingHands遠端存取木馬。
圖 9: 其他攻擊鏈中的可執行檔案的映像偵錯目錄
在過去的兩個月,我們收集到的ZIP檔中,其解壓縮密碼以純文字文件的形式儲存在ZIP檔,一樣增加了偵測的困難。
圖10: 密碼保護的ZIP檔案
Dokan2.dll
Dokan2.dll用於建立一個執行緒來解密dxpi.txt中的資料並執行。首先,它會呼叫ShowWindow函式來隱藏可執行檔案的視窗,以便進行側載。接著,藉由比較ZIP檔中的檔案名稱長度,來搜尋kernel32.dll和DwhsOqnbdrr.dll。
DwhsOqnbdrr.dll是一個空白檔案,藉由將檔案名稱「DwhsOqnbdrr」中的每個字母向後移動一個字母,獲得ExitProcess,並利用先前找到的kernel32.dll加載該函式。它會將匯入表中的ExitProcess函式位址替換為一個會呼叫WaitForSingleObject的函式位址,該函式會等待解密dxpi.txt執行緒所發出的訊號。當執行緒完成時,它會呼叫剛剛加載的ExitProcess。
在該執行緒中,如果沒有足夠的權限,它會以系統管理員身分執行「條例檔案」。接著,搜尋collalautriv.xml並轉換檔案名稱以取得解密所需要的API「VirtualAlloc」。
dxpi.txt
dxpi.txt負責執行下一階段的初始設定,包括反虛擬機、權限提升和進行安裝。
- 反虛擬機
此函式會檢查實際安裝的RAM,因為許多沙箱和虛擬機都會被指派較少的記憶體,以降低系統負擔。如果實際安裝的RAM容量少於8GB,會立即結束程式。
- 權限提升
首先啟用SeDebugPrivilege權限,以繞過WinLogon的存取限制。接著呼叫 ImpersonateLoggedOnUser來模仿WinLogon的使用者(SYSTEM)。最後冒充為TrustedInstaller服務的執行緒以取得最高權限。
- 安裝
建立一個登錄機碼作為感染標記:
子機碼: SOFTWARE\MsUpTas
名稱: State 值: 1 |
另外會將從ZIP檔中的其他檔案解壓縮到C:\Program Files (x86)\WindowsPowerShell\Update中。
Original filename | After Filename of dropped file | Description |
bkproc.dll | TaskServer.exe | The same file as the條例檔案. |
code.dll | code.bin | It’s copied as System32\msvchost.dat. |
Db.dll | msgDb.dat | The malicious payload. Shellcode based on HoldingHands. |
Doport.dll | dokan2.dll | Shellcode loader for msgDb.dat. |
EGLProtect.dll | libEGL.dll | The legitimate DLL file for條例檔案. |
fig32.dll | config32.bin | Unused. It renames the legitimate version.dll as confVersion.dll and writes the decrypted data of config32.bin to SysWOW64\version.dll if it’s used. |
fig64.dll | config64.bin | It renames the legitimate TimeBrokerClient.dll as BrokerClientCallback.dll and writes the decrypted data of config64.bin to TimeBrokerClient.dll. |
simg32.dll | simg64.dll | Binary file that is used by msvchost.dat. |
此外,如果環境中存在BrokerClientCallback.dll和Blend.dll,表示電腦已遭受感染,程式將會立即終止。Blend.dll是遭msvchost.dat重新命名後的合法檔案msimg32.dll。安裝完成後,dxpi.txt會執行TaskServer.exe,該程式會透過側載加載dokan2.dll。dokan2.dll會解密並執行msgDb.dat中的shellcode,以進行下一階段的行動。
其他檔案
- dll→config64.dll→TimeBrokerClient.dll
TimeBrokerClient.dll原本是和TaskScheduler相關的合法DLL,由svchost.exe加載。
如果這個偽造的TimeBrokerClient.dll不是由svchost.exe載入,它會立即終止。在檢查完載入程式後,它會解密並執行msvchost.dat中的shellcode。
- dll→code.bin→msvchost.dat
由偽造的TimeBrokerClient.dll執行此shellcode。當命令行為 C:\windows\system32\svchost.exe -k netsvcs -p -s Schedule且avp.exe(Kaspersky)未執行時,它才會繼續執行。檢查完命令行後,它會使用與dxpi.txt相同的方法提升權限,然後將C:\Program Files (x86)\WindowsPowerShell\Update中的檔案複製到C:\Windows\System32:
Original Filename | Filename of dropped file | Description |
msgDb.dat | system.dat, mymsc.nls | The malicious payload. |
dokan2.dll | dokan2.dll | Shellcode loader for msgDb.dat. |
libEGL.dll | libEGL.dll | The legitimate DLL file for條例檔案. |
TaskServer.exe | taskyhost.exe | The same file as the條例檔案. |
simg64.dll | msimg32.dll | Shellcode loader for system.dat. |
- dll→simg64.dll→msimg32.dll
原本的msimg32.dll與Microsoft Graphical Device有關的合法DLL檔,在許多應用程式(包括LINE和WeChat)中皆有用到。如果載入這個偽造的msimg32.dll的程式不是LINE.exe或WeChat.exe,它會立即終止。如果TaskServer.exe正在執行,它也會進入睡眠狀態。檢查完成後,它會解密並執行system.dat(惡意酬載)中的shellcode。
- dll→config32.bin→SysWOW64\version.dll (if used)
原本的version.dll是和版本資訊相關的合法DLL檔,許多應用程式皆有用到。此攻擊鏈中未使用偽造的version.dll,且其程式碼並不完整。透過將其程式碼與其他攻擊鏈中找到的version.dll進行比較,我們推測它的功能與msimg32.dll類似,是惡意酬載的shellcode加載器。
msgDb.dat
MsgDb.dat負責與C2進行通訊,擁有設定登錄機碼、收集資料和下載模組等功能。它還會傳送heartbeat封包以確保通訊處於連線狀態。
以下是不含標頭的封包資料結構。msgDb.dat和C2伺服器的封包皆遵循此結構。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
0 | Magic | Data size | Unused | Command | ||||||||||||
1 | Payload(optional) | |||||||||||||||
⁞ | ⁞ |
Magic: 0xDEADBEEF
Data size: 指令和酬載大小
最初向外發送的封包沒有酬載,裡面只包含KNEL指令以表示該封包來自於核心模組。作為回應,C2伺服器會發送資料收集請求。在發送使用者資訊後,msgDb.dat會發送heartbeat封包並等待進一步的指令。
- Heartbeat
指令: 0x12, 0x13, 0x14
msgDb.dat每三分鐘發送一次heartbeat封包,而C2伺服器則以0x12回應。此外,msgDb.dat在電腦閒置30秒後發送包含0x13的封包,並在使用者恢復活動時發送包含0x14的封包。
- Data Collection
指令:0x00、0x01
酬載:傳輸使用者資訊,包括IP位址、電腦名稱、使用者名稱、作業系統、架構、安裝時間、CPU、處理器數量、實體記憶體、由其他指令所設定的登錄值,以及向C2伺服器傳送ping的間隔時間。
此項目的回應指令為0x00。為了取得安裝日期,它會讀取SOFTWARE\HHClient登錄機碼中的InstallDate。如果C2伺服器是第一次查詢此資訊,它會將目前時間寫入該值。其他由指令設定的值還有 SOFTWARE\HHClient登錄機碼中的Comment和Group。如果尚未設定 Comment,它會以default取代。
圖11: 包含受害者資訊的封包
- Edit Comment
指令:0x04、0x5
酬載:Comment
將來自伺服器的資料寫入SOFTWARE\HHClient登錄機碼中的Comment。並回傳0x05給C2伺服器。
- Edit Group
指令:0x06
Payload:Group
將來自C2伺服器的資料寫入SOFTWARE\HHClient登錄機碼中的Group,並回傳0x07。
- Module Info
指令:0x0A、0x0B
酬載:模組大小以及名稱
包含要執行的模組名稱和大小。若目前的模組不是伺服器指定的模組,msgDb.dat會發送來自伺服器的資訊和指令0x0B,向C2伺服器請求更進一步的模組資料。
- Add module
指令:0x0B、0x0C
酬載:模組大小、封包內的檔案長度以及模組資料
圖12: 伺服器回傳的封包
當所有資料下載完成之後,msgDb.dat會馬上執行該模組。否則,它會發送0x0B以要求更多資料。
在分析過程中,我們從C2伺服器收集到三個模組,包括兩個遠端桌面模組和一個檔案管理模組。msgDb.dat會呼叫模組中唯一的匯出函式ModuleEntry,以進行下一階段攻擊。以下是封包中代表各模組的命令:
Module name | Command | Description |
rd | RDTP | Remote desktop |
rd_dxgi | RDTP | Remote desktop |
filemgr | FMGR | File manager |
而封包結構也和msgDb.dat傳送的一樣。
圖 13: C2伺服器與filemgr模組的通訊
這些模組的映像偵錯目錄顯示它們也屬於 HoldingHands RAT。從映像偵錯目錄中的「jingjianban」(精簡版)可以看出有些模組似乎是簡化的版本。
Figure 14: The image debug directory of the rd module.
- Run Module
指令:0x09、0x11
酬載:模組名稱和函式名稱
此指令要求msgDb.dat執行酬載中指定的模組。如果找不到該模組,msgDb.dat會連同模組名稱以及指令0x09發送給C2伺服器以要求模組資訊。
- Exit
指令:0x15
結束程式執行。
其他攻擊鏈
除了我們在 2025 年 2 月所揭露的winos,以及本文討論的HoldingHands,此駭客集團經常使用Gh0stCringe。圖5到圖7包含此攻擊鏈中檔案的螢幕擷圖。
圖15: Gh0stCringe攻擊鏈
結論
我們在此分析中揭露了許多與 2025 年 1 月針對台灣相關攻擊的惡意軟體樣本。該攻擊鏈包含大量shellcode和載入器,使得攻擊流程更加複雜,而最終目的是執行惡意酬載,與C2伺服器建立連線並接收進一步指令。從winos、HoldingHands到Gh0stCringe,這個駭客集團不斷演變其惡意軟體和散播策略。FortiGuard Labs將繼續監控這些攻擊活動,並提供對應的防護。
IOCs
IP
154[.]91[.]85[.]204
154[.]86[.]22[.]47
156[.]251[.]17[.]17
206[.]238[.]179[.]173
206[.]238[.]220[.]60
206[.]238[.]199[.]22
154[.]91[.]85[.]201
206[.]238[.]221[.]182
206[.]238[.]196[.]32
154[.]91[.]64[.]45
206[.]238[.]115[.]207
156[.]251[.]17[.]12
107[.]149[.]253[.]183
網域
00-1321729461[.]cos[.]ap-guangzhou[.]myqcloud[.]com
6-1321729461[.]cos[.]ap-guangzhou[.]myqcloud[.]com
twzfte-1340224852[.]cos[.]ap-guangzhou[.]myqcloud[.]com
cq1tw[.]top
twcz[.]pro
twczb[.]com
twnc[.]ink
twnic[.]icu
twnic[.]ink
twnic[.]ltd
twnic[.]xin
twsa[.]top
twsw[.]cc
twsw[.]club
twsw[.]info
twsw[.]ink
twsw[.]ltd
twsw[.]pro
twsww[.]vip
twsww[.]xin
twswz[.]top
twswzz[.]xin
twtgtw[.]net
twzfw[.]vip
釣魚郵件
6558dfb070421c674b377a0a6090593fa0c44d5b0dec5325a648583f92175ce2
d3a270d782e62574983b28bd35076b569a0b65236e7f841a63b0558f2e3a231c
a8430ce490d5c5fab1521f3297e2d277ee7e7c49e7357c208878f7fd5f763931
7d3f352ded285118e916336da6e6182778a54dc88d4fb7353136f028ac9b81e0
143f434e3a2cac478fb672b77d6c04cdf25287d234a52ee157f4f1a2b06f8022
c25e80cd10e7741b5f3e0b246822e0af5237026d5227842f6cf4907daa039848
7263550339c2a35f356bb874fb3a619b76f2d602064beada75049e7c2927a6dc
a8b6c06daeede6199e69f4cafd79299219def5bf913a31829dede98a8ad2aaa9
6fcd6aef0678d3c6d5f8c2cb660356b25f68c73e7ee24fbb721216a547d17ffa
ed72721837c991621639b4e86ffe0c2693ef1a545741b5513d204a1e3e008d8c
65edd9e1a38fd3da79c8a556eb2c7c595125ffec9f7483e2e6e189a08cc5d412
0a0375648bc9368bccfd3d657d26976d5b1f975381d1858d001404d807334058
e809582faccdd27337aa46b4a11dd11f5d0c7d7428ebdc8c895ea80777e4da5f
59d2433264d8ec9e9797918be3aa7132dbeb71e141f6e5c64c0d6f1cb4452934
ZIP
ac957ba4796f06c4bf0c0afb8674bbeb30eb95cef85bc68ced3ee1aa30e3acff
9296adb71bc98140a59b19f68476d45dbb38cc60b9e263d07d14e7178f195989
636c2ccffce7d4591b0d5708469070b839f221400b38189c734004641929ae05
31ffa4e3638c9e094275051629cc3ac0a8c7d6ae8415bbfcacc4c605c7f0df39
da3deea591b59b1a0f7e11db2f729a263439a05f3e8b0de97bbac99154297cea
Executable
e2269b38655a4d75078362856c16594e195cd647c56b8c55883b8e1286baa658
52632d9e24f42c4651cf8db3abc37845e693818d64ab0b11c235eddf8e011b2f
7200155f3e30dbbd4c4c26ce2c7bd4878ab992b619d80b43c0bd9e17390082fc
e516b102a2a6001eafb055e42feb9000691e2353c7e87e34ddaa99d7d8af16fd
a9ddd4e4d54336ce110fdc769ff7c4940f8d89b45ee8dc24f56fc3ea00c18873
a12d17cca038cdbf79b72356e5d20b17722c7b20bd2ee308601bac901890f3f4
b1ac2178c90c8eafd8121d21acbae7a0eb0cbc156d4a5f692f44b28856a23481
a6c1629b4450f713b02d24f088c4f26b0416c6a7924dcf0477425f3a67a2e3ff
3ce81c163ddedb132116cdf92aae197ced0b94f3fc3d1036f5c41b084a256a03
a19fdfc131e8fbe063289c83a3cdefb9fb9fb6f1f92c83b892d3519a381623db
db15f45f69f863510986fb2198a8a6b3d55d8ccc8a2ed4bb30bc27bdd1bf151c
bf1a7938f61a9905e1b151c7a5f925a2ce3870b7c3e80f6e0fc07715bdc258b7
f42c6949c6d8ecf648bacca08cde568f11ec2663221a97dae5fbf01218e8775a