11 KiB
Sıralanmamış Bin Saldırısı
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 alın
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @hacktricks_live'da takip edin.
- Hacking püf noktalarınızı paylaşarak HackTricks ve HackTricks Cloud github depolarına PR göndererek destek olun.
Temel Bilgiler
Sıralanmamış bir liste, bir parçanın bk
adresindeki sıralanmamış_parçalar (av)
adresini yazabilmektedir. Bu nedenle, bir saldırgan bir parçanın içindeki bk
işaretçisinin adresini değiştirebilirse, bu adresi rastgele bir adrese yazabilir ve bu, bir libc adresini sızdırmak veya bazı savunmaları atlamak için faydalı olabilir.
Yani, temelde bu saldırı, bazı rastgele adresleri büyük bir sayıyla (bir heap adresi veya bir libc adresi olabilecek bir adres) üzerine yazmaya izin verdi. Bu, sızdırılabilecek bir yığın adresi veya küresel değişken global_max_fast
gibi bir kısıtlamayı sızdırmaya izin vererek daha büyük boyutlarda hızlı binler oluşturmasına izin vermek için kullanılabilir (ve sıralanmamış bir bin saldırısından hızlı bir bin saldırısına geçmek).
{% hint style="success" %}
https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle adresinde sağlanan örneğe bakarak ve 0x400 ve 0x500 yerine 0x4000 ve 0x5000 kullanarak (tcaches'i önlemek için) günümüzde artık hata malloc(): sıralanmamış çift bağlantılı liste bozulmuş
tetiklenmektedir.
Bu nedenle, bu sıralanmamış bin saldırısı artık (diğer kontroller arasında) çift bağlantılı listeyi düzeltme yeteneğine de ihtiyaç duyar, böylece bu, victim->bck->fd == victim
veya victim->fd == av (arena)
olmadığından bu atlatılır. Bu, yazmak istediğimiz adresin, sahte parçanın fd
konumunda olması gerektiği ve sahte parçanın fd
nin arenaya işaret ettiği anlamına gelir.
{% endhint %}
{% hint style="danger" %} Bu saldırı sıralanmamış bin'i bozar (bu nedenle küçük ve büyük de). Bu nedenle şimdi yalnızca hızlı binlerden tahsisler kullanabiliriz (daha karmaşık bir program başka tahsisler yapabilir ve çökebilir) ve bunu tetiklemek için aynı boyutta tahsis yapmalıyız veya program çökecektir.
Bu durumda global_max_fast
yapmak, hızlı binin tüm diğer tahsislerle ilgileneceğine güvenmek bu durumda yardımcı olabilir ve saldırı tamamlandığında hızlı bir bin saldırısına izin verebilir.
{% endhint %}
guyinatuxedo tarafından sağlanan kod bunu çok iyi açıklar, ancak malloc'ları tcache'e sona ermeyecek kadar büyük bir bellek ayırmak için değiştirirseniz, önce bahsedilen hata ortaya çıkar ve bu tekniği engeller: malloc(): sıralanmamış çift bağlantılı liste bozulmuş
Sıralanmamış Bin Bilgi Sızdırma Saldırısı
Bu aslında çok temel bir kavramdır. Sıralanmamış bindeki parçalar, bin oluşturmak için çift işaretçilere sahip olacaklardır. Sıralanmamış bindeki ilk parça aslında FD ve BK bağlantılarını ana arenanın (libc) bir kısmına işaret edecek şekilde olacaktır.
Bu nedenle, bir parçayı sıralanmamış bir bine yerleştirebilir ve onu okuyabilirsiniz (serbest bırakıldıktan sonra kullan) veya en azından 1 işaretçiyi üzerine yazmadan tekrar tahsis edebilir ve ardından onu okuyabilirseniz, bir libc bilgi sızıntınız olabilir.
Bu yazıda kullanılan benzer bir saldırı, 4 parçalık bir yapıyı (A, B, C ve D - D yalnızca üst parçayla birleşmeyi önlemek için) kötüye kullanmaktı, böylece B'de bir null bayt taşması kullanılarak C'nin B'nin kullanılmadığını göstermesi sağlandı. Ayrıca, B'de prev_size
verisi değiştirildi, böylece boyut B'nin boyutu olmak yerine A+B oldu.
Ardından C serbest bırakıldı ve A+B ile birleştirildi (ancak B hala kullanımda idi). A boyutunda yeni bir parça tahsis edildi ve ardından sızdırılan libc adresleri B'ye yazıldı ve oradan sızdırıldı.
Referanslar ve Diğer Örnekler
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap
- Amacı, bir global değişkeni 4869'dan büyük bir değerle üzerine yazmak ve bayrağı almak mümkün kılmaktır ve PIE etkin değildir.
- Keyfi boyutlarda parçalar oluşturulabilir ve istenen boyutta bir yığın taşması vardır.
- Saldırı, 3 parça oluşturarak başlar: taşmayı kötüye kullanmak için chunk0, taşmaya uğrayacak chunk1 ve önceki parçaların birleşmesini önlemek için chunk2.
- Ardından, chunk1 serbest bırakılır ve chunk0 taşmaya uğratılır, böylece chunk1'in
bk
işaretçisi şuna işaret eder:bk = magic - 0x10
- Ardından, chunk1 ile aynı boyutta chunk3 tahsis edilir, bu da sıralanmamış bin saldırısını tetikleyecek ve global değişkenin değerini değiştirecek, bayrağı almayı mümkün kılacaktır.
- https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html
- Birleştirme işlevi, geçilen her iki dizin de aynı olduğunda onu yeniden boyutlandıracağı ve ardından serbest bırakacağı ancak o serbest bırakılan bölgeye bir işaretçi döndüreceği için savunmasızdır.
- Bu nedenle, 2 parça oluşturulur: chunk0 kendisiyle birleştirilecek ve üst parçayla birleşmesini önlemek için chunk1. Ardından, birleştirme işlevi chunk0 ile iki kez çağrılır, bu da bir kullanımdan sonra serbest bırakma hatasına neden olur.
- Ardından,
view
işlevi, kullanım sonrası serbest bırakma parçasının dizini olan 2 ile çağrılır, bu da bir libc adresi sızdırır. - Binary, sadece
global_max_fast
'tan büyük boyutlarda malloc yapmasına izin verdiği için hiçbir fastbin kullanılmadığından, sıralanmamış bin saldırısı, global değişkenglobal_max_fast
'ı üzerine yazmak için kullanılacaktır. - Ardından, kullanım sonrası serbest bırakma işaretçisi olan 2 diziniyle edit işlevi çağrılabilir ve
bk
işaretçisininp64(global_max_fast-0x10)
'a işaret etmesi sağlanabilir. Ardından, yeni bir parça oluşturulduğunda önceki kompromize edilmiş serbest adresi (0x20) kullanılacak ve sıralanmamış bin saldırısı tetiklenecek,global_max_fast
'ı çok büyük bir değerle üzerine yazarak artık hızlı binlerde parçalar oluşturulabilir. - Şimdi bir hızlı bin saldırısı gerçekleştirilir:
- İlk olarak,
__free_hook
konumunda 200 boyutunda hızlı parçalarla çalışılabileceği 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 hızlı bir parça elde edebilirsek, yürütülecek bir fonksiyon işaretçisini üzerine yazmak mümkün olacaktır
- Bunun için, boyutu
0xfc
olan yeni bir parça oluşturulur ve birleştirilmiş fonksiyon o işaretçiyle iki kez çağrılır, bu şekilde hızlı binde boyutu0xfc*2 = 0x1f8
olan bir serbest parça işaretçisi elde edilir. - Ardından, bu parçada
fd
adresini önceki__free_hook
fonksiyonuna işaret etmek için düzenleme fonksiyonu çağrılır. - Daha sonra, hızlı bindeki önceki gereksiz parçayı almak için boyutu
0x1f8
olan bir parça oluşturulur, böylece__free_hook
içindesystem
fonksiyonunun adresiyle üzerine yazılmış bir hızlı bin parçası alınır. - Ve son olarak,
/bin/sh\x00
dizesini içeren bir parça serbest bırakılırken silme fonksiyonu çağrılır,__free_hook
fonksiyonunu tetikleyerek/bin/sh\x00
parametresiyle system fonksiyonuna işaret eder. - CTF https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html
- Unsorted binde bir 1B taşma kullanarak parçaları birleştirme ve bir libc bilgi sızıntısı alıp ardından malloc hook'u bir one gadget adresiyle üzerine yazmak için hızlı bin saldırısı yapmanın başka bir örneği
AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert)!
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
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna katılın veya telegram grubuna veya bizi Twitter 🐦 @hacktricks_live'da takip edin.
- Hacking püf noktalarınızı paylaşarak HackTricks ve HackTricks Cloud github depolarına PR göndererek.