hacktricks/crypto-and-stego/padding-oracle-priv.md

8.6 KiB
Raw Blame History

Dolgu Oracle

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

HackTricks'ı desteklemenin diğer yolları:

CBC - Cipher Block Chaining

CBC modunda önceki şifrelenmiş blok IV olarak kullanılır ve bir sonraki blokla XOR işlemi yapılır:

https://defuse.ca/images/cbc_encryption.png

CBC'yi şifrelemek için şifreleme anahtarı ve IV kullanılır.

Mesaj Dolgusu

Şifreleme sabit boyutlu bloklarda gerçekleştirildiği için genellikle son bloğu tamamlamak için dolgu gereklidir.
Genellikle PKCS7 kullanılır, bu da bloğu tamamlamak için gereken bayt sayısını tekrarlayan bir dolgu oluşturur. Örneğin, son blokta 3 bayt eksikse, dolgu \x03\x03\x03 olacaktır.

8 baytlık 2 blok uzunluğundaki daha fazla örneğe bakalım:

bayt #0 bayt #1 bayt #2 bayt #3 bayt #4 bayt #5 bayt #6 bayt #7 bayt #0 bayt #1 bayt #2 bayt #3 bayt #4 bayt #5 bayt #6 bayt #7
P A S S W O R D 1 2 3 4 5 6 0x02 0x02
P A S S W O R D 1 2 3 4 5 0x03 0x03 0x03
P A S S W O R D 1 2 3 0x05 0x05 0x05 0x05 0x05
P A S S W O R D 0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08

Son örnekte son bloğun dolu olduğuna dikkat edin, bu yüzden sadece dolgu ile başka bir blok oluşturuldu.

Dolgu Oracle

Bir uygulama şifrelenmiş verileri şifre çözme işleminden sonra dolgu kaldırır. Dolgu temizliği sırasında geçersiz bir dolgu algılanabilir bir davranışı tetiklerse, bir dolgu oracle zafiyeti oluşur. Algılanabilir davranış bir hata, sonuçların eksikliği veya daha yavaş bir yanıt olabilir.

Bu davranışı tespit ederseniz, şifrelenmiş verileri şifre çözebilir ve hatta herhangi bir açık metni şifreleyebilirsiniz.

Sömürü Nasıl Yapılır

Bu tür bir zafiyeti sömürmek için https://github.com/AonCyberLabs/PadBuster kullanabilir veya sadece yapabilirsiniz

sudo apt-get install padbuster

Bir sitenin çerezinin savunmasız olup olmadığını test etmek için şunları deneyebilirsiniz:

perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="

Kodlama 0, base64'ün kullanıldığı anlamına gelir (ancak diğerleri de mevcuttur, yardım menüsünü kontrol edin).

Bu zafiyeti yeni verileri şifrelemek için de kötüye kullanabilirsiniz. Örneğin, çerezin içeriğinin "user=MyUsername**" olduğunu varsayalım, sonra bunu "_user=administrator_" olarak değiştirebilir ve uygulama içinde ayrıcalıkları yükseltebilirsiniz. Ayrıca, -plaintext parametresini belirterek bunu paduster kullanarak da yapabilirsiniz:

perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"

Eğer site savunmasızsa, padbuster otomatik olarak dolgu hatası oluştuğunda bulmaya çalışacaktır, ancak ayrıca hata mesajını da -error parametresini kullanarak belirtebilirsiniz.

perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"

Teori

Özetle, farklı doldurma değerlerini oluşturmak için doğru değerleri tahmin ederek şifrelenmiş verilerin şifresini çözmeye başlayabilirsiniz. Ardından, doldurma oracle saldırısı, 1, 2, 3 vb. doldurma oluşturan doğru değeri tahmin ederek baytları baştan sona doğru şifresini çözmeye başlayacaktır.

E0'dan E15'e kadar olan baytlar tarafından oluşturulan 2 bloktan oluşan bazı şifreli metinleriniz olduğunu hayal edin.
Son bloğu (E8 ile E15 arası) çözmek için, tüm blok "blok şifre çözme" işleminden geçer ve ara baytlar I0'dan I15'e oluşturur.
Son olarak, her ara bayt önceki şifrelenmiş baytlarla (E0'dan E7'ye) XOR edilir. Yani:

  • C15 = D(E15) ^ E7 = I15 ^ E7
  • C14 = I14 ^ E6
  • C13 = I13 ^ E5
  • C12 = I12 ^ E4
  • ...

Şimdi, C15'in 0x01 olduğu E7'yi değiştirmek mümkün olacak, bu da doğru bir doldurma olacaktır. Yani, bu durumda: \x01 = I15 ^ E'7

Bu yüzden, E'7 bulunduğunda, I15 hesaplanabilir: I15 = 0x01 ^ E'7

Bu bize C15'i hesaplama olanağı sağlar: C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7

C15 bilindiğinde, şimdi C14 hesaplanabilir, ancak bu sefer \x02\x02 doldurması için brute-force yapılması gerekmektedir.

Bu BF, öncekine benzer karmaşıktır çünkü 0x02 değerine sahip E''15'i hesaplamak mümkündür: E''7 = \x02 ^ I15 bu yüzden sadece **C140x02'ye eşit olan E'14'ü bulmak gerekmektedir.
Sonra, C14'ü şifrelemek için aynı adımları uygulayın: C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6

Tüm şifreli metni çözmek için bu zinciri takip edin.

Zafiyetin Tespiti

Bir hesap kaydedin ve bu hesapla oturum açın.
Eğer birçok kez oturum açarsanız ve her zaman aynı çerezi alırsanız, uygulamada muhtemelen bir sorun var demektir. Geri gönderilen çerez her seferinde benzersiz olmalıdır. Eğer çerez her zaman aynı ise, muhtemelen her zaman geçerli olacak ve geçersiz kılacak bir yol olmayacaktır.

Şimdi, çerezi değiştirmeyi denerseniz, uygulamadan bir hata aldığınızı görebilirsiniz.
Ancak, doldurmayı BF yaparsanız (örneğin padbuster kullanarak), farklı bir kullanıcı için geçerli başka bir çerez elde edebilirsiniz. Bu senaryo büyük olasılıkla padbuster'a karşı savunmasızdır.

Referanslar

Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları: