호텔 산업을 노리는 포토 ZIP 캠페인, 지속적인 접근을 위한 Node.js 임플란트 제공
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
활성화된 다단계 침입 캠페인이 악성 LNK 파일을 포함한 사진 테마의 ZIP 아카이브를 통해 접대업계를 대상으로 하고 있습니다. 감염 체인은 난독화된 PowerShell 디코더, 즉석 .NET DLL 컴파일, 지속성과 명령 및 제어 통신을 위한 Node.js 기반 임플란트를 사용합니다. 공격자는 또한 Calendly 및 Google과 같은 정식 서비스를 통해 인증을 세탁하여 이메일 기반 탐지를 회피합니다.
조사
Microsoft는 캠페인의 두 개의 별도 파동을 식별하고 단순한 PowerShell 로더에서 보다 복잡한 .NET 컴파일 단계로의 발전을 관찰했습니다. 조사에서 도 이중 지속성 전략이 발견되었습니다. 이는 모두 HKCURun and HKCURunOnce 레지스트리 키에 의존하였습니다. 연구자들은 또한 지원 기반을 은폐하기 위해 Cloudflare가 지원하는 도메인과 비표준 명령 및 제어 포트를 사용하는 점을 주목했습니다.
완화 조치
조직은 바로 가기 실행, 예상치 못한 .NET 컴파일, 사용자가 쓸 수 있는 디렉토리에서 시작된 Node.js 프로세스에 대한 계층적 탐지를 우선시해야 합니다. 공격 표면 축소 규칙을 활성화하고 무단으로 Microsoft Defender 예외 변경을 모니터링하는 것이 강력히 권장됩니다. 의심스러운 .cfd 도메인 패턴 차단과 비정상적 포트를 통한 아웃바운드 트래픽 감시가 노출을 줄이는 데 도움이 될 수 있습니다.
응답
이 활동이 감지되면, 복구에는 두 가지 방법 모두 포함되어야 합니다. ProgramData RunOnce 항목 및 Node.js Run 키를 제거하여 임플란트가 스스로 복원하는 것을 막아야 합니다. 보안 팀은 또한 Node.js 런타임 및 관련 .js 페이로드를 AppDataLocalNodejs 디렉토리에서 삭제해야 합니다. 완전한 정리는 활성 페이로드와 남겨진 지속성 메커니즘을 모두 해결해야 합니다.
"flowchart TD step_phishing["T1566.002 u2013 피싱: 스피어피싱 링크: Calendly 및 Google 리디렉트를 통한 인증 세탁을 사용하여 사진 테마의 ZIP 아카이브를 배달합니다."] step_user_execution["T1204.002 u2013 사용자 실행: 악성 파일: 피해자가 가짜 이미지 바로 가기(.lnk)를 열면 난독화된 PowerShell 다운로드 프로그램이 실행됩니다."] rules_for_user_execution("<b>규칙 이름</b>: 이중 확장자가 있는 가능성 있는 악성 LNK 파일<br/><b>규칙 ID</b>: 13f9a3c1-b2fe-4268-8052-bf6fe353e952") step_obfuscation["T1027 u2013 난독화된 파일 또는 정보: PowerShell은 수학적 디코딩(XOR, 모듈로)을 사용하여 다음 단계를 검색합니다."] rules_for_obfuscation("<b>규칙 이름</b>: 가능성 있는 Powershell 난독화 지표<br/><b>규칙 ID</b>: a11f179d-8248-4d34-905c-e61735a72688") step_compilation["T1027.004 u2013 전달 후 컴파일: PowerShell은 csc.exe 및 cvtres.exe를 사용하여 DLL을 생성하는 .NET 컴파일을 트리거합니다."] step_implant_execution["Node.js 기반 임플란트 실행: 악성 .js 페이로드를 node.exe를 통해 배포합니다."] rules_for_implant_execution("<b>규칙 이름</b>: 알려진 악용된 프로세스에 의해 스폰된 가능성 있는 Node<br/><b>규칙 ID</b>: b36fbdaf-1bab-45c2-a15b-f0c25c696d72") step_persistence["T1547.014 u2013 부트 또는 로그인 자동 시작 실행: Active Setup: Node.js 구성요소 및 ProgramData 실행 파일을 위한 ‘Run’ 및 ‘RunOnce’ 레지스트리 키를 사용하는 이중 모델입니다."] rules_for_persistence("<b>규칙 이름</b>: 가능성 있는 지속성 포인트 [ASEPs – Software/NTUSER Hive]<br/><b>규칙 ID</b>: 4cb3ac97-0fab-4447-9054-6f2d6ca102a1") step_command_and_control["TA0011 u2013 명령 및 제어: 비표준 포트(8443, 56001)와 헤드리스 브라우저 자동화를 통한 고정 IP 인프라스트럭처로의 신호 전송."] rules_for_c2("<b>규칙 이름</b>: 비정상적 최상위 도메인(TLD) DNS 요청에 의한 의심스러운 명령 및 제어 (via dns)<br/><b>규칙 ID</b>: 63f3e8bc-0241-4f00-b9db-d4c309e61036") rules_for_c2_network("<b>규칙 이름</b>: 스크립팅 런타임이 아웃바운드 TLS 연결을 시작함 (via network_connection)<br/><b>규칙 ID</b>: 1ac66e9b-fd10-4c8c-af41-8c3d901ba03d") step_phishing –>|leads_to| step_user_execution step_user_execution –>|triggers| step_obfuscation step_user_execution -.->|detected_by| rules_for_user_execution step_obfuscation –>|leads_to| step_compilation step_obfuscation -.->|detected_by| rules_for_obfuscation step_compilation –>|enables| step_implant_execution step_implant_execution –>|establishes| step_persistence step_implant_execution -.->|detected_by| rules_for_implant_execution step_persistence –>|leads_to| step_command_and_control step_persistence -.->|detected_by| rules_for_persistence step_command_and_control -.->|detected_by| rules_for_c2 step_command_and_control -.->|detected_by| rules_for_c2_network "
공격 흐름
탐지
비정상적 최상위 도메인(TLD) DNS 요청에 의한 의심스러운 명령 및 제어 (via dns)
보기
가능성 있는 지속성 포인트 [ASEPs – Software/NTUSER Hive] (via registry_event)
보기
이중 확장자가 있는 가능성 있는 악성 LNK 파일 (via cmdline)
보기
알려진 악용된 프로세스에 의해 스폰된 가능성 있는 Node (via cmdline)
보기
Windows Defender 기본 설정 의심스러운 변경 사항 (via powershell)
보기
가능성 있는 Powershell 난독화 지표 (via powershell)
보기
스크립팅 런타임이 아웃바운드 TLS 연결을 시작함 (via network_connection)
보기
비표준 C2 포트 및 .cfd 도메인 트래픽 탐지 [Windows 네트워크 연결]
보기
Defender 회피로 난독화된 PowerShell BigInt 디코더 탐지 [Windows Powershell]
보기
시뮬레이션 실행
필수 조건: 텔레메트리 및 기준선 사전 비행 체크를 통과해야 합니다.
이유: 이 섹션에서는 탐지 규칙을 트리거하기 위해 고안된 적의 기술 (TTP)의 정확한 실행에 대해 설명합니다. 명령어와 설명은 식별된 TTP를 직접 반영하고 탐지 논리에 의해 예상되는 정확한 텔레메트리를 생성하도록 해야 합니다. 추상적이거나 관련없는 예시는 오진으로 이어질 수 있습니다.
-
공격 내러티브 및 명령어: 적글이 스피어피싱 링크(T1566.002)를 통해 초기 접근을 확보했습니다. 지속성과 명령 및 제어(C2)를 확립하기 위해, 적글은 경량 PowerShell 기반 임플란트를 배포합니다. 표준 포트만 감시하는 기본 방화벽 규칙에 의해 탐지를 피하기 위해, 공격자는 기본 하트비트에 비표준 포트(8443)를 사용하기로 결정했습니다. 추가적으로, 임플란트는 기본 IP가 차단될 경우의 회복력을 보장하기 위해 백업 도메인에 대한 2차 “전화 걸기”를 수행하도록 구성됩니다. 이는 규칙의 참고 사항에서 언급된 Photo-Zip 캠페인의 행동을 모방합니다.
.cfdTLD로 기본 IP가 차단될 경우의 회복성을 보장하기 위해. 이는 규칙의 참고 사항에서 언급된 Photo-Zip 캠페인의 행동을 모방합니다. -
회귀 테스트 스크립트:
# 시뮬레이션 스크립트: 규칙 유효성 검사의 C2 에뮬레이션 # 이 스크립트는 비표준 포트와 .cfd 도메인으로의 네트워크 연결을 시뮬레이션합니다. Write-Host "[+] C2 시뮬레이션 시작..." -ForegroundColor Cyan # 1. 비표준 C2 포트(8443)로의 연결 시뮬레이션 # 우리는 8443에서 수신 대기 중인 공용 IP(또는 사용 가능한 경우 로컬 수신 대기)를 사용합니다 Write-Host "[+] 비표준 포트 8443으로 연결 시도 중..." -ForegroundColor Yellow try { $tcpClient = New-Object System.Net.Sockets.TcpClient $tcpClient.Connect("8.8.8.8", 8443) # 포트 테스트용으로 Google DNS를 더미 대상으로 사용 } catch { Write-Host "[!] 포트 8443 연결 실패 (포트가 닫힌 경우 예상됨), 하지만 텔레메트리는 여전히 생성되어야 합니다." -ForegroundColor Gray } finally { $tcpClient.Close() } # 2. .cfd 도메인으로의 연결 시뮬레이션 # 우리는 더미 .cfd 도메인을 해결하고 연결을 시도합니다 Write-Host "[+] .cfd 도메인으로의 연결 시도 중..." -ForegroundColor Yellow $cfdDomain = "malicious-c2-test.cfd" try { # DNS 텔레메트리를 트리거하기 위해 Resolve-DnsName을 사용하고, 웹 요청을 따릅니다 Resolve-DnsName -Name $cfdDomain -ErrorAction SilentlyContinue Invoke-WebRequest -Uri "http://$cfdDomain" -TimeoutSec 2 -ErrorAction SilentlyContinue } catch { Write-Host "[!] .cfd 도메인 연결 실패 (더미 도메인에 대한 예상), 하지만 텔레메트리가 생성되어야 합니다." -ForegroundColor Gray } Write-Host "[+] 시뮬레이션 완료." -ForegroundColor Cyan -
정리 명령어:
# 정리: 이 특정 스크립트로 생성된 지속적인 아티팩트는 없습니다. # 리스너가 시작된 경우, 이를 중지해야 합니다. Write-Host "[+] 이 상태 없는 시뮬레이션을 위한 정리가 필요하지 않습니다." -ForegroundColor Green