Unsorted Bin Attack
Reading time: 6 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)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Temel Bilgiler
Unsorted bin nedir hakkında daha fazla bilgi için bu sayfayı kontrol edin:
Unsorted listeler, bk
adresine unsorted_chunks (av)
adresini yazma yeteneğine sahiptir. Bu nedenle, bir saldırgan bir unsorted bin içindeki bir chunk'taki bk
pointer'ının adresini değiştirebilirse, bu adresi rastgele bir adrese yazma yeteneğine sahip olabilir; bu da Glibc adreslerini sızdırmak veya bazı savunmaları aşmak için faydalı olabilir.
Temelde, bu saldırı rastgele bir adreste büyük bir sayı ayarlamaya olanak tanır. Bu büyük sayı, bir heap adresi veya bir Glibc adresi olabilir. Tipik bir hedef global_max_fast
'tır; bu, daha büyük boyutlarda hızlı binler oluşturulmasına izin verir (ve unsorted bin saldırısından hızlı bin saldırısına geçiş yapar).
tip
https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle adresindeki örneğe bakarak ve chunk boyutları olarak 0x400 ve 0x500 yerine 0x4000 ve 0x5000 kullanarak (Tcache'den kaçınmak için) günümüzde malloc(): unsorted double linked list corrupted
hatasının tetiklendiğini görebilirsiniz.
Bu nedenle, bu unsorted bin saldırısı artık (diğer kontrollerin yanı sıra) çift bağlı listeyi düzeltme yeteneğine sahip olmayı da gerektirir, böylece victim->bk->fd == victim
veya victim->fd == av (arena)
kontrolü geçerlidir; bu, yazmak istediğimiz adresin fd
konumunda sahte chunk'ın adresine sahip olması ve sahte chunk'ın fd
'sinin arenaya işaret etmesi gerektiği anlamına gelir.
caution
Bu saldırının unsorted bin'i bozduğunu unutmayın (bu nedenle küçük ve büyük de). Bu nedenle, artık yalnızca hızlı binlerden tahsisat kullanabiliriz (daha karmaşık bir program başka tahsisatlar yapabilir ve çökebilir) ve bunu tetiklemek için aynı boyutta tahsisat yapmalıyız yoksa program çöker.
global_max_fast
'ı geçersiz kılmak bu durumda yardımcı olabilir, çünkü hızlı binin diğer tüm tahsisatları yönetebileceğini varsayıyoruz, ta ki exploit tamamlanana kadar.
guyinatuxedo tarafından sağlanan kod bunu çok iyi açıklıyor, ancak malloc'ları yeterince büyük bir bellek tahsis etmek için değiştirirseniz, böylece Tcache'de sona ermezseniz, daha önce bahsedilen hatanın bu tekniği engellediğini görebilirsiniz: malloc(): unsorted double linked list corrupted
Unsorted Bin Infoleak Attack
Bu aslında çok temel bir kavramdır. Unsorted bin'deki chunk'lar pointer'lara sahip olacaktır. Unsorted bin'deki ilk chunk aslında fd
ve bk
bağlantılarına ana arenanın (Glibc) bir kısmına işaret edecektir.
Bu nedenle, bir chunk'ı unsorted bin içine yerleştirip okuyabilirseniz (free'den sonra kullanma) veya en az 1 pointer'ı geçersiz kılmadan tekrar tahsis edebilirseniz ve ardından okuyabilirseniz, bir Glibc bilgi sızıntısı elde edebilirsiniz.
Bu yazımda kullanılan benzer bir saldırı, 4 chunk yapısını (A, B, C ve D - D yalnızca üst chunk ile konsolidasyonu önlemek için) kötüye kullanmak için B'deki null byte taşmasını kullanarak C'nin B'nin kullanılmadığını belirtmesini sağladı. Ayrıca, B'deki prev_size
verisi değiştirilerek boyut B'nin boyutu yerine A+B olarak ayarlandı.
Sonra C serbest bırakıldı ve A+B ile konsolide edildi (ancak B hala kullanılıyordu). A boyutunda yeni bir chunk tahsis edildi ve ardından libc sızdırılan adresler B'ye yazıldı.
Referanslar ve Diğer Örnekler
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap
- Amaç, 4869'dan büyük bir değerle bir global değişkeni geçersiz kılmak, böylece bayrağı almak mümkün olur ve PIE etkin değildir.
- Rastgele boyutlarda chunk'lar oluşturmak mümkündür ve istenen boyutta bir heap taşması vardır.
- Saldırı, 3 chunk oluşturarak başlar: taşmayı kötüye kullanmak için chunk0, taşma için chunk1 ve üst chunk'un önceki chunk'larla konsolide olmaması için chunk2.
- Sonra, chunk1 serbest bırakılır ve chunk0, chunk1'in
bk
pointer'ına taşma yapar:bk = magic - 0x10
- Sonra, chunk1 ile aynı boyutta chunk3 tahsis edilir, bu da unsorted bin saldırısını tetikleyecek ve global değişkenin değerini değiştirecektir, böylece bayrağı almak mümkün olacaktır.
- https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html
- Birleştirme fonksiyonu, eğer geçirilen her iki indeks aynıysa, onu yeniden tahsis edeceği ve ardından serbest bırakacağı için savunmasızdır, ancak serbest bırakılan bölgeye bir pointer döndürür.
- Bu nedenle, 2 chunk oluşturulur: chunk0 kendisiyle birleştirilecek ve üst chunk ile konsolide olmasını önlemek için chunk1. Sonra, chunk0 ile birleştirme fonksiyonu iki kez çağrılır, bu da free'den sonra kullanma durumuna neden olur.
- Sonra,
view
fonksiyonu 2 indeks ile çağrılır (free'den sonra kullanılan chunk'ın indeksi), bu da bir libc adresini sızdırır. - İkili, yalnızca
global_max_fast
'dan daha büyük boyutları malloc etmeye yönelik korumalara sahip olduğundan, hızlı bin kullanılmadığı için bir unsorted bin saldırısı kullanılacak ve global değişkenglobal_max_fast
geçersiz kılınacaktır. - Sonra, 2 indeks ile edit fonksiyonu çağrılabilir (free'den sonra kullanılan pointer) ve
bk
pointer'ıp64(global_max_fast-0x10)
'a işaret edecek şekilde geçersiz kılınır. Ardından, yeni bir chunk oluşturmak, daha önce tehlikeye atılmış serbest adresi (0x20) kullanacak ve unsorted bin saldırısını tetikleyecek; bu daglobal_max_fast
'ı çok büyük bir değerle geçersiz kılacaktır, böylece artık hızlı binlerde chunk'lar oluşturmak mümkün olacaktır. - Şimdi bir hızlı bin saldırısı gerçekleştirilir:
- Öncelikle,
__free_hook
konumunda 200 boyutunda hızlı chunk'larla çalışmanın mümkün olduğu keşfedilir: gef➤ p &__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
- Eğer bu konumda 0x200 boyutunda bir hızlı chunk elde edebilirsek, çalıştırılacak bir fonksiyon pointer'ını geçersiz kılmak mümkün olacaktır.
- Bunun için,
0xfc
boyutunda yeni bir chunk oluşturulur ve birleştirilmiş fonksiyon iki kez çağrılır; bu şekilde, hızlı bin içinde0xfc*2 = 0x1f8
boyutunda serbest bir chunk'a işaret eden bir pointer elde ederiz. - Sonra, bu chunk'ta edit fonksiyonu çağrılarak bu hızlı binin
fd
adresi önceki__free_hook
fonksiyonuna işaret edecek şekilde değiştirilir. - Ardından, hızlı binin önceki işe yaramaz chunk'ını almak için
0x1f8
boyutunda bir chunk oluşturulur; böylece__free_hook
içinde bir hızlı bin chunk'ı elde edilir ve bu,system
fonksiyonunun adresi ile geçersiz kılınır. - Ve nihayet,
/bin/sh\x00
dizesini içeren bir chunk serbest bırakılır ve delete fonksiyonu çağrılır; bu,__free_hook
fonksiyonunu tetikler ve bu da sistemin/bin/sh\x00
parametresi ile işaret etmesine neden olur. - CTF https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html
- Unsorted bin'deki chunk'ları konsolide etmek ve bir libc bilgi sızıntısı elde etmek için 1B taşmasını kötüye kullanmanın ve ardından malloc hook'unu bir gadget adresi ile geçersiz kılmanın başka bir örneği.
- Robot Factory. BlackHat MEA CTF 2022
- Sadece
0x100
'den büyük boyutlarda chunk'lar tahsis edebiliriz. - Unsorted Bin saldırısı kullanarak
global_max_fast
'ı geçersiz kılmak (ASLR nedeniyle 1/16 kez çalışır, çünkü 12 bit değiştirmemiz gerekir, ancak 16 bit değiştirmemiz gerekir). - Global bir chunk dizisini değiştirmek için hızlı bin saldırısı. Bu, GOT'u değiştirme ve bazı fonksiyonları
system
'a işaret etme yeteneği veren rastgele bir okuma/yazma ilkesidir.
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)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.