Ret2lib
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Ret2Libc'in özü, bir zayıf programın yürütme akışını, saldırgan tarafından sağlanan shellcode'u yığın üzerinde çalıştırmak yerine, bir paylaşılan kütüphanedeki (örneğin, system, execve, strcpy) bir işleve yönlendirmektir. Saldırgan, yığın üzerindeki dönüş adresini istenen kütüphane işlevine işaret edecek şekilde değiştiren bir yük oluşturur ve çağrı konvansiyonuna göre gerekli argümanların doğru bir şekilde ayarlandığından emin olur.
Çağrılacak işlevin adresini (örneğin, system) ve çağrılacak komutu (örneğin, /bin/sh) alın
İlk argümanı komut dizesine işaret edecek şekilde geçmek ve yürütme akışını işleve yönlendirmek için bir ROP zinciri oluşturun
Kullanılan libc
'nin mevcut makineden olduğunu varsayarsak, bellekte nerede yükleneceğini bulmak için:
Eğer ASLR'nin libc'nin adresini değiştirip değiştirmediğini kontrol etmek istiyorsanız şunu yapabilirsiniz:
Kullanılan libc'yi bilmek, system
fonksiyonuna olan ofseti bulmayı da mümkün kılar:
Kullanılan libc'yi bilmek, /bin/sh
fonksiyonuna olan ofseti bulmayı da mümkün kılar:
Kullanılan libc'yi bilmek, system fonksiyonunun, exit fonksiyonunun ve /bin/sh
dizesinin adresini almak için Peda veya GEF kullanmayı da mümkün kılar:
Eğer süreç her konuştuğunuzda çocuklar oluşturuyorsa (ağ sunucusu) o dosyayı okumayı deneyin (muhtemelen root olmanız gerekecek).
Burada libc'nin süreç içinde tam olarak nerede yüklü olduğunu ve her çocuğun süreç için nerede yükleneceğini bulabilirsiniz.
Bu durumda 0xb75dc000 adresinde yüklenmiştir (Bu libc'nin temel adresi olacaktır).
Bilinmeyen bir libc'nin yükleniyor olabileceği durumlar olabilir (çünkü erişiminiz olmayan bir sunucuda bulunabilir). Bu durumda, bazı adresleri sızdırmak ve hangi libc kütüphanesinin kullanıldığını bulmak için açığı kötüye kullanabilirsiniz:
Leaking libc address with ROPVe bunun için bir pwntools şablonunu burada bulabilirsiniz:
Leaking libc - templatehttps://libc.blukat.me/ sayfasını kontrol edin ve libc içindeki birkaç adres kullanarak kullanılan versiyonu öğrenin.
Bu kaba kuvvet saldırıları sadece 32 bit sistemler için faydalıdır.
Eğer istismar yerel ise, libc'nin temel adresini kaba kuvvetle bulmayı deneyebilirsiniz (32 bit sistemler için faydalıdır):
Uzak bir sunucuya saldırıyorsanız, usleep
libc
fonksiyonunun adresini brute-force ile bulmayı deneyebilirsiniz, argüman olarak 10 (örneğin) geçerek. Eğer bir noktada sunucu yanıt vermek için 10 saniye ekstra alıyorsa, bu fonksiyonun adresini bulmuşsunuzdur.
libc'de bir belirli adrese atlayarak bir shell çalıştırın:
One GadgetBu örnekte ASLR brute-force kodun içine entegre edilmiştir ve savunmasız ikili bir uzak sunucuda bulunmaktadır:
Örneği kontrol edin:
ROP - Return Oriented ProgramingARM64 durumunda, ret talimatı x30 kaydının işaret ettiği yere atlar, yığın kaydının işaret ettiği yere değil. Bu nedenle biraz daha karmaşık.
Ayrıca ARM64'te bir talimat, talimatın yaptığı şeyi yapar (talimatların ortasında atlamak ve onları yeni talimatlara dönüştürmek mümkün değildir).
Örneği kontrol edin:
Ret2lib + Printf leak - arm64Bu, printf
/puts
çağrısı yaparak işlemden bilgi sızdırmayı sağlar; belirli verileri argüman olarak yerleştirerek. Örneğin, puts
'un GOT'daki adresini puts
çağrısına koymak, puts
'un bellek adresini sızdırır.
Bu, temelde bir Ret2lib'i printf
format dizeleri zafiyeti haline dönüştürmek için kötüye kullanmak anlamına gelir; ret2lib
kullanarak printf'i istismar etmek için değerlerle çağırmak (gereksiz gibi görünüyor ama mümkün):
Ret2lib, libc'deki bir işlevin adresine sızdırma verildiğinde, bir gadget kullanarak
64 bit, ASLR etkin ama PIE yok, ilk adım, puts'u çağırmak ve sızdırmak için kanaryanın 0x00 baytına kadar bir taşmayı doldurmaktır. Kanarya ile puts'un GOT'dan adresini sızdırmak için bir ROP gadget'ı oluşturulur ve ardından system('/bin/sh')
çağırmak için bir ROP gadget'ı.
64 bit, ASLR etkin, kanarya yok, ana işlevden bir çocuk işlevde yığın taşması. Puts'un GOT'dan adresini sızdırmak için puts'u çağırmak için bir ROP gadget'ı ve ardından bir gadget çağırmak.
64 bit, pie yok, kanarya yok, relro yok, nx. Yazma işlevini kullanarak yazmanın (libc) adresini sızdırır ve bir gadget çağırır.
Yığınlardan kanaryayı sızdırmak için bir format dizesi kullanır ve /bin/sh
adresi ile sisteme çağrıda bulunmak için bir tampon taşması kullanır (GOT'dadır).
32 bit, relro yok, kanarya yok, nx, pie. Yığınlardan libc ve heap adreslerini sızdırmak için kötü bir indeksleme kullanır. Bir tampon taşmasını kötüye kullanarak system('/bin/sh')
çağıran bir ret2lib yapar (bir kontrolü atlamak için heap adresi gereklidir).
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)