hacktricks/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md

11 KiB
Raw Blame History

Temel İkili Sömürü Metodolojisi

{% hint style="success" %} AWS Hacking'i öğrenin ve uygulayın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking'i öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekleyin
{% endhint %}

ELF Temel Bilgileri

Herhangi bir şeyi sömürmeye başlamadan önce bir ELF ikilisinin yapısının bir kısmını anlamak ilginç olabilir:

{% content-ref url="elf-tricks.md" %} elf-tricks.md {% endcontent-ref %}

Sömürü Araçları

{% content-ref url="tools/" %} tools {% endcontent-ref %}

Yığın Taşması Metodolojisi

Bu kadar teknikle, her tekniğin ne zaman kullanışlı olacağını belirlemek için bir plana sahip olmak iyidir. Aynı korumaların farklı teknikleri etkileyeceğini unutmayın. Her koruma bölümünde korumaları atlatma yollarını bulabilirsiniz, ancak bu metodolojide değil.

Akışı Kontrol Etme

Bir programın akışını kontrol etmenin farklı yolları olabilir:

  • Yığın Taşmaları: Yığından dönüş işaretçisini veya EBP -> ESP -> EIP'yi üzerine yazarak.
  • Taşmayı tetiklemek için bir Tamsayı Taşmaları kullanmanız gerekebilir
  • Veya Keyfi Yazma + Ne Nerede Yazma ile Yürütme
  • Biçim Dizileri: printf'i kötüye kullanarak keyfi içeriği keyfi adreslere yazmak.
  • Dizi İndeksleme: Kötü tasarlanmış bir dizinlemeyi kötüye kullanarak bazı dizileri kontrol edebilir ve keyfi yazma alabilirsiniz.
  • Taşmayı tetiklemek için bir Tamsayı Taşmaları kullanmanız gerekebilir
  • bof to WWW via ROP: Bir tampon taşmasını kötüye kullanarak bir ROP oluşturmak ve bir WWW almak için.

Ne Nerede Yazma ile Yürütme tekniklerini şurada bulabilirsiniz:

{% content-ref url="../arbitrary-write-2-exec/" %} arbitrary-write-2-exec {% endcontent-ref %}

Sonsuz Döngüler

Dikkate alınması gereken bir şey genellikle bir zafiyetin sadece bir kez sömürülmesinin yeterli olmayabileceğidir, özellikle bazı korumaların atlatılması gerekebilir. Bu nedenle, bir zafiyeti aynı ikili çalıştırmada birkaç kez sömürülebilir hale getirmek için bazı seçenekleri tartışmak ilginçtir:

  • Bir ROP zincirine main işlevinin adresini veya zafiyetin meydana geldiği adrese yazın.
  • Uygun bir ROP zincirini kontrol ederek o zincirdeki tüm işlemleri gerçekleştirebilirsiniz
  • exit adresini GOT'a (veya bitmeden önce ikili tarafından kullanılan başka bir işlev) zafiyete geri dönmek için adresi yazın
  • .fini_array'de açıklandığı gibi, buraya 2 işlev saklayın, biri zafiyeti tekrar çağırmak için diğeri ise .fini_array'dan işlevi tekrar çağıracak olan**__libc_csu_fini**'yi çağırmak için.

Sömürü Hedefleri

Hedef: Varolan bir işlevi Çağırmak

  • ret2win: Çağırmanız gereken bir işlev var (belki belirli parametrelerle) bayrağı almak için.
  • PIE olmadan ve canary olmadan düzenli bir bof'ta, yığında depolanan dönüş adresine adresi yazmanız yeterli olacaktır.
  • PIE ile bir bof'ta, bunu atlatmanız gerekecektir
  • canary ile bir bof'ta, bunu atlatmanız gerekecektir
  • ret2win işlevini doğru şekilde çağırmak için birden fazla parametre ayarlamanız gerekiyorsa şunları kullanabilirsiniz:
  • Yeterli sayıda kısayol varsa ROP zinciri tüm parametreleri hazırlamak için
  • SROP (bu sistem çağrısını yapabiliyorsanız) birçok kaydı kontrol etmek için
  • ret2csu ve ret2vdso 'dan kısayolları kontrol etmek için
  • Bir Ne Nerede Yazma ile başka zafiyetleri (bof olmayanlar) kötüye kullanarak win işlevini çağırabilirsiniz.
  • İşaretçileri Yönlendirme: Yığın, çağrılacak bir işlevin işaretçilerini veya bir işlev tarafından kullanılacak bir dizeye işaret ediyorsa (system veya printf gibi), o adresi üzerine yazabilirsiniz.
  • ASLR veya PIE adresleri etkileyebilir.
  • İlklenmemiş değişkenler: Asla bilemezsiniz.

Hedef: Uzaktan Kod Yürütme (RCE)

Nx devre dışı bırakılmışsa veya kodu karıştırarak shellcode ile:

  • (Yığın) Shellcode: Bu, bir shellcode'u yığında depolamak ve ardından dönüş işaretçisini üzerine yazdıktan sonra ona atlamak ve çalıştırmak için kullanışlıdır:
  • Her durumda, bir canary** varsa,** düzenli bir bof'ta bunu atlatmanız (sızdırmanız) gerekecektir
  • ASLR ve nx olmadan, yığının adresine atlamak mümkündür çünkü asla değişmeyecektir
  • ASLR ile, ona atlamak için ret2esp/ret2reg gibi tekniklere ihtiyacınız olacaktır
  • nx ile, birkaç ROP kullanmanız gerekecektir memprotect'ı çağırmak ve bazı sayfaları rwx yapmak için, ardından oraya shellcode'u depolamak (örneğin okuma çağırarak) ve ardından oraya atlamak için.
  • Bu, shellcode'u bir ROP zinciri ile karıştıracaktır.

Syscall ile

  • Ret2syscall: Herhangi bir komutu çalıştırmak için execve'yi çağırmak için kullanışlıdır. Belirli bir syscall'ı parametrelerle çağırmak için gerekli olan gadget'ları bulabilmelisiniz.
  • ASLR veya PIE etkinse, ROP gadget'larını kullanabilmek için bunları geçmek gerekecek.
  • SROP ret2execve'yi hazırlamak için kullanışlı olabilir
  • ret2csu ve ret2vdso ile çeşitli register'ları kontrol etmek için gadget'lar

Libc ile

  • Ret2lib: Genellikle libc gibi bir kütüphaneden bir fonksiyonu (genellikle system) çağırmak için kullanışlıdır ve bazı hazırlanmış argümanlarla (ör. '/bin/sh'). Çağırmak istediğiniz fonksiyonu içeren kütüphanenin yüklenmiş olması gerekmektedir.
  • Statik olarak derlenmiş ve PIE olmayan durumlarda, system ve /bin/sh'nin adresleri değişmeyecek, bu yüzden bunları statik olarak kullanmak mümkün olacaktır.
  • ASLR olmadan [ve yüklü olan libc sürümünü bilerek, system ve /bin/sh'nin adresleri değişmeyecek, bu yüzden bunları statik olarak kullanmak mümkün olacaktır.
  • ASLR var ancak PIE yoksa, libc bilinir ve binary system fonksiyonunu kullandığında, '/bin/sh' adresine GOT'taki system adresine ret yapmak mümkün olacaktır (bunu çözmeniz gerekecek).
  • ASLR var ancak PIE yoksa, libc bilinir ve binary system'i kullanmadığında:
  • ret2dlresolve'yi kullanarak system'in adresini çözümlemek ve çağırmak mümkündür.
  • ASLR geçmek ve system ve '/bin/sh''nin adresini hesaplamak için
  • ASLR ve PIE var ve libc bilinmiyorsa:
  • PIE geçmek
  • Kullanılan libc sürümünü bulmak (birkaç fonksiyon adresini sızdırmak)
  • Devam etmek için ASLR ile önceki senaryoları kontrol etmek gerekecek.

EBP/RBP ile

  • Stack Pivoting / EBP2Ret / EBP Chaining: ESP'yi kontrol ederek stack'te depolanan EBP aracılığıyla RET'i kontrol etmek.
  • Off-by-one stack overflow'lar için kullanışlıdır
  • EIP'yi kontrol etmeyi sonlandırmanın alternatif bir yol olarak kullanışlıdır, EIP'yi kontrol ederken bellekte payload'ı oluşturmak ve ardından EBP aracılığıyla ona atlamak için

Çeşitli

  • Pointers Redirecting: Stack'te çağrılacak bir fonksiyonun adreslerini veya bir dizeyi içeren işlevin (system veya printf gibi) kullanılacağına dair işaretçiler varsa, o adresi üzerine yazmak mümkündür.
  • ASLR veya PIE adresleri etkileyebilir.
  • İlklenmemiş değişkenler: Asla bilemezsiniz