Ret2lib
Last updated
Last updated
AWS Hacking'ı öğrenin ve uygulayın: HackTricks Eğitimi AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'ı öğrenin ve uygulayın: HackTricks Eğitimi GCP Kırmızı Takım Uzmanı (GRTE)
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.
Ç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
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:
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:
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)
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:
Ve bunun için bir pwntools şablonunu şurada bulabilirsiniz:
https://libc.blukat.me/ sayfasını kontrol edin ve libc içindeki fonksiyonların bir çift adresini kullanarak kullanılan sürümü bulun.
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
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.
Yalnızca bir belirli adrese atlayarak bir kabuk çalıştırın libc içinde:
Bu örnekte ASLR brute-force kod içine entegre edilmiş ve zafiyetli ikili dosya uzak bir sunucuda bulunmaktadır:
Örneği kontrol etmek için:
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:
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.
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):
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
adresiyle system('/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).