Stack Canaries

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

HackTricks'ı desteklemenin diğer yolları:

StackGuard ve StackShield

StackGuard, tampon taşmalarına karşı koruma sağlamak için EIP (Genişletilmiş Komut İşaretçisi)'den önce özel bir değer olan canary ekler. Özellikle 0x000aff0d (null, newline, EOF, carriage return'ü temsil eder). Ancak, recv(), memcpy(), read() ve bcopy() gibi işlevler savunmasız kalır ve EBP (Taban İşaretçisi)'ni korumaz.

StackShield, tüm dönüş adreslerini (EIP'ler) depolayan bir Global Return Stack'i koruyarak StackGuard'dan daha sofistike bir yaklaşım benimser. Bu yapı, taşmaların zarar vermemesini sağlar, çünkü depolanan ve gerçek dönüş adresleri arasında karşılaştırma yaparak taşma olaylarını tespit etmeyi sağlar. Ayrıca, StackShield, EIP'nin beklenen veri alanının dışına işaret ettiğini tespit etmek için dönüş adresini bir sınır değeriyle karşılaştırabilir. Bununla birlikte, Return-to-libc, ROP (Return-Oriented Programming) veya ret2ret gibi tekniklerle bu koruma atlatılabilir, bu da StackShield'ın yerel değişkenleri korumadığını gösterir.

Stack Smash Koruyucu (ProPolice) -fstack-protector:

Bu mekanizma, EBP'den önce bir canary yerleştirir ve tamponların diğer değişkenleri üzerine yazmasını önlemek için yerel değişkenleri yeniden düzenler, tamponları daha yüksek bellek adreslerine yerleştirir. Ayrıca, yığına geçirilen argümanları güvenli bir şekilde kopyalar ve bu kopyaları argüman olarak kullanır. Bununla birlikte, 8'den az öğeye sahip dizileri veya kullanıcının yapısındaki tamponları korumaz.

Canary, /dev/urandom kaynaklı rastgele bir sayı veya varsayılan değeri olan 0xff0a0000'den türetilen rastgele bir sayıdır. TLS (İş Parçacığı Yerel Depolama)'da saklanır ve iş parçacıkları arasında paylaşılan bellek alanlarının iş parçacığına özgü küresel veya statik değişkenlere sahip olmasını sağlar. Bu değişkenler başlangıçta ebeveyn süreçten kopyalanır ve çocuk süreçler verilerini değiştirebilir ancak ebeveyni veya kardeşleri etkilemez. Bununla birlikte, yeni bir canary oluşturmadan fork() kullanılırsa, tüm süreçler (ebeveyn ve çocuklar) aynı canary'yi paylaşır, bu da onu savunmasız hale getirir. i386 mimarisinde canary gs:0x14'te, x86_64'te ise fs:0x28'de saklanır.

Bu yerel koruma, saldırılara açık tamponlara sahip işlevleri tanımlar ve bu işlevlerin başına canary yerleştirmek ve bütünlüğünü doğrulamak için bu işlevlerin başına kod enjekte eder.

Bir web sunucusu fork() kullandığında, canary'yi byte byte tahmin etmek için kaba kuvvet saldırısını etkinleştirir. Ancak, fork()'ten sonra execve() kullanarak hafıza alanını üzerine yazarak saldırıyı etkisiz hale getirebilirsiniz. vfork(), çocuk sürecin yazma girişiminde bulunana kadar çoğaltma yapmadan çalışmasına izin verir, bu noktada bir kopya oluşturulur ve işlem oluşturma ve bellek işleme için farklı bir yaklaşım sunar.

Uzunluklar

x64 ikili dosyalarında, canary çerezi bir 0x8 bayt qword'dür. İlk yedi bayt rastgele ve son bayt bir null bayttır.

x86 ikili dosyalarında, canary çerezi bir 0x4 bayt dword'dür. İlk üç bayt rastgele ve son bayt bir null bayttır.

Her iki canary'nin en anlamlı baytı bir null bayttır çünkü daha düşük adreslerden gelen yığındaki ilk bayt olacak ve bu nedenle dizeleri okuyan işlevler onu okumadan duracak.

Atlatmalar

Canary'yi sızdırmak ve ardından (örneğin tampon taşması ile) kendi değeriyle üzerine yazmak.

  • Çocuk süreçlerde canary çatallanırsa, bir byte'ı bir seferde kaba kuvvetle tahmin etmek mümkün olabilir:

  • İkili dosyada ilginç bir sızıntı veya keyfi okuma açığı varsa, sızdırmak mümkün olabilir:

  • Yığına depolanan işaretçileri üzerine yazma

Yığına taşma açığı olan yığın, yığın canary'sine ulaşmadan zafiyeti sömürmek için üzerine yazılabilecek dize veya işlev adresleri içerebilir. Kontrol edin:

  • Hem ana hem de iş parçacığı canary'sini değiştirme

Canary ile korunan bir iş parçacığında tampon taşması, iş parçacığının ana canary'sini değiştirmek için kullanılabilir. Sonuç olarak, denetim iki değiştirilmiş canary ile yapıldığından koruma işe yaramaz.

Ayrıca, canary ile korunan bir işlevde tampon taşması, TLS'de saklanan ana canary'yi değiştirmek için kullanılabilir. Bu, iş parçacığının yığınında bir taşma aracılığıyla TLS'nin saklandığı bellek konumuna ulaşmak mümkün olabileceği için mümkündür. Sonuç olarak, denetim iki değiştirilmiş canary ile yapıldığından koruma işe yaramaz. Bu saldırı, http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads yazısında gerçekleştirilir.

Ayrıca, genellikle TLS'nin mmap tarafından saklandığını ve bir iş parçacığının yığını oluşturulduğunda bunun da mmap tarafından oluşturulduğunu belirten https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 sunumuna bakın, bu da önceki yazıda gösterildiği gibi taşmaya izin verebilir.

  • __stack_chk_fail'in GOT girişini değiştirme

İkili dosyanın Kısmi RELRO'ya sahip olması durumunda, GOT girişini __stack_chk_fail'in bir programı engellemediği sahte bir işlev olacak şekilde değiştirmek için keyfi yazma kullanabilirsiniz.

Bu saldırı, https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/ yazısında gerçekleştirilir.

Referanslar

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

HackTricks'ı desteklemenin diğer yolları:

Last updated