ASLR
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Adres Alanı Düzeni Rastgeleleştirme (ASLR), işletim sistemlerinde kullanılan bir güvenlik tekniğidir ve sistem ve uygulama süreçleri tarafından kullanılan bellek adreslerini rastgeleleştirir. Bu sayede, bir saldırganın belirli süreçlerin ve verilerin, örneğin yığın, yığın bellek ve kütüphaneler gibi, konumunu tahmin etmesini önemli ölçüde zorlaştırır ve böylece belirli türdeki istismarları, özellikle de tampon taşmalarını azaltır.
Bir Linux sisteminde ASLR durumunu kontrol etmek için, /proc/sys/kernel/randomize_va_space
dosyasındaki değeri okuyabilirsiniz. Bu dosyada saklanan değer, uygulanan ASLR türünü belirler:
0: Rastgeleleştirme yok. Her şey statik.
1: İhtiyatlı rastgeleleştirme. Paylaşılan kütüphaneler, yığın, mmap(), VDSO sayfası rastgeleleştirilmiştir.
2: Tam rastgeleleştirme. İhtiyatlı rastgeleleştirme ile rastgeleleştirilen unsurlara ek olarak, brk()
ile yönetilen bellek rastgeleleştirilmiştir.
ASLR durumunu kontrol etmek için aşağıdaki komutu kullanabilirsiniz:
ASLR'yi devre dışı bırakmak için /proc/sys/kernel/randomize_va_space
değerini 0 olarak ayarlarsınız. ASLR'yi devre dışı bırakmak, genellikle test veya hata ayıklama senaryoları dışında önerilmez. İşte bunu nasıl yapabileceğiniz:
ASLR'yi bir yürütme için devre dışı bırakmak için de şunu kullanabilirsiniz:
ASLR'yi etkinleştirmek için, /proc/sys/kernel/randomize_va_space
dosyasına 2 değerini yazabilirsiniz. Bu genellikle root ayrıcalıkları gerektirir. Tam rastgeleleştirme, aşağıdaki komutla yapılabilir:
echo
komutlarıyla yapılan değişiklikler geçicidir ve yeniden başlatıldığında sıfırlanı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 gerekir:
Değişiklikleri uygulamak için /etc/sysctl.conf
dosyasını düzenledikten sonra:
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()
ile tahsis edilen bellek ve paylaşılan kütüphaneler —> 16 bit, delta_mmap
olarak adlandırılır.
Yığın —> 24 bit, delta_stack
olarak adlandırılır. Ancak, etkili olarak 11 bit kullanır (10. byte'dan 20. byte'a kadar dahil), 16 byte hizalıdır —> Bu, 524,288 olası gerçek yığın adresi ile sonuçlanır.
Önceki veriler 32-bit sistemler içindir ve azaltılmış nihai entropi, istismar başarılı bir şekilde tamamlanana kadar yürütmeyi tekrar tekrar denemek suretiyle ASLR'yi atlatmayı mümkün kılar.
Eğer shellcode'dan önce büyük bir NOP sled barındıracak kadar büyük bir taşma varsa, yığında adresleri brute-force yaparak akışın NOP sled'in bir kısmının üzerinden atlamasını sağlayabilirsiniz.
Taşma o kadar büyük değilse ve istismar yerel olarak çalıştırılabiliyorsa, NOP sled ve shellcode'u bir ortam değişkenine eklemek mümkündür.
Eğer istismar yerel ise, libc'nin temel adresini brute-force yapmayı deneyebilirsiniz (32bit sistemler için yararlıdır):
Uzak bir sunucuya saldırıyorsanız, usleep
fonksiyonunun libc
adresini brute-force etmeyi deneyebilirsiniz, argüman olarak 10 (örneğin) geçerek. Eğer bir noktada sunucu yanıt vermek için 10 saniye daha alıyorsa, bu fonksiyonun adresini buldunuz.
64 bit sistemlerde entropi çok daha yüksektir ve bu mümkün olmamalıdır.
Yığın üzerinde çevresel değişkenlerle büyük bir alanı kaplamak ve ardından bunu yerel olarak yüzlerce/binlerce kez istismar etmeye çalışmak mümkündür. Aşağıdaki kod, yığında sadece bir adres seçmenin nasıl mümkün olduğunu ve her yüzlerce çalıştırmadan o adresin NOP talimatını içereceğini göstermektedir:
/proc/[pid]/stat
)Bir sürecin /proc/[pid]/stat
dosyası her zaman herkes tarafından okunabilir ve ilginç bilgiler içerir, örneğin:
startcode & endcode: İkili dosyanın TEXT'inin üstünde ve altında bulunan adresler
startstack: stack'in başlangıç adresi
start_data & end_data: BSS'nin üstünde ve altında bulunan adresler
kstkesp & kstkeip: Mevcut ESP ve EIP adresleri
arg_start & arg_end: cli argümanlarının üstünde ve altında bulunan adresler.
env_start &env_end: env değişkenlerinin üstünde ve altında bulunan adresler.
Bu nedenle, eğer saldırgan, istismar edilen ikili dosyanın bulunduğu bilgisayarda ise ve bu ikili dosya ham argümanlardan taşmayı beklemiyorsa, ancak bu dosyayı okuduktan sonra oluşturulabilecek farklı bir girdi üzerinden bekliyorsa, bir saldırganın bu dosyadan bazı adresleri alması ve bunlardan istismar için ofsetler oluşturması mümkündür.
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 leak vermektir
Eğer size bir leak verilirse (kolay CTF zorlukları), ondan ofsetleri hesaplayabilirsiniz (örneğin, istismar ettiğiniz sistemde kullanılan tam libc sürümünü bildiğinizi varsayarsak). Bu örnek istismar, buradan alınmıştır (daha fazla ayrıntı için o sayfaya bakın):
ret2plt
Bir buffer overflow kullanarak, bir ret2plt'yi istismar etmek, libc'den bir fonksiyonun adresini dışarı sızdırmak mümkün olacaktır. Kontrol et:
Ret2pltFormat Strings Arbitrary Read
ret2plt'de olduğu gibi, eğer bir format string zafiyeti aracılığıyla rastgele bir okuma varsa, GOT'dan bir libc fonksiyonu adresini dışarı sızdırmak mümkündür. Aşağıdaki örnek buradan:
You can find more info about Format Strings arbitrary read in:
Format StringsASLR'yi atlatmak için yığın içindeki adresleri kullanmayı deneyin:
Ret2ret & Reo2popvsyscall
mekanizması, belirli sistem çağrılarının kullanıcı alanında yürütülmesine izin vererek performansı artırmayı amaçlar, ancak bunlar temelde çekirdek parçasıdır. vsyscall'ların kritik avantajı, ASLR'ye (Adres Alanı Düzeni Rastgeleleştirme) tabi olmayan sabit adresler olmalarıdır. Bu sabit yapı, saldırganların adreslerini belirlemek ve bunları bir istismar için kullanmak amacıyla bir bilgi sızıntısı açığına ihtiyaç duymadıkları anlamına gelir.
Ancak burada çok ilginç gadget'lar bulunmayacaktır (örneğin, bir ret;
eşdeğeri almak mümkündür)
(Aşağıdaki örnek ve kod bu yazıdan alınmıştır)
Örneğin, bir saldırgan bir istismar içinde 0xffffffffff600800
adresini kullanabilir. Doğrudan bir ret
talimatına atlamaya çalışmak, birkaç gadget'ı yürüttükten sonra kararsızlığa veya çökmesine yol açabilirken, vsyscall bölümünden sağlanan bir syscall
'ın başlangıcına atlamak başarılı olabilir. Bu vsyscall adresine yürütmeyi yönlendiren dikkatlice yerleştirilmiş bir ROP gadget'ı ile, bir saldırgan bu istismar parçası için ASLR'yi atlatmadan kod yürütme elde edebilir.
Bu nedenle, vdso'yu kötüye kullanarak ASLR'yi atlamak mümkün olabileceğini unutmayın, eğer çekirdek CONFIG_COMPAT_VDSO ile derlenmişse, çünkü vdso adresi rastgeleleştirilmeyecek. Daha fazla bilgi için kontrol edin:
Ret2vDSOAWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)