House of Roman

HackTricks'i Destekleyin

Temel Bilgiler

Bu, sızıntısız RCE'ye olanak tanıyan, sahte fastbins, sıralanmamış_bin saldırısı ve göreceli üzerine yazma ile RCE sağlayan çok ilginç bir teknikti. Ancak yamalandı.

Kod

Amaç

  • Göreceli işaretçileri kötüye kullanarak RCE

Gereksinimler

  • Fastbin ve sıralanmamış bin işaretçilerini düzenleme

  • 12 bitlik rastgelelik zorunlu olarak kaba kuvvet uygulanmalıdır (%0.02 şansı çalışma)

Saldırı Adımları

Adım 1: Fastbin Chunk, __malloc_hook'a işaret eder

Birkaç parça oluşturun:

  • fastbin_victim (0x60, ofset 0): Daha sonra yığın işaretçisini LibC değerine işaret etmek üzere düzenlenecek UAF parçası.

  • chunk2 (0x80, ofset 0x70): İyi hizalamak için

  • main_arena_use (0x80, ofset 0x100)

  • relative_offset_heap (0x60, ofset 0x190): 'main_arena_use' parçasındaki göreceli ofset

Ardından main_arena_use serbest bırakılır, bu parçayı sıralanmamış listeye yerleştirir ve hem fd hem de bk işaretçilerinde main_arena + 0x68'e bir işaretçi alır.

Şimdi fd ve bk işaretçilerinde main_arena + 0x68'e işaretçiler içereceği için yeni bir parça olan fake_libc_chunk(0x60) ayrılmıştır.

Ardından relative_offset_heap ve fastbin_victim serbest bırakılır.

/*
Current heap layout:
0x0:   fastbin_victim       - size 0x70
0x70:  alignment_filler     - size 0x90
0x100: fake_libc_chunk      - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main        - size 0x20
0x190: relative_offset_heap - size 0x70

bin layout:
fastbin:  fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
  • fastbin_victim adlı bir fd, relative_offset_heap'e işaret ediyor

  • relative_offset_heap, fake_libc_chunk'tan uzaklık olarak bir ofsete sahiptir ve bu da main_arena + 0x68'i işaret eden bir işaretçi içerir

  • fastbin_victim.fd'nin son baytını değiştirerek fastbin_victimmain_arena + 0x68'i işaret edecek şekilde yapmak mümkündür

Önceki eylemler için saldırganın, fastbin_victim'ın fd işaretçisini değiştirebilme yeteneğine sahip olması gerekir.

Ardından, main_arena + 0x68 çok ilginç değildir, bu yüzden işaretçinin __malloc_hook'u işaret etmesini sağlayacak şekilde değiştirelim.

__memalign_hook genellikle 0x7f ile başlar ve ondan önce sıfırlar bulunur, bu nedenle 0x70 hızlı binde bir değer olarak sahteleyebilir. Çünkü adresin son 4 biti rastgele olduğundan, adresin istediğimiz yere işaret etmesi için 2^4=16 olasılık vardır. Bu nedenle, bir BF saldırısı burada gerçekleştirilir, böylece parça şu şekilde sonlanır: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23).

(Geri kalan baytlar hakkında daha fazla bilgi için how2heap örneğindeki açıklamaya bakın). BF çalışmazsa program çöker (bu yüzden çalışana kadar tekrar başlayın).

Ardından, 2 malloc işlemi gerçekleştirilir ve 2 başlangıç ​​hızlı bin parçası kaldırılır ve üçüncüsü, bir parçayı __malloc_hook:'ta almak için ayrılır.

malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);

Bölüm 2: Sıralanmamış_bin saldırısı

Daha fazla bilgi için şu adrese bakabilirsiniz:

Unsorted Bin Attack

Ancak temelde, chunk->bk içinde belirtilen konuma main_arena + 0x68 yazmamızı sağlar. Saldırı için __malloc_hook'u seçiyoruz. Sonra, üzerine yazdıktan sonra bir one_gadget'a işaret etmek için bir göreceli yazma işlemi kullanacağız.

Bunun için bir parça alıp onu sıralanmamış bin'e koyarak başlarız:

uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate

puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);

Bu parçada bir UAF kullanarak unsorted_bin_ptr->bk'yi __malloc_hook adresine işaret etmek için kullanıyoruz (bu daha önce brute force ile yapıldı).

Bu saldırı, unsorted bin'i bozar (bu nedenle küçük ve büyük de). Bu nedenle şimdi sadece hızlı binlerden tahsisleri kullanabiliriz (daha karmaşık bir program başka tahsisler yapabilir ve çökebilir), bunu tetiklemek için aynı boyutta tahsis yapmalıyız ya da program çöker.

Bu nedenle, __malloc_hook'u unsorted_bin_ptr->bk'ye ayarladıktan sonra main_arena + 0x68'e yazmayı tetiklemek için sadece malloc(0x80) yapmamız gerekiyor.

Adım 3: __malloc_hook'u system'e ayarlayın

Adım birde __malloc_hook içeren bir parçayı kontrol etmeyi bitirdik (değişken malloc_hook_chunk içinde) ve ikinci adımda buraya main_arena + 0x68 yazmayı başardık.

Şimdi, malloc_hook_chunk içindeki kısmi bir yazmayı kötüye kullanarak oraya yazdığımız libc adresini (main_arena + 0x68) kullanarak bir one_gadget adresine işaret etmek için.

İşte burada 12 bitlik rastgeleliği brute force etmek gerekiyor (daha fazla bilgi için how2heap örneğine bakın).

Son olarak, doğru adres üzerine yazıldığında, malloc'ı çağırın ve one_gadget'ı tetikleyin.

Referanslar

HackTricks'i Destekleyin

Last updated