
WhatsApp으로 전달되는 Winos 4.0 / ValleyRAT 스테이저: DLL 사이드로딩, BYOVD를 통한 Defender 무력화(CVE-2026-36425), TCP 443 상의 사용자 지정 C2 프로토콜, 그리고 이전에 보고되지 않은 C2 인프라.
저자: Mac Awad, 사이버 보안 학생 (Certificate IV, TAFE Queensland) · LinkedIn 날짜: 2026년 10월 30일 ~ 11월 1일 (시간은 AEST, UTC+10 기준) 상태: ASD의 ACSC (ReportCyber), ThreatFox 및 도메인 등록기관에 신고됨
탈취된 WhatsApp 계정에서 전송된 "결제 명세서" ZIP 파일은 알고 보니 Winos 4.0 / ValleyRAT 스테이저였다. 격리된 랩 환경에서 이 악성코드는 서명된 취약한 드라이버를 이용해 Microsoft Defender를 종료시킨 뒤, TCP 443 상의 사용자 정의 바이너리 프로토콜을 통해 이전에 보고된 적 없는 C2 도메인으로 비콘을 전송했다. 수동 OSINT를 통해 C2를 홍콩에 위치한 일회용 Windows 서버 풀로 추적했다.
ardrv.sys (CVE-2026-36425)를 이용해 Microsoft Defender 종료wwwapko[.]top → 156.234.7[.]71, 원시 TCP/443 (TLS 아님), 16바이트 hello, 약 67초마다 비콘 전송156.234.7[.]170에서도 나타나는데, 이는 IP 변경 전의 동일 서버일 가능성이 높음flowchart TD
A[WhatsApp lure<br/>from hijacked contact] --> B[ZIP]
B --> C[VHD mounted as drive<br/>no MOTW warning]
C --> D[Signed SETTINGM.exe<br/>sideloads hidden Is.Dll]
D --> E[Stage in Users\Public\Libraries<br/>relaunch via rundll32]
E --> F[UAC bypass]
F --> G[Drop ardrv.sys<br/>kill Defender]
G --> H[Beacon to wwwapko.top<br/>TCP 443, every ~67 s]
H --> I[Next stage: Winos 4.0<br/>online module, not received]

이 메시지는 전형적인 인보이스 사기 수법을 사용했습니다: 긴급성("이 결제 격차를 해결하세요"), 권위("재무 책임자에게 전달하세요"), 그리고 플랫폼 유도("컴퓨터에서 열어보세요", 페이로드가 Windows에서만 실행되기 때문). 계정 소유자는 47분 후 스팸 경고를 보냈으며, 이는 계정이 탈취되었음을 확인시켜 줍니다.

| 파일 | 크기 | 비고 |
|---|---|---|
E-statement Proforma Invoice (2).zip | 2.9 MB | 래퍼 |
10301023482034.vhd | 6.3 MB | 동적 VHD, exFAT, 볼륨 레이블 "Business", UTC+8 시계 기준 10월 30일 02:24 UTC에 빌드됨 |
I1030102341.exe | 360 KB | 정품 Menksoft SETTINGM.exe (2017), 유효하게 서명됨; Is.dll에서 3개 함수를 임포트함 |
Is.Dll | 4.28 MB | 악성, Hidden + System, 2026년 10월 29일 17:03 UTC에 컴파일됨, 내보내기 이름 MSEdgeWebView.dll |

Is.Dll의 주요 발견 사항:
vcruntime140_1_app도 내보냄SETTINGSDATABASE, SYNCENGINEDATABASE, UXDATABASE)는 암호화된 페이로드임curl -L -s -o, bitsadmin /transfer, certutil -urlcache, msiexec /qn3DC0C2FE338F567442B73E4B644B4F1A복호화기 (정적, 샘플을 절대 실행하지 않음):
import re, sys
key = b'3DC0C2FE338F567442B73E4B644B4F1A'
def rc4(k, d):
S = list(range(256)); j = 0
for i in range(256):
j = (j + S[i] + k[i % len(k)]) % 256; S[i], S[j] = S[j], S[i]
i = j = 0; out = bytearray()
for b in d:
i = (i + 1) % 256; j = (j + S[i]) % 256; S[i], S[j] = S[j], S[i]
out.append(b ^ S[(S[i] + S[j]) % 256])
return bytes(out)
data = open(sys.argv[1], 'rb').read()
for m in re.finditer(rb'(?:[0-9A-F]\x00){16,}', data):
h = m.group().decode('utf-16le')
if len(h) % 2: continue
pt = rc4(key, bytes.fromhex(h))
if sum(32 <= c < 127 for c in pt) > 0.85 * len(pt):
print(pt.decode()[:150])
복호화된 문자열에서 드러난 내용:
\\.\HWAudioX64, \\.\ardrv, \\.\AlinubxHKCU\Software\Classes\ms-settings\shell\open\command + ComputerDefaults.exe, 그리고 CMSTPLUA 권한 상승 모니커 {3E5FC7F9-9A51-4367-9063-A120244FBEC7}C:\Users\Public\Libraries\<random>\<random>설정: Windows 11 VM(Defender 켜짐, Sysinternals Procmon, Process Explorer, Autoruns)과 가짜 인터넷 역할을 하는 Kali VM(INetSim, 작은 가짜 DNS 스크립트, tcpdump)을 실제 인터넷이 없는 사설 VMware LAN 세그먼트에 구성했다. 각 실행 전에 깨끗한 스냅샷을 사용했다.
| 시간 | 관찰 내용 |
|---|---|
| 21:40 | VHD가 "Business"로 마운트됨; EXE만 보이고 창은 나타나지 않음 |
| 21:40 | 키트가 C:\Users\Public\Libraries의 숨겨진 무작위 이름 폴더 3개에 복사되고, 호스트 EXE는 OneDrive 파일 이름(SafeDelete.db-wal.exe, telemetry-dll-ramp-value.exe, SyncEngineDatabase.db.exe)으로 이름이 변경됨 |
| 21:40 | 재실행: rundll32.exe "...\IS.dll",vcruntime140_1_app |
| 21:40:25 | 17,744바이트 드라이버를 드롭하고 커널 서비스 ardrv 생성(OPSWAT, 서명 검증됨) |
| 21:40 | Defender 종료됨: MsMpEng 사라짐, 실시간 보호 꺼짐, 탐지 기록 없음 |
| 21:40:39 | wwwapko[.]top에 대한 첫 DNS 조회; 한 시간 이내에 1,080회 조회 |



드롭된 드라이버의 SHA-256 7504887e...는 OPSWAT AppRemover ardrv.sys, CVE-2026-36425와 일치한다: 해당 드라이버의 IOCTL 0x2420031은 커널 모드에서 임의의 프로세스 ID를 종료시킨다. Run 키나 예약된 작업은 생성되지 않았으므로, 지속성은 다음 단계에서 확보될 것이다.
가짜 DNS가 정상 동작하자 악성코드는 도메인을 확인하고 TCP 443에 연결했지만, TLS는 전혀 시작하지 않았다. 대신 16바이트 바이너리 hello를 전송했다:
10 00 00 00 2c 4b 0a 00 5d 8e 13 33 fb 00 66 62
| 바이트 | 의미 |
|---|---|
| 0-3 | 길이 = 16 (리틀 엔디언), 상수 |
| 4-7 | 밀리초 단위의 Windows 가동 시간 (674,604 = 11.2분); 패킷 간 실제 경과 시간만큼 정확히 증가 |
| 8-12 | 패킷마다 무작위 |
| 13 | 항상 00 |
| 14-15 | 검사 바이트; 바이트 15 = 바이트 14 XOR 0x04 |
재시도 패턴: 버스트 단위로 2.5초마다 새 TCP 연결, 약 67초마다 새로운 DNS 조회. 이는 Winos 4.0 스테이저가 C2에 핵심 "온라인 모듈"을 요청하는 동작과 일치한다. 실제 서버에는 의도적으로 접속하지 않았다.
Is.Dll을 Ghidra 12.1.4에 로드하여(정적 분석만 수행) 실험실에서 관찰된 동작을 코드 수준에서 추적했다. Ghidra는 23,215개의 함수를 복구했으며, 대부분 정적으로 링크된 MFC 및 C++ 런타임이었다. 악성 로직은 .text 섹션에 있는 작은 "툴박스"로, 난독화가 심하게 적용된 패킹 섹션에서 호출된다.