Phantom Stealer Analysis: Inside a Two-Layer Attack Chain
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
팬텀 스틸러는 악성으로 시작하는 두 단계 Windows 정보 도용 프로그램입니다 pdh.dll 로더로 시작하고 .NET 페이로드가 주입된 상태로 끝납니다 jsc.exe. 로더는 DLL 하이재킹, 프로세스 할로잉, 네이티브 AOT 컴파일을 사용하여 탐지 가능성을 줄입니다. 활성화되면 두 번째 단계 페이로드는 자격 증명, 브라우저 데이터, 암호화폐 지갑 정보, 클립보드 콘텐츠 및 다른 민감한 데이터를 도난하며, 복사된 지갑 주소를 공격자가 제어하는 값으로 교체할 수도 있습니다. 이 악성 코드는 상업적 범죄웨어로 판매되고 있으며 현재 활발한 공격에 사용되고 있습니다.
조사
연구원들은 로더가 자신을 복사하는 것을 발견했습니다 %APPDATA%MicrosoftRasManagementMpDlpService.exe 그리고 지속성을 유지하기 위해 Run 키를 생성합니다. 그런 다음 이중 RC4 암호화된 페이로드를 해독하고 이를 정지된 jsc.exe 프로세스에 주입하고 데이터 도난을 시작하기 전에 여러 가지 반분석 체크를 수행합니다. 내부 .NET 스틸러는 Chrome 127+ 앱 바운드 암호화를 우회할 수 있고, 스푸핑된 도메인을 사용하여 SMTP를 통해 도난된 정보를 내보냅니다. 별도의 스레드가 암호화 클리핑 및 키로깅 기능을 처리합니다.
완화
방어자는 비정상적인 pdh.dll 로드를 비시스템 경로에서 모니터링하고 DLL 하이재킹 위험을 줄이는 제어를 시행해야 합니다. 보안 팀은 또한 낯선 실행 파일이 %APPDATA%MicrosoftRasManagement 에 배치되는 것을 탐지하고 RasManSvc Run 키를 주의 깊게 감시해야 합니다. 행동 기반 탐지를 통해 jsc.exe을 포함한 프로세스 할로잉에 집중하고, 네트워크 모니터링은 식별된 명령 및 제어 도메인으로의 의심스러운 연결을 플래그해야 합니다. 브라우저 자격 증명 저장소를 추가로 강화하고 신뢰할 수 없는 애플리케이션에 대한 클립보드 접근을 더욱 엄격히 제어하면 노출을 줄일 수 있습니다.
대응
RasManagement 디렉터리 내에서 MpDlpService.exe 생성 및 관련 Run 레지스트리 키 변경을 알림. 주입된 코드가 있는 jsc.exe 프로세스를 조사하고 즉시 악의적인 활동을 종료하세요. 관련된 침해 지표를 수집하고 관련 파일을 격리한 후, 노출된 자격 증명 및 지갑 데이터를 확인하기 위해 포렌식 분석을 수행하세요. 영향을 받은 계정을 재설정하고 필요에 따라 영향을 받은 사용자에게 통보하세요.
graph TB classDef technique fill:#ffcc99 classDef file fill:#c2f0c2 classDef process fill:#add8e6 classDef action fill:#ffd699 step1_ext[“<b>기법</b> – <b>T1176 소프트웨어 확장 기능</b><br/><b>설명</b>: pdh.dll을 정상 앱과 같은 폴더에 배치하여 실행 유도.”] class step1_ext technique step1_masq[“<b>기법</b> – <b>T1036.005 위장</b><br/><b>설명</b>: 정상 Windows 라이브러리처럼 파일 이름 위장.”] class step1_masq technique step1_dynapi[“<b>기법</b> – <b>T1027.007 동적 API 해석</b><br/><b>설명</b>: 런타임에서 API 호출 해결.”] class step1_dynapi technique file_dll[“<b>파일</b> – pdh.dll (악성)”] class file_dll file step1_ext –>|사용| step1_masq step1_ext –>|사용| step1_dynapi step1_ext –>|드롭| file_dll file_dll –>|로드됨| step1_ext step2_compromise[“<b>기법</b> – <b>T1554 호스트 바이너리 변조</b>”] class step2_compromise technique step2_activeSetup[“<b>기법</b> – <b>T1547.014 Active Setup</b>”] class step2_activeSetup technique step2_runkey[“<b>기법</b> – <b>T1547.001 레지스트리 Run 키</b>”] class step2_runkey technique file_loader[“<b>파일</b> – MpDlpService.exe (로더)”] class file_loader file step1_ext –>|이동| step2_compromise step2_compromise –>|활성화| step2_activeSetup step2_activeSetup –>|생성| file_loader file_loader –>|등록| step2_runkey step3_evasion[“<b>기법</b> – <b>T1497.002 샌드박스 회피</b>”] class step3_evasion technique step3_queryReg[“<b>기법</b> – <b>T1012 레지스트리 조회</b>”] class step3_queryReg technique step2_compromise –>|트리거| step3_evasion step3_evasion –>|사용| step3_queryReg step4_hollow[“<b>기법</b> – <b>T1055.012 프로세스 할로잉</b>”] class step4_hollow technique step4_threadHijack[“<b>기법</b> – <b>T1055.003 스레드 하이재킹</b>”] class step4_threadHijack technique process_jsc[“<b>프로세스</b> – jsc.exe”] class process_jsc process process_mal[“<b>프로세스</b> – 주입된 .NET 페이로드”] class process_mal process step3_evasion –>|이동| step4_hollow step4_hollow –>|생성| process_jsc step4_hollow –>|메모리_대체| process_jsc process_jsc –>|호스팅| process_mal step4_hollow –>|사용| step4_threadHijack step5_browserDisc[“<b>기법</b> – <b>T1217 브라우저 탐지</b>”] class step5_browserDisc technique step5_credWeb[“<b>기법</b> – <b>T1555.003 브라우저 자격 증명</b>”] class step5_credWeb technique step5_privateKey[“<b>기법</b> – <b>T1552.004 비보호 키</b>”] class step5_privateKey technique step4_hollow –>|이동| step5_browserDisc step5_browserDisc –>|활성화| step5_credWeb step5_credWeb –>|추가| step5_privateKey step6_keylog[“<b>기법</b> – <b>T1056.001 키로깅</b>”] class step6_keylog technique step5_credWeb –>|활성화| step6_keylog step7_screen[“<b>기법</b> – <b>T1113 화면 캡처</b>”] class step7_screen technique step6_keylog –>|이동| step7_screen step8_clipboard[“<b>기법</b> – <b>T1115 클립보드</b>”] class step8_clipboard technique step7_screen –>|이동| step8_clipboard step9_emailCollect[“<b>기법</b> – <b>T1114 이메일 수집</b>”] class step9_emailCollect technique step9_identity[“<b>기법</b> – <b>T1589.002 이메일 신원</b>”] class step9_identity technique step9_exfil[“<b>기법</b> – <b>T1048.003 SMTP 유출</b>”] class step9_exfil technique step8_clipboard –>|이동| step9_emailCollect step9_emailCollect –>|포함| step9_identity step9_identity –>|유출| step9_exfil step10_reflective[“<b>기법</b> – <b>T1620 리플렉티브 로딩</b>”] class step10_reflective technique step9_exfil –>|트리거| step10_reflective
공격 흐름
탐지
가능한 영속성 지점 [ASEPs – 소프트웨어/NTUSER 하이브] (레지스트리 이벤트 통함)
보기
비정상적인 코드 페이지 변경 실행 (명령줄을 통한)
보기
가능한 무선 네트워크 비밀번호 검색 (명령줄을 통한)
보기
IOCs (HashSha256) 탐지: 팬텀 스틸러 분석: Windows DLL 뒤에 숨겨진 이중 레이어 공격 체인 내부
보기
IOCs (HashMd5) 탐지: 팬텀 스틸러 분석: Windows DLL 뒤에 숨겨진 이중 레이어 공격 체인 내부
보기
레지스트리 지속성 – RasManSvc 실행 키 [Windows 레지스트리 이벤트]
보기
jsc.exe에 대한 프로세스 할로잉 및 MpDlpService.exe를 통한 지속성 [Windows 프로세스 생성]
보기
시뮬레이션 실행
전제 조건: 텔레메트리 및 베이스라인 사전 비행 점검이 통과해야 합니다.
이유: 이 섹션은 탐지 규칙을 트리거하기 위해 설계된 적대적인 기법(TTP)의 정확한 실행을 다룹니다. 명령과 서술은 식별된 TTP를 직접 반영하며 탐지 논리에서 예상되는 정확한 텔레메트리를 생성하는 것을 목표로 합니다.
-
공격 내러티브 및 명령:
적대자는 처음에 악성 페이로드(예: 역방향 셸 DLL)를 도난하여 사용자의%APPDATA%디렉터리에 저장합니다. 이를 허용된 호스트로 사용하여, 공격자는 새로운 프로세스를 생성하고 페이로드를 주입하며 실행을 재개합니다—이를 통해jsc.exe을(를) 수행합니다 T1055.012 and T1055.003.
지속성을 보장하기 위해, 공격자는 악성 DLL을%APPDATA%MicrosoftRasManagementMpDlpService.exe에 복사하고 합법적 서비스 이름을 악용하여 로그인 시 실행되도록 서비스로 등록합니다 (T1620). -
회귀 테스트 스크립트:
# --------------------------------------------------------- # 시뮬레이션된 적대자 스크립트 – 프로세스 할로잉 + 지속성 # --------------------------------------------------------- # 변수 $appData = "$env:APPDATAMicrosoftRasManagement" $loaderPath = Join-Path $appData "MpDlpService.exe" $maliciousDll = "$env:TMPmalicious.dll" # 페이로드 대체 자리 표시자 # 1. 지속성 디렉터리 준비 New-Item -Path $appData -ItemType Directory -Force | Out-Null # 2. 더미 악성 DLL 드롭(시뮬레이션된 페이로드) # 실제 공격에서는 컴파일된 페이로드여야 합니다. 여기서는 0바이트 파일을 생성합니다. New-Item -Path $maliciousDll -ItemType File -Force | Out-Null # 3. DLL을 스푸핑된 서비스 위치로 복사 Copy-Item -Path $maliciousDll -Destination $loaderPath -Force # 4. 복사된 파일을 가리키는 임시 서비스 등록(관리자 필요) $svcName = "MpDlpService" sc.exe create $svcName binPath= "`"$loaderPath`"" DisplayName= "Microsoft Ras Management Service" start= auto | Out-Null # 5. 서비스 시작(MpDlpService.exe 실행 유발) sc.exe start $svcName | Out-Null # 6. jsc.exe를 호스트로 사용하여 프로세스 할로잉 수행 # jsc.exe를 중단된 상태로 시작하고, 더미 페이로드로 메모리를 교체한 후, # 다시 재개합니다. 이는 PowerSploit의 Invoke-ProcessHollowing 함수를 사용합니다. function Invoke-ProcessHollowing { param( [string]$HostPath, [string]$PayloadPath ) # .NET API 로드 Add-Type @" using System; using System.Diagnostics; using System.Runtime.InteropServices; public class Hollow { [DllImport("kernel32.dll")] public static extern bool CreateProcess(string appName, string cmdLine, IntPtr procSec, IntPtr threadSec, bool inherit, uint flags, IntPtr env, string cwd, ref STARTUPINFO si, out PROCESS_INFORMATION pi); [StructLayout(LayoutKind.Sequential)] public struct STARTUPINFO { public int cb; public string lpReserved; public string lpDesktop; public string lpTitle; public uint dwX; public uint dwY; public uint dwXSize; public uint dwYSize; public uint dwXCountChars; public uint dwYCountChars; public uint dwFillAttribute; public uint dwFlags; public short wShowWindow; public short cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public uint dwProcessId; public uint dwThreadId; } "@ # 중단된 프로세스 생성 $si = New-Object Hollow+STARTUPINFO $pi = New-Object Hollow+PROCESS_INFORMATION $si.cb = [Runtime.InteropServices.Marshal]::SizeOf($si) $CREATE_SUSPENDED = 0x00000004 $ok = [Hollow]::CreateProcess($null, "`"$HostPath`"", [IntPtr]::Zero, [IntPtr]::Zero, $false, $CREATE_SUSPENDED, [IntPtr]::Zero, $null, [ref]$si, [ref]$pi) if (-not $ok) { Write-Error "중단된 프로세스를 생성하는 데 실패했습니다" ; return } # (페이로드 주입 단계 생략 – 실제 기법을 위한 자리 표시자) # 스레드 재개 $RESUME_THREAD = 0x00000001 [System.Runtime.InteropServices.Marshal]::WriteInt32($pi.hThread, 0, $RESUME_THREAD) | Out-Null } # 사용하여 할로잉 실행(진짜 jsc.exe를 호스트로 사용) $jscPath = "$env:SystemRootSystem32jsc.exe" Invoke-ProcessHollowing -HostPath $jscPath -PayloadPath $maliciousDll # --------------------------------------------------------- # 시뮬레이션 끝 # --------------------------------------------------------- -
정리 명령:
# 임시 서비스 종료 및 삭제 sc.exe stop MpDlpService | Out-Null sc.exe delete MpDlpService | Out-Null # 로더 및 더미 페이로드 제거 Remove-Item -Path "$env:APPDATAMicrosoftRasManagementMpDlpService.exe" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TMPmalicious.dll" -Force -ErrorAction SilentlyContinue # 선택 사항: 테스트로 시작된 남아 있는 jsc.exe 프로세스를 종료 Get-Process -Name jsc -ErrorAction SilentlyContinue | Stop-Process -Force