11 KiB
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
- Abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @hacktricks_live** takip edin.**
- Hacking püf noktalarını göndererek HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.
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 (genelliklesystem
) ç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 adresineret
yapmak mümkün olacaktır (bunu çözmeniz gerekecek). - ASLR var ancak PIE yoksa, libc bilinir ve binary
system
'i kullanmadığında: ret2dlresolve
'yi kullanaraksystem
'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