SOC Prime Bias: 높음

07 4월 2026 19:57

Qilin EDR Killer Infection Chain

Author Photo
Ruslan Mikhalov SOC Prime에서 위협 연구 책임자 linkedin icon 팔로우
Qilin EDR Killer Infection Chain
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

이 보고서는 트로이 목마화된 msimg32.dll로 전달되는 다단계 로더에 대해 설명하며, 300개 이상의 엔드포인트 탐지 및 응답 제품을 비활성화하거나 제거할 수 있습니다. 이 로더는 고급 SEH/VEH 남용, 커널 드라이버 기술 및 하드웨어 브레이크포인트를 결합하여 사용 모드 후크를 피하고 보안 프로세스를 종료합니다. 이 활동은 Qilin 랜섬웨어 생태계와 관련이 있으며, ThrottleStop 도구에서 파생된 맞춤 드라이버를 포함합니다. 최종 결과는 보안 서비스를 종료하고 코드 무결성 콜백 로직을 복원하거나 무력화하여 공격자가 제어를 다시 활성화할 수 있는 전용 EDR 킬러 페이로드입니다.

조사

연구원들은 악의적인 DLL, 그 PE 로더 및 두 개의 지원 드라이버인 rwdrv.sys와 hlpdrv.sys을 리버스 엔지니어링했습니다. 이 분석은 로더가 어떻게 시스템 콜 슬롯 정책 테이블을 구축하고 예외 디스패처를 조작하며 실행을 리디렉션하기 위해 IAT 후킹을 수행하는지를 상세히 설명합니다. 그런 다음 셸32 기반 페이로드를 단계별로 실행하는 벡터 예외 처리를 사용합니다. 드라이버 계층은 원시 물리 메모리 접근을 노출하며, 그를 통해 EDR 관련 커널 콜백을 제거하거나 비활성화하고, 사용자 정의 IOCTL 인터페이스를 통해 보호된 프로세스를 종료하는데 활용됩니다.

완화

계층화된 방어를 사용하고 단일 EDR 제어에 의존하지 마십시오. 비정상적인 드라이버 로드 활동, 의심스러운 물리 메모리 IOCTL 사용, 커널 콜백 구조의 예기치 않은 변경 사항을 모니터링하십시오. 공격자가 합법적인 시스템 라이브러리를 교체하는 DLL 사이드로딩을 방지하고 하드웨어 브레이크포인트 스타일의 회피를 포함한 커버리지를 추가하십시오. ClamAV 및 Snort와 같은 도구의 룰셋을 포함하여 네트워크 및 엔드포인트 시그니처를 최신 상태로 유지하십시오.

대응

탐지된 경우 엔드포인트를 격리하고 악성 프로세스를 중지하며 의심스러운 드라이버를 언로드하십시오. 포렌식을 위해 전체 메모리 이미지를 캡처하고, rwdrv.sys 및 hlpdrv.sys의 명시적 검사 및 커널 콜백 및 관련 보안 텔레메트리의 무결성을 확인하십시오. msimg32.dll 파일 이름, 드라이버 로드 이벤트 및 IOCTL 0x2222008 패턴에 대한 업데이트된 탐지를 배포하십시오. 시스템 무결성 검토를 완료하고, 호스트에 대한 신뢰가 재설정될 수 없는 경우 검증된 백업에서 복구하십시오.

"graph TB %% 클래스 정의 classDef technique fill:#ffcc99 %% 노드 정의 tech_initial_appinit["<b>기술</b> – <b>T1546.010 AppInit DLLs</b>: 악의적인 msimg32.dll 사이드로딩<br/><b>설명</b>: AppInit_DLLs 레지스트리 값을 사용하여 모든 사용자 모드 프로세스에 악의적인 DLL을 로드합니다."] class tech_initial_appinit technique tech_obfuscation["<b>기술</b> – <b>T1027 은닉된 파일 또는 정보</b>: SEH/VEH 트릭이 적용된 암호화된 페이로드<br/><b>설명</b>: 악의적인 코드를 암호화하거나 숨기고 구조화된 예외 처리 또는 벡터 예외 처리 트릭을 사용하여 정적 분석을 회피합니다."] class tech_obfuscation technique tech_dll_injection["<b>기술</b> – <b>T1055.001 DLL 인젝션</b>: ExitProcess의 IAT 훅<br/><b>설명</b>: 타겟 프로세스에 악의적인 DLL을 주입하고 그것의 Import Address Table을 수정하여 ExitProcess 호출을 장악합니다."] class tech_dll_injection technique tech_hijack_flow["<b>기술</b> – <b>T1574 실행 흐름 하이재킹</b>: VEH/SEH 핸들러 및 하드웨어 브레이크포인트<br/><b>설명</b>: 예외 핸들러를 교체하거나 추가하여 실행을 악의적인 코드로 리디렉션합니다."] class tech_hijack_flow technique tech_reflective_load["<b>기술</b> – <b>T1620 반사적 코드 로딩</b>: 메모리 내 PE 암호 해독 및 실행<br/><b>설명</b>: 메모리 내에서 휴대용 실행 파일을 암호 해독하고 디스크에 기록하지 않고 실행합니다."] class tech_reflective_load technique tech_elev_control["<b>기술</b> – <b>T1548 권한 제어 메커니즘 악용</b>: rwdrv.sys 드라이버 로드를 통한 물리 메모리 R/W<br/><b>설명</b>: 서명된 또는 취약한 드라이버를 설치하여 물리 메모리에 대한 읽기/쓰기 접근 권한을 얻습니다."] class tech_elev_control technique tech_priv_esc["<b>기술</b> – <b>T1068 권한 상승을 위한 익스플로잇</b>: 커널 객체 조작 및 EDR 콜백 비활성화<br/><b>설명</b>: 로드된 드라이버를 사용하여 커널 구조를 수정하고 엔드포인트 탐지 및 응답 훅을 무력화합니다."] class tech_priv_esc technique tech_persistence_appinit["<b>기술</b> – <b>T1546.010 AppInit DLLs (지속성)</b>: 비활성화된 EDR 상태 유지<br/><b>설명</b>: EDR이 비활성화된 상태에서 재부팅 할 때도 지속성을 유지하기 위해 악성 DLL을 AppInit_DLLs를 통해 등록합니다."] class tech_persistence_appinit technique tech_sandbox_evasion["<b>기술</b> – <b>T1497.002 가상화/샌드박스 회피</b>: 로케일 점검 및 브레이크포인트 탐지<br/><b>설명</b>: 시스템 로케일 설정을 확인하고 디버거 브레이크포인트를 탐지하여 분석 환경을 감지합니다."] class tech_sandbox_evasion technique %% 공격 흐름 연결 tech_initial_appinit –>|리드투| tech_obfuscation tech_obfuscation –>|리드투| tech_dll_injection tech_dll_injection –>|리드투| tech_hijack_flow tech_hijack_flow –>|리드투| tech_reflective_load tech_reflective_load –>|리드투| tech_elev_control tech_elev_control –>|리드투| tech_priv_esc tech_priv_esc –>|리드투| tech_persistence_appinit tech_persistence_appinit –>|리드투| tech_sandbox_evasion "

공격 흐름

시뮬레이션 실행

전제 조건: 텔레메트리 및 기본 프리플라이트 검사가 통과되어야 합니다.

이유: 이 섹션은 탐지 규칙을 트리거하도록 설계된 적 기법(TTP)의 정확한 실행을 자세히 설명합니다. 명령과 설명은 반드시 식별된 TTP를 직접 반영하고 탐지 논리에 의해 예상되는 정확한 텔레메트리를 생성해야 합니다.

  • 공격 설명 및 명령:

    공격자는 명시적으로 ntdll.dll 을(를) 로드하고 NtTraceEvent 의 내보낸 이름을 호출하는 최소 네이티브 C 바이너리를 만듭니다. 바이너리는 타겟 호스트에서 Visual C++ 빌드 도구를 사용하여 컴파일된 후 실행됩니다. 이 호출은 일반 Windows API 표면을 통해 이루어지기 때문에 프로세스 생성 이벤트는 이미지 (ntdll.dll)를 기록하고 CallTrace 필드는 ‘NtTraceEvent’라는 문자열을 포함하게 되어 Sigma 조건을 충족시킵니다. 그런 다음 공격자는 포렌식 아티팩트를 줄이기 위해 바이너리를 삭제합니다.

  • 회귀 테스트 스크립트:

    # ---------------------------------------------------------
    # 단계 1 – NtTraceEvent를 호출하는 임시 C 소스 생성
    # ---------------------------------------------------------
    $src = @"
    #include <windows.h>
    typedef NTSTATUS (NTAPI *pNtTraceEvent)(HANDLE, ULONG, PVOID, ULONG);
    int main() {
        HMODULE hNtdll = LoadLibraryA("ntdll.dll");
        if (!hNtdll) return 1;
        pNtTraceEvent NtTraceEvent = (pNtTraceEvent)GetProcAddress(hNtdll, "NtTraceEvent");
        if (!NtTraceEvent) return 1;
        // 최소 호출 – 이 데모에서는 인수가 대부분 무시됩니다
        NtTraceEvent(NULL, 0, NULL, 0);
        return 0;
    }
    "@
    $tmpPath = "$env:TEMPNtTraceDemo.c"
    $exePath = "$env:TEMPNtTraceDemo.exe"
    $src | Set-Content -Path $tmpPath -Encoding ASCII
    
    # ---------------------------------------------------------
    # 단계 2 – cl.exe를 사용하여 컴파일 (Visual C++ 빌드 도구가 설치되어 있다고 가정)
    # ---------------------------------------------------------
    $vcVars = "$env:ProgramFiles(x86)Microsoft Visual Studio2019BuildToolsVCAuxiliaryBuildvcvars64.bat"
    if (Test-Path $vcVars) {
        & cmd /c "`"$vcVars`" && cl /nologo /O2 /Fe:`"$exePath`" `"$tmpPath`""
    } else {
        Write-Error "Visual C++ 빌드 도구를 찾을 수 없습니다. 이 스크립트를 실행하기 전에 설치하십시오."
        exit 1
    }
    
    # ---------------------------------------------------------
    # 단계 3 – 바이너리 실행 (이것이 규칙을 트리거해야 함)
    # ---------------------------------------------------------
    & $exePath
    
    # ---------------------------------------------------------
    # 단계 4 – 아티팩트 정리
    # ---------------------------------------------------------
    Remove-Item -Force $tmpPath, $exePath
  • 정리 명령:

    # 남아있는 파일이 제거되었는지 확인 (관리자로 실행)
    Get-ChildItem "$env:TEMPNtTraceDemo.*" -ErrorAction SilentlyContinue | Remove-Item -Force