Ret2lib
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:
Eğer ASLR'ın 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, system fonksiyonunun, exit fonksiyonunun ve /bin/sh
dizesinin adresini almak için Peda veya GEF kullanmak da mümkündür:
/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 ROPVe bunun için bir pwntools şablonunu şurada bulabilirsiniz:
Leaking 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 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):
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
Yalnızca bir belirli adrese atlayarak bir kabuk çalıştırın libc içinde:
One Gadgetx86 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:
ROP - 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:
Ret2lib + 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 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):
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 yok, 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 fonksiyondan 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 araç çağırmak.
64 bit, pie yok, canary yok, relro yok, nx. Write işlevini kullanarak write'un adresini (libc) sızdırmak ve tek bir araç çağırmak için kullanır.
Yığın üzerinden canary'yi sızdırmak için bir format dizesi kullanır ve sistem çağrısına (GOT'ta)
/bin/sh
adresiyle birlikte bir taşma oluşturmak için bir aşırı taşma kullanır.32 bit, relro yok, canary yok, nx, pie. Bir kötü dizinlemeyi kötüye kullanarak yığından libc ve heap adreslerini sızdırmak. Bir taşma oluşturmak için bir ROP aracı kullanarak
system('/bin/sh')
çağrısı yapar (bir kontrolü atlamak için heap adresine ihtiyaç vardır).
Last updated