11 KiB
Temel İkili Sömürü Metodolojisi
Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünleri'ni edinin
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @hacktricks_live** takip edin.**
- Hacking püf noktalarınızı 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 birlikte her teknik ne zaman kullanışlı olacak bir şema olması iyidir. Aynı korumalar farklı teknikleri etkileyecektir. Korumaları atlatma yollarını her koruma bölümünde 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 Yürütme yoluyla
- Biçim dizeleri:
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 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, aynı yürütmede bir zafiyeti birden fazla 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 yazın (veya bitmeden önce kullanılan başka bir işlev) zafiyete geri dönmek için adresi- .fini_array** açıklamasında belirtildiği gibi**, buraya 2 işlev saklayın, biri zafiyeti tekrar çağırmak için diğeri
.fini_array
işlevini tekrar çağıracak olan**__libc_csu_fini
** işlevini çağırmak için.
Sömürü Hedefleri
Hedef: Varolan bir işlevi Çağırmak
- ret2win: Çağırmanız gereken bir işlev (belki belirli parametrelerle) varsa bayrağı almak için.
- PIE olmadan ve canary ile birlikte 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 kullanarak diğer zafiyetleri (bof olmayanlar) kötüye kullanarak
win
işlevini çağırabilirsiniz. - İşaretçileri Yönlendirme: Yığında, çağrılacak bir işlevin işaretçilerini veya bir işlev tarafından kullanılacak bir dizeye işaretçiler varsa, 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 shellcode ile ROP karıştırılıyorsa:
- (Yığın) Shellcode: Bu, bir shellcode'u yığında depolamak ve ardından dönüş işaretçisini üzerine yazarak 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 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 teknikler gerekecektir
- nx ile, bir ROP kullanarak
memprotect
'i çağırmak ve bazı sayfalarırwx
yapmak için gerekecektir, ardından oraya shellcode'u depolamak (örneğin okuma çağırarak) ve ardından oraya atlamak. - Bu, shellcode'u bir ROP zinciri ile karıştıracaktır.
Syscall Yoluyla
- 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 faydalı olabilir
- Çeşitli register'ları kontrol etmek için ret2csu ve ret2vdso gadget'ları
Libc Aracılığıyla
- 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 fonksiyonun kütüphaneyi yüklemesi gerekmektedir (genellikle libc). - Statik olarak derlenmiş ve PIE etkin değilse,
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ü libc sürümünü bildiğinizde,
system
ve/bin/sh
'nin adresleri değişmeyecek, bu yüzden bunları statik olarak kullanmak mümkün olacaktır. - ASLR ancak PIE** etkin değilse**, libc'yi bildiğiniz ve binary'nin
system
fonksiyonunu kullandığı durumda,'/bin/sh'
adresiyle birlikte GOT'taki system adresineret
yapmak mümkün olacaktır (bunu çözmeniz gerekecektir). - ASLR ancak PIE** etkin değilse**, libc'yi bildiğiniz ve binary'nin
system
'i kullanmadığı durumda: ret2dlresolve
'yi kullanaraksystem
'in adresini çözümlemek ve çağırmak için- ASLR geçmek ve bellekteki
system
ve'/bin/sh'
adreslerini hesaplamak. - ASLR ve PIE etkin ve libc bilinmiyorsa: Şunları yapmanız gerekecek:
- 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.
EBP/RBP Aracılığıyla
- Stack Pivoting / EBP2Ret / EBP Chaining: ESP'yi kontrol ederek stack'teki depolanan EBP aracılığıyla RET'i kontrol etmek.
- Off-by-one stack taşmaları için kullanışlı
- EIP'yi kontrol etmeyi sonlandırmak için alternatif bir yol olarak kullanışlıdır, EIP'yi hafızada payload oluşturmak için kötüye kullanarak ve ardından EBP aracılığıyla ona atlayarak.
Çeşitli
- Pointers Redirecting: Stack'te çağrılacak bir fonksiyonun veya ilginç bir fonksiyon tarafından kullanılacak bir dizeye işaret eden işaretçiler varsa, o adresi üzerine yazmak mümkündür.
- ASLR veya PIE adresleri etkileyebilir.
- İlklenmemiş değişkenler: Asla bilemezsiniz