hacktricks/binary-exploitation/heap/unsorted-bin-attack.md

11 KiB
Raw Blame History

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ı:

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 fdnin 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şken global_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çisinin p64(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 boyutu 0xfc*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çinde system 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ı: