7 KiB
Güç Evi
Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!
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(https://github.com/sponsors/carlospolop) göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna 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 parçasının boyutunu üzerine yazmanızı sağlayan bir taşma (örneğin -1).
- Yığın tahsis boyutunu kontrol edebilme
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 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, üst parça adresi ile hedef alan arasındaki mesafeyi hesaplayın. Bu, üst parçayı o konuma taşımak için o boyutta bir malloc'un gerçekleştirileceği anlamına gelir. Farkın/boyutun kolayca hesaplanabileceği budur:
// 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 nedenle, 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ştirmek için bir işlevin adresini değiştirmektir
- Binanın köşesinde, üst parçanın boyutunu değiştirmek için kötüye kullanılabilecek bir taşma vardır, bu -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 hedef, 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çığı vardır- Ardından,
Org:
veHost:
işlevlerinde, org adı istendiğindes
işaretçisinin 64B'sini doldurmak mümkündür, bu da yığında v2 adresinin ardından gelen ve daha sonra belirtilen host adı tarafından takip edilen bir adrestir. Daha sonra, strcpy, s içeriğini 64B boyutunda bir parçaya kopyalayacak, bu da host adı içine konulan veriyle üst parçanın boyutunu üzerine yazmaya olanak tanı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 ardından daha sonra serbest bırakılacak işaretçiyeatoi@got
adresini eklemektir, böylece sızdırılır ve bu sızıntı ile tekraratoi@got
adresisystem
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, serbest bırakılan bir parçayı temizlemeden yeniden kullanmaya izin veren bir UAF bulunmaktadır. Bazı okuma yöntemleri olduğundan, buraya serbest işlevin işaretçisine 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, bir -1 ile sol boşluğun boyutunu üzerine yazmak için House of force (UAF'yi kötüye kullanarak) kullanıldı, 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. Ardından, 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.