Ret2lib
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:
Eğer ASLR'nin libc adresini değiştirip değiştirmediğini kontrol etmek istiyorsanız şunu yapabilirsiniz:
Kullanılan libc bilindiğinde,
system
işlevine olan ofseti bulmak da mümkündür:
Kullanılan libc bilindiğinde,
/bin/sh
dizesinin işlevine olan ofseti bulmak da mümkündür:
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:
/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 ROPVe bunun için bir pwntools şablonunu bulabilirsiniz:
pageLeaking libc - template2 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):
Uzak bir sunucuyu hedef alıyorsanız,
libc
fonksiyonuusleep
'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:
x86 Ret2lib Kod Örneği
Bu örnekte ASLR brute-force kod içine entegre edilmiş ve zafiyetli ikili dosya uzak bir sunucuda bulunmaktadır:
x64 Ret2lib Kod Örneği
Örneği kontrol etmek için:
pageROP - Return Oriented ProgramingARM64 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 - arm64Printf'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):
Diğer Örnekler ve Referanslar
Ret2lib, libc'teki bir işlevin adresine sızıntı verildiğinde, tek bir araç kullanarak
64 bit, ASLR etkin ancak PIE etkin değil, ilk adım bir taşma oluşturup canary'nin 0x00 baytına kadar doldurmak ve ardından puts'u çağırıp sızdırmaktır. Canary ile puts'un GOT'tan adresini sızdırmak için bir ROP aracı oluşturulur ve ardından
/bin/sh
adresiylesystem('/bin/sh')
çağırmak için bir ROP aracı oluşturulur.64 bit, ASLR etkin, canary yok, ana fonksiyonda bir çocuk fonksiyonundan yığın taşması. Puts'u çağırmak için ROP aracı oluşturup GOT'tan puts'un adresini sızdırmak ve ardından bir ROP aracı çağırmak için ROP aracı oluşturulur.
64 bit, pie yok, canary yok, relro yok, nx. Write işlevini kullanarak write (libc) adresini sızdırmak ve bir araç çağırmak için kullanır.
Stack'ten canary'yi sızdırmak için bir format dizesi kullanır ve bir taşma oluşturarak system'i (GOT'ta)
/bin/sh
adresiyle çağırmak için bir araç oluşturur.32 bit, relro yok, canary yok, nx, pie. Bir sızıntı oluşturmak için kötü bir dizinlemeyi kötüye kullanır ve yığından libc ve heap adreslerini sızdırmak için kötüye kullanır. Buffer taşmasını kötüye kullanarak
system('/bin/sh')
çağırmak için ret2lib yapar (bir kontrolü atlamak için heap adresine ihtiyaç vardır).
Last updated