Temel İkili Sömürü Metodolojisi
Reading time: 7 minutes
tip
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)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
ELF Temel Bilgiler
Herhangi bir şeyi sömürmeye başlamadan önce, bir ELF ikilisi yapısının bir kısmını anlamak ilginçtir:
Sömürü Araçları
Yığın Taşması Metodolojisi
Bu kadar çok teknikle, her tekniğin ne zaman faydalı olacağına dair bir şemaya sahip olmak iyidir. Aynı korumaların farklı teknikleri etkileyeceğini unutmayın. Her koruma bölümünde korumaları aşmanın yollarını bulabilirsiniz, ancak bu metodolojide değil.
Akışı Kontrol Etme
Bir programın akışını kontrol etmenin farklı yolları vardır:
- Yığın Taşmaları yığından dönüş işaretçisini veya EBP -> ESP -> EIP'yi yazmak.
- Taşmayı sağlamak için bir Tam Sayı Taşması istismar etmeniz gerekebilir.
- Ya da Rastgele Yazmalar + Yazılacak Yeri Yürütme yoluyla.
- Format dizeleri:
printf
'i kullanarak rastgele içerikleri rastgele adreslere yazmak. - Dizi İndeksleme: Bazı dizileri kontrol edebilmek ve rastgele yazma elde edebilmek için kötü tasarlanmış bir indekslemeyi istismar etmek.
- Taşmayı sağlamak için bir Tam Sayı Taşması istismar etmeniz gerekebilir.
- bof'dan WWW'ye ROP: Bir tampon taşmasını istismar ederek bir ROP oluşturmak ve WWW'ye ulaşmak.
Yazılacak Yeri Yürütme tekniklerini bulabilirsiniz:
Sonsuz Döngüler
Dikkate alınması gereken bir şey, genellikle bir zafiyetin yalnızca bir kez sömürülmesinin yeterli olmayabileceğidir; özellikle bazı korumaların aşılması gerekir. Bu nedenle, bir tek zafiyeti aynı ikilinin yürütülmesi sırasında birkaç kez sömürülebilir hale getirmek için bazı seçenekleri tartışmak ilginçtir:
main
fonksiyonunun adresini veya zafiyetin meydana geldiği adresi bir ROP zincirine yazmak.- Uygun bir ROP zincirini kontrol ederek, o zincirdeki tüm eylemleri gerçekleştirebilirsiniz.
exit
adresini GOT'ta (veya ikili tarafından bitirilmeden önce kullanılan herhangi bir fonksiyonda) zafiyete geri dönmek için adres yazmak.- .fini_array'de burada, zafiyeti tekrar çağıracak bir fonksiyon ve
__libc_csu_fini
fonksiyonunu çağıracak başka bir fonksiyon saklamak.
Sömürü Hedefleri
Hedef: Mevcut bir fonksiyonu çağırmak
- ret2win: Bayrağı almak için çağırmanız gereken (belki bazı özel parametrelerle) kodda bir fonksiyon var.
- PIE ve canary olmayan bir normal bof'da, yığındaki saklanan dönüş adresine sadece adresi yazmanız yeterlidir.
- PIE olan bir bof'da, bunu aşmanız gerekecek.
- canary olan bir bof'da, bunu aşmanız gerekecek.
- ret2win fonksiyonunu doğru bir şekilde çağırmak için birkaç parametre ayarlamanız gerekiyorsa:
- Tüm parametreleri hazırlamak için yeterli gadget varsa bir ROP zinciri kullanabilirsiniz.
- SROP (bu syscall'ı çağırabiliyorsanız) birçok kaydı kontrol etmek için.
- ret2csu ve ret2vdso ile birkaç kaydı kontrol etmek için gadgetlar.
- Bir Yazılacak Yeri Yürütme ile,
win
fonksiyonunu çağırmak için diğer zafiyetleri (bof olmayan) istismar edebilirsiniz. - Göstergeleri Yönlendirme: Yığın, çağrılacak bir fonksiyona veya ilginç bir fonksiyon (system veya printf) tarafından kullanılacak bir dizeye işaret eden göstergeler içeriyorsa, o adresi yazmak mümkündür.
- ASLR veya PIE adresleri etkileyebilir.
- Başlatılmamış değişkenler: Asla bilemezsiniz.
Hedef: RCE
Shellcode aracılığıyla, eğer nx devre dışıysa veya shellcode'u ROP ile karıştırarak:
- (Yığın) Shellcode: Bu, dönüş işaretçisini yazdıktan sonra yığında bir shellcode saklamak ve ardından ona atlamak için yararlıdır:
- Her durumda, eğer bir canary** varsa**, normal bir bof'da bunu aşmanız gerekecek (sızdırmak).
- ASLR ve nx olmadan, yığın adresine atlamak mümkündür çünkü asla değişmeyecek.
- ASLR ile, ona atlamak için ret2esp/ret2reg gibi tekniklere ihtiyacınız olacak.
- nx ile, bazı ROP kullanmanız gerekecek
memprotect
çağırmak ve bazı sayfalarırwx
yapmak için, böylece shellcode'u oraya saklayabilir (örneğin read çağırarak) ve ardından oraya atlayabilirsiniz. - Bu, shellcode'u bir ROP zinciri ile karıştıracaktır.
Syscall'lar aracılığıyla
- Ret2syscall: Rastgele komutları çalıştırmak için
execve
çağırmak için yararlıdır. Belirli syscall'ı parametrelerle çağırmak için gadgetları bulabilmeniz gerekir. - ASLR veya PIE etkinse, ROP gadgetlarını kullanmak için bunları yenmeniz gerekecek.
- SROP ret2execve'yi hazırlamak için yararlı olabilir.
- ret2csu ve ret2vdso ile birkaç kaydı kontrol etmek için gadgetlar.
libc aracılığıyla
- Ret2lib: Genellikle
libc
'den bir fonksiyonu (örneğinsystem
) bazı hazırlanmış argümanlarla (örn.'/bin/sh'
) çağırmak için yararlıdır. Çağırmak istediğiniz fonksiyonla birlikte kütüphaneyi yüklemek için ikiliyi yüklemeniz gerekir (genellikle libc). - Statik derlenmiş ve PIE yoksa,
system
ve/bin/sh
'nin adresleri değişmeyecek, bu nedenle bunları statik olarak kullanmak mümkündür. - ASLR'sız ve yüklü libc sürümünü bilerek,
system
ve/bin/sh
'nin adresleri değişmeyecek, bu nedenle bunları statik olarak kullanmak mümkündür. - ASLR ama PIE yoksa, libc'yi bilerek ve ikili
system
fonksiyonunu kullanıyorsa, GOT'taki system adresine'/bin/sh'
adresi ileret
yapmak mümkündür (bunu çözmeniz gerekecek). - ASLR ama PIE yoksa, libc'yi bilerek ve ikili
system
kullanmıyorsanız: ret2dlresolve
kullanaraksystem
adresini çözmek ve çağırmak.- ASLR aşmak ve
system
ve'/bin/sh'
adreslerini bellek içinde hesaplamak. - ASLR ve PIE ve libc'yi bilmeden: Şunları yapmanız gerekir:
- PIE aşmak.
- 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
- Yığın Pivotlama / EBP2Ret / EBP Zincirleme: Yığındaki saklanan EBP aracılığıyla RET'i kontrol etmek için ESP'yi kontrol edin.
- Birden bir yığın taşmaları için yararlıdır.
- Yüklemenin hafızadaki yükünü oluştururken EIP'yi kontrol etmenin alternatif bir yolu olarak yararlıdır ve ardından EBP aracılığıyla ona atlayarak.
Çeşitli
- Göstergeleri Yönlendirme: Yığın, çağrılacak bir fonksiyona veya ilginç bir fonksiyon (system veya printf) tarafından kullanılacak bir dizeye işaret eden göstergeler içeriyorsa, o adresi yazmak mümkündür.
- ASLR veya PIE adresleri etkileyebilir.
- Başlatılmamış değişkenler: Asla bilemezsiniz.
tip
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)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.