ASLR
Last updated
AWS Hacking öğrenin ve uygulayın:HackTricks Eğitimi AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking öğrenin ve uygulayın: HackTricks Eğitimi GCP Kırmızı Takım Uzmanı (GRTE)
Adres Alanı Düzeni Rastgeleleştirme (ASLR), işletim sistemlerinde kullanılan bir güvenlik tekniğidir ve sistem ve uygulama süreçlerinin kullandığı bellek adreslerini rastgeleleştirir. Böyle yaparak, belirli süreçlerin ve verilerin konumunu, özellikle yığın, bellek havuzu ve kütüphaneleri tahmin etmeyi önemli ölçüde zorlaştırarak, belirli türdeki saldırıları, özellikle tampon taşmalarını azaltır.
Linux sistemlerinde ASLR durumunu kontrol etmek için, ASLR'nin uygulandığı türü belirlemek için /proc/sys/kernel/randomize_va_space
dosyasından değeri okuyabilirsiniz:
0: Rastgeleleştirme yok. Her şey statiktir.
1: Muhafazakar rastgeleleştirme. Paylaşılan kütüphaneler, yığın, mmap(), VDSO sayfası rastgeleleştirilir.
2: Tam rastgeleleştirme. Muhafazakar rastgeleleştirme tarafından rastgeleleştirilen öğelerin yanı sıra brk()
ile yönetilen bellek rastgeleleştirilir.
ASLR durumunu aşağıdaki komutla kontrol edebilirsiniz:
ASLR'yi devre dışı bırakmak için /proc/sys/kernel/randomize_va_space
değerini 0 olarak ayarlarsınız. ASLR'nin devre dışı bırakılması genellikle test veya hata ayıklama senaryoları dışında önerilmez. İşte nasıl devre dışı bırakılacağı:
Ayrıca, bir yürütme için ASLR'yi devre dışı bırakabilirsiniz:
ASLR'yi etkinleştirmek için, genellikle kök izinleri gerektiren /proc/sys/kernel/randomize_va_space
dosyasına 2 değerini yazabilirsiniz. Tam rasgeleleştirme ise aşağıdaki komutla yapılabilir:
echo
komutları ile yapılan değişiklikler geçicidir ve yeniden başlatıldığında sıfırlanacaktır. Değişikliği kalıcı hale getirmek için /etc/sysctl.conf
dosyasını düzenlemeniz ve aşağıdaki satırı eklemeniz veya değiştirmeniz gerekmektedir:
/etc/sysctl.conf
dosyasını düzenledikten sonra değişiklikleri uygulamak için:
Bu, ASLR ayarlarınızın yeniden başlatmalar arasında kalmasını sağlayacaktır.
PaX işlem adres alanını 3 gruba ayırır:
Kod ve veri (başlatılmış ve başlatılmamış): .text
, .data
ve .bss
—> delta_exec
değişkeninde 16 bit entropi. Bu değişken her işlemle rastgele başlatılır ve başlangıç adreslerine eklenir.
mmap()
tarafından ayrılan Bellek ve paylaşılan kütüphaneler —> 16 bit, delta_mmap
adı verilir.
Yığın —> 24 bit, delta_stack
olarak adlandırılır. Ancak, etkili olarak 11 bit kullanır (10. ile 20. bayt arasında dahil), 16 bayt'a hizalanmıştır —> Bu, 524,288 olası gerçek yığın adresine yol açar.
Önceki veriler 32 bit sistemler içindir ve azaltılmış son entropi, saldırı başarılı bir şekilde tamamlanana kadar işlemi tekrar tekrar deneyerek ASLR'yi atlatmayı mümkün kılar.
Kabul edilebilir büyüklükte bir taşma varsa ve kabuk kodundan önce büyük bir NOP kaydı barındırabilirseniz, yığında adresleri kaba kuvvetle deneyebilir ve akışın NOP kaydının bir kısmının üzerinden atlamasını sağlayabilirsiniz.
Taşma o kadar büyük değilse ve saldırı yerel olarak çalıştırılabilirse, NOP kaydını ve kabuk kodunu bir ortam değişkenine eklemek mümkündür.
Saldırı yerel ise, libc'nin temel adresini kaba kuvvetle deneyebilirsiniz (32 bit sistemler için faydalıdır):
Uzak bir sunucuyu hedef alıyorsanız, libc
fonksiyonu usleep
'in adresini 10 (örneğin) olarak argüman geçerek brute-force yapabilirsiniz. Eğer sunucu cevap vermek için 10 saniye daha fazla zaman alıyorsa, bu fonksiyonun adresini buldunuz demektir.
64 bit sistemlerde entropi çok daha yüksektir ve bu mümkün olmamalıdır.
Çevresel değişkenlerle yığının büyük bir kısmını işgal etmek mümkündür ve ardından binayı yüzlerce/binlerce kez yerel olarak kötüye kullanmak için deneme yapılabilir. Aşağıdaki kod, yığında sadece bir adres seçmenin mümkün olduğunu ve her birkaç yüz çalıştırmada bu adresin NOP talimatını içereceğini göstermektedir:
/proc/[pid]/stat
)Bir işlemin /proc/[pid]/stat
dosyası her zaman herkes tarafından okunabilir ve içerisinde şu gibi ilginç bilgiler bulunur:
startcode & endcode: BINARY'nin TEXT kısmının üstünde ve altındaki adresler
startstack: Stack'in başlangıç adresi
start_data & end_data: BSS'nin üstünde ve altındaki adresler
kstkesp & kstkeip: Mevcut ESP ve EIP adresleri
arg_start & arg_end: cli argümanlarının üstünde ve altındaki adresler
env_start & env_end: Çevre değişkenlerinin üstünde ve altındaki adresler
Bu nedenle, saldırgan, söz konusu binary'nin taşmadan beklenmedik bir girişten değil, bu dosyayı okuduktan sonra oluşturulabilecek farklı bir girişten kaynaklanması durumunda ve saldırgan, bu dosyadan bazı adresleri alıp bunlardan exploit için ofsetler oluşturabilir.
Bu dosya hakkında daha fazla bilgi için https://man7.org/linux/man-pages/man5/proc.5.html adresinde /proc/pid/stat
araması yapın.
Zorluk, bir sızıntı vermek
Eğer bir sızıntı verilirse (kolay CTF zorlukları), bu sızıntılardan ofsetler hesaplayabilirsiniz (örneğin, söz konusu sistemin kullandığı kesin libc sürümünü bildiğinizi varsayarsak). Bu örnek exploit, buradaki örneğin çıkarımıdır (daha fazla ayrıntı için o sayfaya bakın):
ret2plt
Tampon taşması kullanılarak ret2plt'yi istismar etmek, bir libc fonksiyonunun adresini dışarı sızdırmak mümkün olacaktır. Kontrol edin:
Format Strings Arbitrary Read
Ret2plt'de olduğu gibi, bir format dizileri zafiyeti aracılığıyla keyfi okuma yetkiniz varsa, GOT'dan bir libc fonksiyonunun adresini dışarı sızdırmak mümkündür. Aşağıdaki örnek buradan alınmıştır:
Format Strings arbitrary read hakkında daha fazla bilgiyi aşağıda bulabilirsiniz:
Stack içindeki adresleri istismar ederek ASLR'yi atlamayı deneyin:
vsyscall
mekanizması, belirli sistem çağrılarının çekirdek parçası olmalarına rağmen kullanıcı alanında yürütülmesine izin vererek performansı artırmayı amaçlar. vsyscalls'ın kritik avantajı, ASLR'ye (Adres Alanı Düzeni Rastgeleleştirme) tabi olmayan sabit adreslerinde yatmaktadır. Bu sabit doğa, saldırganların adreslerini belirlemek ve bir saldırıda kullanmak için bir bilgi sızıntısı zafiyetine ihtiyaç duymamaları anlamına gelir.
Ancak, burada çok ilginç araçlar bulunmayacaktır (örneğin bir ret;
eşdeğeri alınabilir)
(Örnek ve kod bu yazıdan alınmıştır)
Örneğin, bir saldırgan, bir saldırıda 0xffffffffff600800
adresini kullanabilir. Bir ret
talimatına doğrudan atlamaya çalışmak, birkaç araç yürütüldükten sonra kararsızlığa veya çökmelere yol açabilirken, vsyscall bölümü tarafından sağlanan bir syscall
'ın başına atlamak başarılı olabilir. Bir ROP aracını dikkatlice yerleştirerek bu vsyscall adresine yürütmeyi yönlendiren bir saldırgan, bu saldırının bu kısmı için ASLR'yi atlamaya gerek duymadan kod yürütme başarısına ulaşabilir.
Bu nedenle, kernel CONFIG_COMPAT_VDSO ile derlenmişse vdso'nun adresi rastgele olmayacağından ASLR'yi atlayabilirsiniz. Daha fazla bilgi için şuraya bakın: