지금 당장 확인하세요: Sitecore ViewState 제로데이 취약점 (CVE-2025-53690) 긴급 대응 가이드
Mandiant
Cyber Defense Summit 2025
Threat insights and defense tactics from experts on the frontlines.
Register now해당 블로그의 원문은 2025년 9월 4일 Google Cloud 블로그(영문)에 게재되었습니다.
작성자: Rommel Joven, Josh Fleischer, Joseph Sciuto, Andi Slok, Choon Kiat Ng
업데이트 (9월 3일): 해당 게시물에 GoTokenTheft 사용에 대한 정보가 추가되었습니다.
최근 Mandiant Threat Defense는 2017년 이전의 Sitecore 배포 가이드에 노출된 샘플 머신 키(machine key)를 악용하는 활성 ViewState 역직렬화 공격을 발견했습니다. 공격자는 노출된 ASP.NET 머신 키를 이용해 원격 코드 실행(RCE)에 성공했습니다.
맨디언트는 Sitecore와 직접 협력하여 이 문제를 해결했습니다. Sitecore는 이 취약한 구성을 CVE-2025-53690으로 분류했으며, 이는 공개된 배포 가이드(특히 Sitecore XP 9.0 및 Active Directory 1.4 이하 버전)에 포함된 샘플 키를 사용해 제품을 배포한 고객들에게 영향을 미칩니다. Sitecore는 최신 배포 시 고유한 머신 키를 자동으로 생성하도록 업데이트했으며, 영향을 받는 고객들에게 이미 통지했다고 확인했습니다.
잠재적 영향 제품에 대한 자세한 내용은 Sitecore의 권고문을 참조하십시오.
요약
맨디언트는 신속한 대응을 통해 공격을 조기에 차단했으며, 이로 인해 전체 공격 생명주기를 관찰할 수는 없었습니다. 하지만 조사 결과, 공격자의 활동에 대한 중요한 단서를 얻을 수 있었습니다. 공격자는 초기 서버 침투부터 권한 상승에 이르기까지, 공격 대상 제품과 악용된 취약점에 대한 깊은 이해를 보여주었습니다. 이번 공격의 주요 단계는 다음과 같습니다.
- 초기 침투: 인터넷에 연결된 취약한
Sitecore
인스턴스에서ViewState Deserialization
취약점(CVE-2025-53690
)을 악용해 원격 코드 실행에 성공했습니다 -
정찰 악성코드: 복호화된 ViewState 페이로드에서 내부 정찰용 악성코드인 WEEPSTEEL이 발견되었습니다.
- 민감 파일 탈취 시도: 공격자는 웹 애플리케이션의 루트 디렉토리를 압축하여 웹 구성 파일(
web.config
)과 같은 민감한 파일을 탈취하려 했으며, 이후 호스트 및 네트워크 정찰을 진행했습니다. -
공격 도구 준비: 공격자는 공개 디렉토리에 다음과 같은 오픈소스 도구들을 준비했습니다.
-
네트워크 터널링 도구:
EARTHWORM
-
원격 접속 도구:
DWAGENT
-
Active Directory(AD) 정찰 도구:
SHARPHOUND
-
-
자격 증명 탈취 및 횡적 이동: 로컬 관리자 계정을 생성하고 이를 이용해
SAM
/
SYSTEM
하이브를 덤프하여 캐시된 관리자 자격 증명을 탈취하려 했습니다. 탈취된 자격 증명을 이용해RDP
를 통해 내부 네트워크로 횡적 이동했습니다 - 지속적인 접근:
DWAgent
는 지속적인 원격 접근을 제공했으며, 이를 통해 Active Directory 정찰에 활용되었습니다


그림 1: 공격 라이프사이클
초기 침투
외부 정찰
위협 행위자는 피해자의 웹 서버에 다양한 엔드포인트로 HTTP 요청을 보내는 것으로 공격을 시작했습니다. 그러다 결국 /sitecore/blocked.aspx
페이지에 집중했습니다. 이 페이지는 Sitecore의 합법적인 구성 요소로, 라이선스 문제로 인해 요청이 차단되었을 때 단순히 메시지를 반환하는 역할을 합니다. 하지만 이 페이지는 ASP.NET의 표준 기능인 숨겨진 ViewState 폼을 사용하며, 인증 없이 접근이 가능했기 때문에 ViewState 역직렬화 공격의 잠재적 표적이 되었습니다.
ViewState 역직렬화(Deserialization) 공격
ViewState는 웹 페이지의 상태를 유지하기 위해 __VIEWSTATE
라는 숨겨진 HTML 필드에 데이터를 저장하는 ASP.NET 기능입니다. ViewState 역직렬화 공격은 유효성 검사 메커니즘이 없거나 우회될 때 서버가 ViewState 메시지를 역직렬화하는 취약점을 악용합니다. 머신 키(machine key)는 ViewState의 무결성과 기밀성을 보호하는 역할을 하는데, 이 키가 유출되면 애플리케이션은 서버로 전송되는 합법적인 ViewState 페이로드와 악성 페이로드를 구분하는 능력을 상실하게 됩니다.
로컬 웹 서버(IIS) 로그 기록에 따르면, 위협 행위자는 blocked.aspx
엔드포인트에 HTTP POST 요청을 보내는 것으로 공격을 시작했고, 이에 대해 HTTP 302 "Found" 응답을 받았습니다. 이 웹 요청은 Windows 애플리케이션 이벤트 로그(이벤트 ID 1316)에 "ViewState verification failed
"라는 메시지와 함께 위협 행위자가 조작하여 보낸 ViewState 페이로드가 기록된 시점과 일치합니다.
Log: Application
Source: ASP.NET 4.0.30319.0
EID: 1316
Type: Information
Event code: 4009-++-Viewstate verification failed. Reason: Viewstate was
invalid.
<truncated>
ViewStateException information:
Exception message: Invalid viewstate.
Client IP: <redacted>
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;
Trident/5.0) chromeframe/10.0.648.205 Mozilla/5.0
(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/121.0.0.0 Safari/537.36
PersistedState: <27760 byte encrypted + base64 encoded payload>
Referer:
Path: /sitecore/blocked.aspx
위협 행위자는 서버의 머신 키를 알고 있었으며, 이를 이용해 공개된 ysoserial.net
과 같은 도구로 악성 ViewState 요청을 조작했습니다.
초기 호스트 정찰
맨디언트는 서버의 ASP.NET 설정 파일인 web.config
에 저장된 머신 키 사본을 복구했습니다. 이 키를 이용해 위협 행위자의 ViewState 페이로드를 복호화한 결과, Information.dll
이라는 .NET 어셈블리가 내장되어 있음을 발견했습니다. 맨디언트가 WEEPSTEEL로 추적하는 이 어셈블리는 내부 정찰 도구로, 이전에 발견된 GhostContainer 백도어 및 다른 정보 수집 페이로드와 유사점을 가지고 있습니다.
이 페이로드는 정찰을 위해 다음과 같은 시스템 정보를 탈취하도록 설계되었습니다.
// Code Snippet from Host Reconnaissance Function
Information.BasicsInfo basicsInfo = new Information.BasicsInfo
{
Directories = new Information.Directories
{
CurrentWebDirectory = HostingEnvironment.MapPath("~/")
},
// Gather system information
OperatingSystemInformation = Information.GetOperatingSystemInformation(),
DiskInformation = Information.GetDiskInformation(),
NetworkAdapterInformation = Information.GetNetworkAdapterInformation(),
Process = Information.GetProcessInformation()
};
// Serialize the 'basicsInfo' object into a JSON string
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
text = javaScriptSerializer.Serialize(basicsInfo);
WEEPSTELL 악성코드 정보 수집 기능을 보여주는 코드 스니펫
WEEPSTEEL은 ViewState 관련 침투를 위해 맞춤 제작된 공개 도구인 ExchangeCmdPy.py의 일부 기능을 차용한 것으로 보입니다. 이 유사점은 카스퍼스키(Kaspersky)의 GhostContainer 백도어 분석 글에서 처음 언급되었습니다. ExchangeCmdPy와 마찬가지로, WEEPSTEEL은 아래와 같이 자신의 실행 결과를 합법적인 __VIEWSTATE
파라미터로 위장한 숨겨진 HTML 필드를 통해 전송합니다.
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPDwUKLTcyODc4{AES encrypted + base64 encoded output}" />
위협 행위자가 blocked.aspx
엔드포인트로 전송한 후속 HTTP POST 요청은 HTTP 200 "OK" 응답을 받았는데, 이는 앞서 언급된 형식의 출력을 포함했을 것으로 맨디언트는 평가합니다. 공격자가 서버와 지속적으로 상호 작용함에 따라, 맨디언트는 blocked.aspx
엔드포인트에 대한 HTTP POST 요청이 성공적으로 응답하는 것을 반복적으로 관찰했습니다.
거점 확보
성공적인 공격 이후, 위협 행위자는 IIS 워커 프로세스인 w3wp.exe
와 동일한 NETWORK SERVICE
권한을 획득했습니다. 이 접근 권한은 공격자가 추가적인 악성 활동을 수행하기 위한 시작점이 되었습니다.
구성 탈취 파일
위협 행위자는 Sitecore 콘텐츠 전달(CD) 인스턴스의 웹 루트인 \inetpub\sitecore\SitecoreCD\Website
의 내용을 압축하여 중요한 구성 파일들을 외부로 유출했습니다. 이 디렉터리에는 애플리케이션의 백엔드와 종속성에 대한 민감한 정보를 제공하는 web.config
와 같은 중요한 파일들이 포함되어 있었으며, 이는 공격 후 활동을 가능하게 하는 데 도움이 됩니다.
호스트 정찰
핵심 서버 구성 파일을 확보한 후, 위협 행위자는 실행 중인 프로세스, 서비스, 사용자 계정, TCP/IP 구성, 활성 네트워크 연결 등을 열거하는 것을 포함하여 호스트 및 네트워크 정찰을 통해 침해된 서버의 정보를 수집했습니다.
whoami
hostname
net user
tasklist
ipconfig /all
tasklist /svc
netstat -ano
nslookup <domain>
net group domain admins
net localgroup administrators
도구 준비(Staging)
위협 행위자는 공개 디렉터리(Public
) 중 Music
및 Video
와 같은 폴더를 도구 준비 및 배포 장소로 악용했습니다. Public
디렉터리에 작성된 파일은 다음과 같습니다
-
파일: C:\Users\Public\Music\7za.exe
-
설명: 7-Zip 파일 압축기의 커맨드라인 실행 파일
-
SHA-256: 223b873c50380fe9a39f1a22b6abf8d46db506e1c08d08312902f6f3cd1f7ac3
-
파일: C:\Users\Public\Music\lfe.ico
-
설명: SOCKS v5 서버를 갖춘 오픈소스 네트워크 터널링 도구,
EARTHWORM
으로 추적됨 -
SHA-256: b3f83721f24f7ee5eb19f24747b7668ff96da7dfd9be947e6e24a688ecc0a52b
-
파일: C:\Users\Public\Music\1.vbs
-
설명: 위협 행위자의 명령을 실행하는 데 사용되는 VBScript로, 그 내용은 원하는 행동에 따라 달라집니다.
-
SHA-256: <hash varies>
권한 상승
초기 침투에 성공한 위협 행위자는 접근 권한을 NETWORK SERVICE
에서 SYSTEM
또는 ADMINISTRATOR
수준으로 높였습니다.
이 과정에는 로컬 관리자 계정 생성과 도메인 관리자 계정 접근 권한 확보가 포함되었습니다. 맨디언트는 위협 행위자가 권한 상승을 위해 추가 도구들을 사용한 것을 확인했습니다.
로컬 관리자 계정 추가
asp$
: 위협 행위자는 권한 상승 도구를 이용해asp$
라는 이름의 로컬 관리자 계정을 생성했습니다. 일반적인 ASP.NET 서비스 계정 명명 규칙과 유사하게 접미사$
를 붙인 것은 탐지를 회피하고 정상적인 계정처럼 위장하려는 시도로 보입니다.
"C:\Users\Public\Music\helper.exe" "net user asp$ {REDACTED} /add"
"C:\Users\Public\Music\helper.exe" "net localgroup administrators asp$ /add"
sawadmin
: 이후 단계에서 위협 행위자는DWAGENT
원격 세션을 통해 두 번째 로컬 관리자 계정을 생성했습니다
net user sawadmin {REDACTED} /add
net localgroup administrators sawadmin /add
프로세스 토큰 탈취 시도
위협 행위자가 sawadmin
계정으로 GoToken.exe
라는 실행 파일을 다음 명령줄 인수를 사용해 실행한 것이 관찰되었습니다
GoToken.exe -h
GoToken.exe -l
GoToken.exe -ah
GoToken.exe -t
맨디언트는 서버에서 GoToken.exe
바이너리를 복구하지는 못했지만, 파일명과 인수를 통해 이 도구가 공개적으로 알려진 Go 기반의 토큰 탈취 도구인 GoTokenTheft일 가능성이 매우 높다고 판단했습니다. 이 도구는 시스템에 있는 다른 사용자의 보안 컨텍스트(security context)를 이용해 명령을 실행하도록 설계되었습니다.
이 도구의 공개된 소스 코드를 바탕으로, 공격자는 다음과 같은 행동을 시도했습니다.
-
h
: 도구의 도움말 메뉴 보기 -
l
: 모든 실행 중인 프로세스와 해당 사용자 토큰을 나열하여 가장(impersonation)할 대상을 식별 -
ah
: 시스템 계정을 제외한 다른 사용자의 토큰을 이용해 명령 실행 -
t
: 시스템에서 활성화된 모든 고유 사용자 토큰 나열
자격 증명 덤프
위협 행위자는 새로 생성한 두 계정을 이용해 호스트에 RDP
(원격 데스크톱 프로토콜)로 접속했으며, SYSTEM
및 SAM
레지스트리 하이브를 덤프했습니다. 비록 중복된 작업이지만, 이를 통해 공격자는 시스템의 로컬 사용자 계정 비밀번호 해시를 추출하는 데 필요한 정보를 확보했습니다.
asp$
reg save HKLM\SYSTEM c:\users\public\system.hive
reg save HKLM\SAM c:\users\public\sam.hive
sawadmin
reg save HKLM\SYSTEM SYSTEM.hiv
reg save HKLM\SAM SAM.hiv
지속적인 거점 유지
위협 행위자는 RDP
접근을 위해 생성 및 탈취한 관리자 계정을 모두 활용하여 지속적인 거점을 유지했습니다. 또한, 장기적인 계정 접근을 위해 특정 계정의 비밀번호 만료 설정을 비활성화하는 명령을 내렸습니다.
net user <AdminUser> /passwordchg:no /expires:never
wmic useraccount where name='<AdminUser>' set PasswordExpires=False
DWAGENT
도구는 이중화 및 지속적인 원격 접근을 위해 설치되었습니다.
RDP(원격 데스크톱 프로토콜)
공격자는 원격 데스크톱 프로토콜(RDP)을 광범위하게 사용했습니다. 이 트래픽은 보안 통제를 우회하고 활동을 감추기 위해 EARTHWORM
이 생성한 역방향 SOCKS 프록시를 통해 라우팅되었습니다. 한 RDP 세션에서 공격자는 asp$
계정 컨텍스트 하에 dwagent.exe
와 main.exe
라는 추가 공격 도구를 C:\Users\asp$\Downloads
에 다운로드했습니다.
원격 접속 도구: DWAGENT
DWAGENT
는 호스트를 원격으로 제어할 수 있게 해주는 합법적인 원격 접속 도구입니다. 이 도구는 SYSTEM
권한을 가진 서비스로 작동하며, 자동으로 시작되기 때문에 권한 상승 및 지속적인 접근을 보장합니다. DWAGENT
원격 세션 동안 공격자는 GoToken.exe
파일을 작성했습니다. 실행된 명령들을 볼 때, 이 도구가 레지스트리 하이브를 추출하는 데 도움을 주기 위해 사용된 것으로 추정됩니다.
표 2: File written in the DWAgent 원격 세션에서 작성된 파일
내부 정찰
Active Directory 정찰
DWAGENT 원격 세션 중, 위협 행위자는 타깃 네트워크 내의 도메인 컨트롤러(Domain Controller)를 식별하기 위한 명령어를 실행했습니다. 이후, 식별된 도메인 컨트롤러의 SYSVOL 공유에 접근하여 그룹 정책 개체(GPO) XML 파일에서 cpassword
를 검색했습니다.
nltest /DCLIST:<domain>
nslookup <domain-controller>
findstr /S /l cpassword
\\<domain-controller>\sysvol\dcext.local\policies\*.xml
SHARPHOUND
이후 공격자는 합법적인 관리자 계정을 이용해 새로운 RDP
세션으로 전환했습니다. 이 세션에서 Active Directory 보안 분석 플랫폼인 BLOODHOUND
의 데이터 수집 구성 요소인 SHARPHOUND
를 브라우저를 통해 다운로드하여 C:\Users\Public\Music\sh.exe
에 저장했습니다.
다운로드 후, 공격자는 DWAGENT
원격 세션으로 돌아와 sh.exe
를 실행하여 광범위한 Active Directory 정찰을 수행했습니다.
sh.exe -c all
정찰이 완료되자, 위협 행위자는 다시 RDP
세션(여전히 탈취한 관리자 계정 사용)으로 돌아와 SharpHound
의 결과물을 압축하여 외부로 유출할 준비를 했습니다.
C:\Program Files\7-Zip\7zFM.exe
"C:\Users\Public\Music\<number>_BloodHound.zip"
계정 정리
관리자 계정을 탈취한 후, 공격자는 이전에 생성했던 asp$
와 sawadmin
계정을 삭제했습니다. 이는 더 안정적이고 은밀한 접근 방식으로 전환했음을 시사합니다.
측면 이동
공격자는 탈취한 관리자 계정을 사용하여 다른 호스트에 RDP
로 접속했습니다. 이 시스템들에서 정찰을 계속하고 EARTHWORM
을 배포하는 명령을 실행했습니다.
한 호스트에서는 탈취한 관리자 계정으로 RDP
로그인한 후, 해당 계정의 권한으로 다음과 같은 내부 정찰 명령을 계속해서 수행했습니다.
quser
whoami
net user <AdminUser> /domain
nltest /DCLIST:<domain>
nslookup <domain-controller>
권장 사항
맨디언트는 ASP.NET 보안 모범 사례를 따를 것을 권장합니다. 여기에는 자동화된 머신 키 로테이션 구현, ViewState 메시지 인증 코드(MAC) 활성화, 그리고 web.config
파일 내의 모든 평문(plaintext) 비밀 정보 암호화가 포함됩니다. 보다 자세한 내용은 다음 자료들을 참고하십시오.
Sitecore에 대한 자세한 복구 지침은 공식 Sitecore 권고문 advisory SC2025-005를 참조하십시오.
침해 지표(Indicators of compromise)
다음 침해 지표들은 등록된 사용자를 위해 Google Threat Intelligence (GTI) 컬렉션에서 확인할 수 있습니다.
계정
파일 기반
네트워크 기반
탐지
구글 시큐리티 오퍼레이션(Google Security Operations)의 Enterprise 및 Enterprise+ 고객은 다음 위협 탐지 및 콘텐츠 업데이트를 활용하여 위협을 식별하고 해결할 수 있습니다. 모든 탐지 규칙은 맨디언트 프론트라인 위협(Mandiant Frontline Threats) 큐레이티드 탐지 규칙 세트를 통해 구글 시큐리티 오퍼레이션 테넌트에 자동으로 제공됩니다. 이 규칙들을 활용하려면 콘텐츠 허브(Content Hub)에 접속하여 위에서 언급된 문자열 중 하나를 검색한 다음, 구현하거나 수정하려는 각 규칙을 보고 관리할 수 있습니다.
-
Earthworm 터널링 지표
-
웹 서버 프로세스에 의해 생성된 사용자 계정
-
사용자 Music 폴더에서 명령을 실행하는 프로세스
-
Sharphound 정찰
-
비밀번호 만료 없는 사용자 생성 실행
-
웹 서버 프로세스에 의한 권한 있는 그룹 발견
YARA 룰
rule G_Recon_WEEPSTEEL_1 {
meta:
author = "Mandiant"
strings:
$v_w = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=" wide
$v_a = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value="
$v_b64_w = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=" base64wide
$v_b64_a = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=" base64
$s2 = "Services\\Tcpip\\Parameters" wide
$s3 = "GetOperatingSystemInformation"
$s4 = "GetSystemInformation"
$s5 = "GetNetworkAdapterInformation"
$s6 = "GetAllNetworkInterfaces"
$s7 = "GetIPProperties"
$s8 = "GetPhysicalAddress"
$s9 = "GetDomainNameFromRegistry"
$c1 = "Aes" fullword
$c2 = "CreateEncryptor" fullword
$c3 = "System.Security.Cryptography" fullword
$c4 = "ToBase64String" fullword
$guid = "6d5a95da-0ffe-4303-bb2c-39e182335a9f"
condition:
uint16(0) == 0x5a4d and
(
(all of ($c*) and 7 of ($s*)) or
($guid and (any of ($v*)))
)
}
rule G_Tunneler_EARTHWORM_1 {
meta:
author = "Mandiant"
strings:
$s1 = "free1.2"
$s2 = ".//xxx ([-options] [values])*"
$s3 = "You can create a lcx_listen tunnel like this :"
$s4 = ".//ew -s lcx_listen --listenPort 1080 --refPort 8888"
$s8 = "I_AM_NEW_RC_CMD_SOCK_CLIENT"
$s9 = "CONFIRM_YOU_ARE_SOCK_TUNNEL"
$s11 = "lcx_listen" fullword
$s12 = "call back cmd_socks ok"
$s13 = "lcx_tran" fullword
$s14 = "lcx_slave" fullword
$s15 = "rssocks" fullword
$s16 = "ssocksd" fullword
$s17 = "rcsocksd" fullword
$marker1= "earthworm" nocase ascii wide
$marker2 = "rootkiter" nocase ascii wide
condition:
((uint16(0) == 0x5a4d and uint32(uint32(0x3C)) == 0x00004550) or uint32(0) == 0x464c457f or (uint32(0) == 0xBEBAFECA or uint32(0) == 0xFEEDFACE or uint32(0) == 0xFEEDFACF or uint32(0) == 0xCEFAEDFE)) and
(4 of ($s*) or all of ($marker*))
}
감사의 글
이번 조사 과정에서 지원을 아끼지 않은 Sitecore 팀에 깊이 감사드립니다. 또한, 페이로드 분석을 도와주신 Tom Bennett와 Nino Isakovic에게도 감사드립니다. 아울러, 귀중한 의견과 기술 검토를 제공해 주신 Richmond Liclican와 Tatsuhiko Ito에게도 감사드립니다.