SOC Prime Bias: Critical

22 May 2026 06:29 UTC

NG0002, 중국 학계를 무기로 만든 기관 유인물로 겨냥

Author Photo
SOC Prime Team linkedin icon 팔로우
NG0002, 중국 학계를 무기로 만든 기관 유인물로 겨냥
shield icon

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 "

공격 흐름

시뮬레이션 실행

전제 조건: 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