NG0002, 중국 학계를 무기로 만든 기관 유인물로 겨냥
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
UNG0002로 추적된 위협 행위자가 중국 대학에 대한 스피어 피싱 캠페인을 수행하여 공식 피트니스 테스트 공지로 위장된 악성 ZIP 아카이브를 사용했습니다. 아카이브 내부에는 두 개의 확장자를 가진 LNK 파일이 있었고, 이는 VBScript를 실행하며, 이는 Bandizip을 사용하여 악성 DLL을 사이드로드했습니다. 해당 DLL은 분석을 방지하기 위한 검사를 수행하고, 메모리 내 SFX 페이로드를 복호화한 다음 궁극적으로 Cobalt Strike 비콘을 배포하여 명령 및 제어 활동을 수행했습니다. 이 작업은 내부 침투를 지원하기 위해 알리바바 클라우드에 호스팅된 인프라와 living-off-the-land 기법을 결합했습니다.
조사
Seqrite Labs는 피싱 이메일, 첨부 파일 및 전체 페이로드 체인을 조사하여 explorer.exe 가 VBS 스크립트를 실행하는 데 사용되었으며, Bandizip.exe 가 악성 DLL을 호스팅하는 데 악용되었습니다. 분석가들은 분석 환경을 회피하려는 광범위한 안티 디버깅 검사를 문서화하고, 초기 유인에서 최종 비콘 배포에 이르기까지의 전체 실행 흐름을 파악했습니다. 그들은 또한 이 캠페인과 관련된 인프라를 찾아냈으며, IP 주소 60.205.186.162 와 도메인 lysander.asia, 및 이전 UNG0002 활동과 연결된 활동도 밝혀냈습니다. 추가적인 강화 작업은 명령 및 제어 서버가 알리바바 클라우드에 호스팅되었고, Feishu 관련 MX 레코드를 사용했다는 것을 보여줘 중국 기반 위협 행위자로의 귀속을 더욱 뒷받침했습니다.
완화
지정되지 않음
응답
지정되지 않음
"graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef file fill:#e6e6e6 classDef process fill:#ffdd99 classDef malware fill:#ff9999 classDef network fill:#c2c2f0 %% Nodes u2013 Actions (Techniques) action_initial_access["<b>Action</b> – <b>T1566.001 Spearphishing Attachment</b><br/>Email with malicious ZIP is sent to the target"] class action_initial_access action action_user_execution["<b>Action</b> – <b>T1204.002 User Execution</b><br/>User opens the LNK file thinking it is a PDF"] class action_user_execution action action_masquerading["<b>Action</b> – <b>T1036 Masquerading</b><br/>LNK is doubleu2011extension and displayed as a PDF"] class action_masquerading action action_permission_hijack["<b>Action</b> – <b>T1574.005 Executable Installer File Permissions Weakness</b><br/>Explorer.exe is used to launch a hidden VBS script"] class action_permission_hijack action action_vbscript["<b>Action</b> – <b>T1059.005 Visual Basic</b><br/>VBS opens the decoy PDF and runs Bandizip"] class action_vbscript action action_lol["<b>Action</b> – <b>T1218 Living off the Land</b><br/>Bandizip, a legitimate archiver, is abused"] class action_lol action action_hidden_files["<b>Action</b> – <b>T1564.001 Hidden Files and Directories</b><br/>Payload placed in deep, macOSu2011style folders"] class action_hidden_files action action_dll_side_loading["<b>Action</b> – <b>T1574.008 Path Interception by Search Order Hijacking</b> / <b>T1574.002 DLL Sideu2011Loading</b><br/>Bandizip loads malicious ark.x64.dll"] class action_dll_side_loading action action_obfuscation["<b>Action</b> – <b>T1027 Obfuscated Files or Information</b><br/>DLL contains encrypted strings and encrypted SFX payload"] class action_obfuscation action action_anti_analysis["<b>Action</b> – <b>T1497 Virtualization/Sandbox Evasion</b> / <b>T1497.001 System Checks</b> / <b>T1497.002 User Activity Checks</b> / <b>T1622 Debugger Evasion</b><br/>DLL checks for debuggers, analysis tools and sandbox artifacts"] class action_anti_analysis action action_process_discovery["<b>Action</b> – <b>T1057 Process Discovery</b><br/>Enumerates running processes to locate analysis utilities"] class action_process_discovery action action_reflective_loading["<b>Action</b> – <b>T1620 Reflective Code Loading</b><br/>Decrypted SFX payload is loaded directly into memory"] class action_reflective_loading action action_c2["<b>Action</b> – <b>T1071.001 Application Layer Protocol: Web Protocols</b><br/>Inu2011memory payload establishes HTTPS Cobaltu202fStrike beacon"] class action_c2 action %% Nodes u2013 Files / Artifacts file_zip["<b>File</b> – malicious.zip<br/>Contains the malicious LNK"] class file_zip file file_lnk["<b>File</b> – u5e38u5ddeu5927u5b662026u5e74u300au56fdu5bb6u5b66u751fu4f53u8d28u5065u5eb7u6807u51c6u300bu6d4bu8bd5u901au77e5.pdf.lnk"] class file_lnk file file_vbs["<b>File</b> – chromedo.vbs<br/>Visual Basic script executed by explorer"] class file_vbs file tool_bandizip["<b>Tool</b> – Bandizip.exe<br/>Legitimate archiver abused to load malicious DLL"] class tool_bandizip tool file_dll["<b>File</b> – ark.x64.dll<br/>Malicious DLL loaded via sideu2011loading"] class file_dll file malware_cobalt_strike["<b>Malware</b> – Cobaltu202fStrike beacon<br/>Provides remote access"] class malware_cobalt_strike malware %% Nodes u2013 Processes process_explorer["<b>Process</b> – explorer.exe"] class process_explorer process process_chromedo["<b>Process</b> – chromedo (VBS host)"] class process_chromedo process %% Nodes u2013 Network network_c2["<b>Network</b> – C2 server 60.205.186.162 (lysander.asia) over HTTPS"] class network_c2 network %% Connections u2013 Attack Flow file_zip –>|contains| file_lnk file_lnk –>|invokes| process_explorer process_explorer –>|launches| file_vbs file_vbs –>|runs| tool_bandizip tool_bandizip –>|loads| file_dll file_dll –>|enables| action_obfuscation file_dll –>|performs| action_anti_analysis file_dll –>|triggers| action_process_discovery file_dll –>|supports| action_reflective_loading action_reflective_loading –>|loads| malware_cobalt_strike malware_cobalt_strike –>|communicates with| network_c2 %% Linking actions to show sequence action_initial_access –>|leads to| action_user_execution action_user_execution –>|combined with| action_masquerading action_masquerading –>|enables| action_permission_hijack action_permission_hijack –>|triggers| action_vbscript action_vbscript –>|uses| action_lol action_lol –>|creates| action_hidden_files action_hidden_files –>|facilitates| action_dll_side_loading action_dll_side_loading –>|includes| action_obfuscation action_obfuscation –>|covers| action_anti_analysis action_anti_analysis –>|feeds into| action_process_discovery action_process_discovery –>|precedes| action_reflective_loading action_reflective_loading –>|enables| action_c2 action_c2 –>|establishes beacon with| malware_cobalt_strike %% Class assignments class action_initial_access action class action_user_execution action class action_masquerading action class action_permission_hijack action class action_vbscript action class action_lol action class action_hidden_files action class action_dll_side_loading action class action_obfuscation action class action_anti_analysis action class action_process_discovery action class action_reflective_loading action class action_c2 action class file_zip file class file_lnk file class file_vbs file class file_dll file class tool_bandizip tool class process_explorer process class process_chromedo process class malware_cobalt_strike malware class network_c2 network "
공격 흐름
탐지
명령줄을 통한 이중 확장자를 가진 의심스러운 LNK 파일
보기
LOLBAS WScript / CScript (프로세스 생성 통해)
보기
IOC (HashSha256) 탐지: 드래곤 휘슬 작전: UNG0002가 무기화된 기관 유인을 통해 중국 학계를 타겟팅
보기
IOC (SourceIP) 탐지: 드래곤 휘슬 작전: UNG0002가 무기화된 기관 유인을 통해 중국 학계를 타겟팅
보기
IOC (DestinationIP) 탐지: 드래곤 휘슬 작전: UNG0002가 무기화된 기관 유인을 통해 중국 학계를 타겟팅
보기
알려진 악성 IP 및 도메인을 통한 C2 통신 탐지 [Windows 네트워크 연결]
보기
UNG0002 프로세스 열거 및 안티 디버깅 탐지 [Windows Sysmon]
보기
explorer.exe와 Bandizip.exe를 악용한 악성 VBScript 실행 탐지 [Windows 프로세스 생성]
보기
시뮬레이션 실행
전제 조건: Telemetry 및 Baseline Pre-flight Check가 완료되어야 합니다.
이유: 이 섹션은 탐지 규칙을 촉발하는 적대적 기술(TTP)의 정확한 실행을 자세히 설명합니다. 명령과 내러티브는 식별된 TTP를 직접 반영해야 하며 탐지 논리에서 예상되는 정확한 원격 측정을 생성하는 것을 목표로 합니다.
-
공격 내러티브 및 명령:
공격자는 악성 DLL (명명evil.dll)을 정상적인 호스트 프로세스 (rundll32.exe)로 로드합니다. DLL의DllMain은 즉시CreateToolhelp32Snapshot를 호출하고Process32First를 따라 모든 실행 중인 프로세스를 열거합니다. 열거 루프는 디버거 ("dbg"부분 문자열)의 존재를 확인하고, 발견되면 종료하는 고전적인 디버거 회피 기법 (T1622)입니다. DLL이 의해 로드되었기 때문에rundll32.exe, Sysmon에 의해 기록된 프로세스 생성 이벤트에 두 개의 네이티브 API의ApiSetName필드가 포함되며 탐지 규칙을 충족시킵니다. -
회귀 테스트 스크립트:
# ------------------------------------------------- # Step 1: Create C source for the malicious DLL # ------------------------------------------------- $dllSource = @" #include <windows.h> #include <tlhelp32.h> BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { if (ul_reason_for_call == DLL_PROCESS_ATTACH) { HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap == INVALID_HANDLE_VALUE) return FALSE; PROCESSENTRY32 pe = {0}; pe.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnap, &pe)) { do { // Simple anti‑debug check – look for "dbg" in process name if (wcsstr(pe.szExeFile, L"dbg")) { // Detected debugger; exit loop break; } } while (Process32Next(hSnap, &pe)); } CloseHandle(hSnap); } return TRUE; } "@ $srcPath = "$env:Tempevil.c" $dllPath = "$env:Tempevil.dll" $srcPath | Out-File -Encoding ascii -FilePath $srcPath -Force Set-Content -Path $srcPath -Value $dllSource # ------------------------------------------------- # Step 2: Compile the DLL with Visual C++ (cl.exe) # ------------------------------------------------- # Ensure Visual Studio Build Tools are installed and the environment is set. # Example using the Developer Command Prompt: # cl.exe /LD /O2 /MD evil.c /link /OUT:evil.dll # For automation within PowerShell, invoke the MSVC build tools: $vcvars = "${env:ProgramFiles(x86)}Microsoft Visual Studio2019BuildToolsVCAuxiliaryBuildvcvars64.bat" & cmd /c "`"$vcvars`" && cl.exe /LD /O2 /MD `"$srcPath`" /link /OUT:`"$dllPath`"" ` | Out-Null if (-Not (Test-Path $dllPath)) { Write-Error "DLL compilation failed." exit 1 } # ------------------------------------------------- # Step 3: Execute the malicious DLL via rundll32.exe # ------------------------------------------------- $rundll = "$env:SystemRootSystem32rundll32.exe" & $rundll $dllPath,EntryPoint # ------------------------------------------------- # Step 4: Pause to allow Sysmon to log the event # ------------------------------------------------- Start-Sleep -Seconds 5해당 스크립트는 대상 API 호출을 수행하는 최소한의 DLL을 컴파일한 다음
rundll32.exe로 로드합니다. 짧은 대기는 Sysmon이 프로세스 생성 이벤트를 기록할 시간을 확보합니다. -
정리 명령:
# Remove compiled artifacts Remove-Item -Force -ErrorAction SilentlyContinue $env:Tempevil.c Remove-Item -Force -ErrorAction SilentlyContinue $env:Tempevil.dll # Optional: Restart Sysmon to clear any stuck handles (not required in most cases) Stop-Service -Name Sysmon -Force Start-Service -Name Sysmon