7.1 KiB
Force Evi
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ünlerini edinin
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna katılın](https://discord.gg/hRep4RUj7f) veya telegram grubuna katılın veya bizi Twitter 🐦 @hacktricks_live** takip edin.**
- Hacking püf noktalarınızı paylaşarak PR göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.
Temel Bilgiler
Kod
- Bu teknik düzeltildi (burada) ve şu hatayı üretir:
malloc(): corrupted top size
- Test etmek isterseniz buradan kodu deneyebilirsiniz.
Amaç
- Bu saldırının amacı belirli bir adreste bir parça tahsis edebilmektir.
Gereksinimler
- Başlık üst parçasının boyutunu üzerine yazmanıza izin veren bir taşma (örneğin -1).
- Yığın tahsis boyutunu kontrol edebilme yeteneği
Saldırı
Bir saldırgan, bir parçayı P adresine tahsis etmek için burada bir değeri üzerine yazmak isterse. Başlangıçta, başlık üst parçasının boyutunu -1
ile üzerine yazarak başlar (belki bir taşma ile). Bu, malloc'un herhangi bir tahsis için mmap kullanmayacağından emin olur, çünkü Üst parça her zaman yeterli alanı olacaktır.
Daha sonra, başlık üst parçasının adresi ile hedef alan arasındaki mesafeyi hesaplayın ve tahsis edilecek alanın boyutunu kontrol edin. Bu, başlık üst parçasını o konuma taşımak için o boyutta bir malloc işlemi gerçekleştirileceğinden fark/kapasite kolayca hesaplanabilir:
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/
Bu yüzden, hedef - eski_üst - 4*sizeof(long)
boyutunda bir alan ayırmak (4 long, üst parçanın ve ayrıldığında yeni parçanın meta verileri nedeniyle) üst parçayı üzerine yazmak istediğimiz adrese taşıyacaktır.
Sonra, hedef adresi yazmak için verinin başlangıcını içeren bir parçayı almak için başka bir malloc yapın.
Referanslar ve Diğer Örnekler
- https://github.com/shellphish/how2heap/tree/master
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/
- https://heap-exploitation.dhavalkapil.com/attacks/house_of_force
- https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c
- https://guyinatuxedo.github.io/41-house_of_force/house_force_exp/index.html
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/#hitcon-training-lab-11
- Bu senaryonun amacı, çağrılacak bir işlevin adresini ret2win işlevinin adresine değiştirmemiz gereken bir ret2win'dir
- Binary, üst parçanın boyutunu değiştirmek için kötüye kullanılabilecek bir taşma içerir, bu boyut -1 veya p64(0xffffffffffffffff) olarak değiştirilir
- Daha sonra, üzerine yazılacak işaretçinin bulunduğu yere giden adres hesaplanır ve üst parçanın mevcut konumundan oraya olan fark
malloc
ile ayrılır - Son olarak, istenen hedefi içerecek yeni bir parça ayrılır ve bu parça ret2win işlevi tarafından üzerine yazılır
- https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp
Adınızı girin:
kısmında, yığından bir adres sızdırmaya izin veren bir başlangıç açığı bulunmaktadır- Ardından,
Org:
veHost:
işlevlerinde, org adı istendiğindes
işaretçisinin 64B'sini doldurmak mümkündür, çünkü yığında v2 adresini takip eden ve daha sonra belirtilen host adını takip eden şeydir. Daha sonra, strcpy s'nin içeriğini 64B boyutunda bir parçaya kopyalayacak, bu nedenle host adı içine konulan veriyle üst parçanın boyutunu üzerine yazmak mümkündür. - Artık keyfi yazma mümkün olduğundan,
atoi
'nin GOT'u printf adresine üzerine yazıldı.IO_2_1_stderr
adresi%24$p
ile sızdırılabildi ve bu libc sızıntısı ileatoi
'nin GOT'u tekrarsystem
adresiyle üzerine yazılarak/bin/sh
parametresiyle çağrıldı - Bu diğer yazıda önerilen alternatif bir yöntem,
free
'yiputs
ile üzerine yazmak ve daha sonra daha sonra serbest bırakılacak olan işaretçiyeatoi@got
adresini eklemektir, böylece sızdırılır ve bu sızıntı ileatoi@got
tekrarsystem
ile üzerine yazılır ve/bin/sh
ile çağrılır. - https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html
- Burada, işaretçi temizlenmeden serbest bırakılan bir parçayı yeniden kullanmaya izin veren bir UAF bulunmaktadır. Bazı okuma yöntemleri olduğundan, buraya serbest işlevine bir işaretçi yazarak bir libc adresi sızdırmak ve ardından okuma işlevini çağırmak mümkündür.
- Daha sonra, (UAF'yi kötüye kullanarak) sol boşluğun boyutunu -1 ile üzerine yazmak, serbest kancaya ulaşmak için yeterince büyük bir parça ayırmak ve ardından serbest kancayı içerecek başka bir parça ayırmak için House of force kullanıldı. Daha sonra, kancaya
system
adresini yazın, bir parçaya"/bin/sh"
yazın ve son olarak o dize içeriğine sahip parçayı serbest bırakın.