OysterLoader 분석: 다단계 회피 로더의 내부
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
OysterLoader는 Vidar와 같은 랜섬웨어 및 상용 멀웨어를 배포하는 C++ 멀티 스테이지 로더입니다. 이는 정품 소프트웨어 설치 프로그램으로 위장한 손상된 사이트를 통해 전파되며, Microsoft Installer (MSI)로 제공됩니다. 분석을 방해하기 위해 API 호출 홍수, 사용자 정의 동적 API 해결, 디버그 방지 검사 및 사용자 정의 LZMA 디컴프레션 루틴을 사용합니다. 로더는 암호화된 HTTP 헤더와 독점적 Base64 유사 인코딩을 사용하여 계층 구조 HTTPS C2 인프라와 통신합니다.
조사
보고서는 네 가지 단계를 설명합니다: 패킹된 난독화기(TextShell), LZMA로 콘텐츠를 팽창시키는 셸코드 레이어, 환경 검사를 수행하고 뮤텍스를 생성하는 다운로더, DLL을 드롭하고 예약된 작업을 설치하는 최종 단계. C2 트래픽은 하드코드된 IP/도메인, 사용자 정의 사용자 에이전트, PNG 아이콘을 통한 스테가노그래픽 페이로드 전송에 의존합니다. 지속성은 13분마다 실행되도록 구성된 예약 작업으로 유지됩니다.
완화
신뢰할 수 없는 출처의 서명되지 않은 MSI 설치 프로그램을 차단하고 알려진 뮤텍스 패턴의 생성을 모니터링합니다. 예약된 작업 이름 패턴과 %APPDATA%에서 DLL을 로드하는 rundll32.exe 사용을 경고합니다. 가능하면 TLS 검사를 시행하여 로더가 사용하는 사용자 정의 HTTP 헤더와 사용자 에이전트를 식별합니다.
대응
탐지된 경우 호스트를 격리하고 예약된 작업을 종료하며 드롭된 COPYING3.dll 파일을 제거합니다. 추가 페이로드를 찾아 뮤텍스 값과 일치하는 프로세스를 열거해 차단하고 API 호출 홍수 행동 및 사용자 정의 Base64 인코딩에 대한 탐지를 업데이트합니다.
graph TB %% 클래스 정의 classDef action fill:#99ccff classDef malware fill:#ffcc99 classDef process fill:#ffeb99 classDef persistence fill:#c2f0c2 classDef c2 fill:#d9b3ff %% 노드 initial_access[“<b>초기 접근</b> – <b>T1218.007 시스템 바이너리 프록시 실행: Msiexec</b><br/>서명된 악성 MSI가 손상된 웹사이트를 통해 전달됨.”] class initial_access action process_msiexec[“<b>프로세스</b> – msiexec.exe<br/>악성 MSI 실행”] class process_msiexec process stage1[“<b>1단계</b> – 패커/난독화기<br/><b>기술</b>: T1027 난독화된 파일 또는 정보, T1027.007 동적 API 해석, T1614.001 시스템 언어 탐지, T1480.002 실행 가드레일: 상호 배제, T1497.002 가상화/샌드박스 회피: 사용자 활동 기반 검사”] class stage1 malware stage2[“<b>2단계</b> – 쉘코드<br/><b>기술</b>: T1140 파일 디코딩/난독화 해제 (RC4), LZMA 압축 해제”] class stage2 malware stage3[“<b>3단계</b> – 다운로더 및 C2<br/><b>기술</b>: T1102 웹 서비스, T1001.003 프로토콜 또는 서비스 가장, T1001.002 스테가노그래피, T1102.001 데드 드롭 리졸버”] class stage3 malware c2_server[“<b>C2</b> – HTTPS 서버<br/>사용자 지정 헤더 및 위조 User-Agent”] class c2_server c2 dll_payload[“<b>악성코드</b> – 드롭된 DLL<br/>%APPDATA%에 저장됨”] class dll_payload malware process_rundll32[“<b>프로세스</b> – rundll32.exe<br/>DllRegisterServer를 통해 DLL 실행”] class process_rundll32 process task_schtasks[“<b>지속성</b> – 예약 작업<br/>드롭된 DLL과 함께 rundll32 실행”] class task_schtasks persistence stage4[“<b>4단계</b> – 지속성 및 실행<br/><b>기술</b>: T1546.009 이벤트 트리거 실행: AppCert DLL, T1027.003 스테가노그래피, T1102.002 양방향 통신”] class stage4 malware %% 연결 initial_access –>|실행| process_msiexec process_msiexec –>|전달| stage1 stage1 –>|생성| stage2 stage2 –>|다운로드| stage3 stage3 –>|통신| c2_server c2_server –>|페이로드 제공| stage3 stage3 –>|DLL 작성| dll_payload dll_payload –>|사용됨| process_rundll32 process_rundll32 –>|트리거됨| task_schtasks task_schtasks –>|예약됨| stage4
높음
탐지
Schtasks가 의심스러운 디렉토리 / 바이너리 / 스크립트로 향함 (cmdline 통해)
보기
Rundll32 DLL 의심 경로 실행 (프로세스 생성 통해)
보기
IOCs (SourceIP) 탐지: OysterLoader 마스킹 해제: 다단계 회피 로더
보기
IOCs (DestinationIP) 탐지: OysterLoader 마스킹 해제: 다단계 회피 로더
보기
OysterLoader C2 통신 탐지 [Windows 네트워크 연결]
보기
OysterLoader 분석 및 실행 기술 탐지 [Windows 프로세스 생성]
보기
시뮬레이션 실행
전제 조건: 원격 측정 및 기준선 사전 비행 검사가 통과해야 합니다.
이유: 이 섹션은 탐지 규칙을 트리거하기 위해 설계된 적의 기술(핵심 기술(TTP))의 정확한 실행을 자세히 설명합니다. 명령과 내러티브는 식별된 TTP를 직접 반영하고 탐지 로직에 의해 예상되는 정확한 텔레메트리를 생성해야 합니다. 추상적이거나 관련이 없는 예는 오진을 초래합니다.
-
공격 내러티브 및 명령:
적은 엔드포인트에 처음 진입한 후 OysterLoader 페이로드를 배포합니다.- Rundll32를 통한 DLL 등록 – 로더는 악성 DLL을 복사합니다 (
COPYING3.dll) 임시 디렉토리로 복사하고,rundll32.exe를 사용하여DllRegisterServer엔트리 포인트를 등록하여selection1. - 디버그 방지 검사 – 분석을 회피하기 위해 페이로드는
ntdll.dll을 로드하고IsDebuggerPresent를 호출합니다. 이는 프로세스 기록을 생성하고이미지가 포함되며 명령줄에ntdll.dll가 포함되어IsDebuggerPresent에 만족합니다.에 만족합니다.. - 메모리 할당 – 메모리 내 실행을 위해 로더는
NtAllocateVirtualMemoryviantdll.dll를 호출합니다. 결과 프로세스 생성 이벤트는NtAllocateVirtualMemory명령줄에 포함되어selection3.
- Rundll32를 통한 DLL 등록 – 로더는 악성 DLL을 복사합니다 (
-
을 만족합니다.
회귀 테스트 스크립트: -
# OysterLoader 탐지 유효성 검사 스크립트 – PowerShell # —————————————————- # 1. 더미 악성 DLL 생성 (시뮬레이션을 위한 빈 파일) $dllPath = “$env:TEMPCOPYING3.dll” New-Item -Path $dllPath -ItemType File -Force | Out-Null # 2. selection1 트리거 – DllRegisterServer를 사용한 rundll32 Write-Host “selection1 실행 (rundll32 DLL 등록)…” Start-Process -FilePath “rundll32.exe” -ArgumentList “`”$dllPath`” DllRegisterServer” -NoNewWindow # 3. selection2 트리거 – IsDebuggerPresent를 사용한 ntdll Write-Host “selection2 실행 (IsDebuggerPresent)…” $scriptBlock = { Add-Type -MemberDefinition @” [DllImport(“ntdll.dll”, SetLastError = true)] public static extern bool IsDebuggerPresent(); “@ -Namespace WinAPI -Name NativeMethods [WinAPI.NativeMethods]::IsDebuggerPresent() | Out-Null } Start-Job -ScriptBlock $scriptBlock | Wait-Job | Receive-Job # 4. selection3 트리거 – NtAllocateVirtualMemory를 사용한 ntdll Write-Host “selection3 실행 (NtAllocateVirtualMemory)…” $scriptBlock2 = { Add-Type -MemberDefinition @” [DllImport(“ntdll.dll”, SetLastError = true)] public static extern int NtAllocateVirtualMemory( IntPtr ProcessHandle, ref IntPtr BaseAddress, IntPtr ZeroBits, ref UIntPtr RegionSize, uint AllocationType, uint Protect); “@ -Namespace WinAPI -Name NativeMethods $process = [System.Diagnostics.Process]::GetCurrentProcess() $handle = $process.Handle $base = [IntPtr]::Zero $size = [UIntPtr]::Zero [WinAPI.NativeMethods]::NtAllocateVirtualMemory($handle, [ref]$base, [IntPtr]::Zero, [ref]$size, 0x1000, 0x04) | Out-Null } Start-Job -ScriptBlock $scriptBlock2 | Wait-Job | Receive-Job # 정리 Remove-Item -Path $dllPath -Force Write-Host “시뮬레이션 완료.”
정리 명령: