House of Roman

Reading time: 5 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

Temel Bilgiler

Bu, sahte fastbinler, unsorted_bin saldırısı ve göreceli yazmalar aracılığıyla sızıntı olmadan RCE'ye izin veren çok ilginç bir teknikti. Ancak bu yamanmıştır.

Kod

Hedef

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

Gereksinimler

  • Fastbin ve unsorted bin işaretçilerini düzenleyin
  • 12 bit rastgelelik zorlanmalıdır (çalışma olasılığı %0.02)

Saldırı Adımları

Bölüm 1: Fastbin Chunk __malloc_hook'a işaret ediyor

Birçok chunk oluşturun:

  • fastbin_victim (0x60, offset 0): Daha sonra heap işaretçisini LibC değerine işaret edecek şekilde düzenlemek için UAF chunk.
  • chunk2 (0x80, offset 0x70): İyi hizalama için
  • main_arena_use (0x80, offset 0x100)
  • relative_offset_heap (0x60, offset 0x190): 'main_arena_use' chunk'ındaki göreceli offset

Sonra free(main_arena_use) yapın, bu chunk'ı unsorted liste yerleştirecek ve hem fd hem de bk işaretçelerinde main_arena + 0x68'e bir işaretçi alacaktır.

Artık fd ve bk'de main_arena + 0x68'e işaret eden işaretçileri içerecek yeni bir chunk fake_libc_chunk(0x60) tahsis edilmiştir.

Sonra relative_offset_heap ve fastbin_victim serbest bırakılır.

c
/*
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 bir fd'ye sahiptir ve bu relative_offset_heap'e işaret eder.
  • relative_offset_heap, main_arena + 0x68'e işaret eden bir işaretçi içeren fake_libc_chunk'ten uzaklık ofsetidir.
  • fastbin_victim.fd'nin son baytını değiştirmek, fastbin_victim'in main_arena + 0x68'e işaret etmesini sağlamak için mümkündür.

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

Sonra, main_arena + 0x68 o kadar ilginç değildir, bu yüzden işaretçiyi __malloc_hook'a işaret edecek şekilde değiştirelim.

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

(Diğer baytlar hakkında daha fazla bilgi için how2heap örneğine bakın). BF çalışmazsa program sadece çökebilir (bu yüzden çalışana kadar tekrar başlatın).

Sonra, 2 malloc işlemi gerçekleştirilir ve 2 başlangıç hızlı bin parçası kaldırılır ve __malloc_hook: içinde bir parça almak için üçüncü bir malloc yapılır.

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

Bölüm 2: Unsorted_bin saldırısı

Daha fazla bilgi için kontrol edebilirsiniz:

Unsorted Bin Attack

Ama temelde, chunk->bk içinde belirtilen herhangi bir konuma main_arena + 0x68 yazılmasına izin verir. Ve saldırı için __malloc_hook seçiyoruz. Sonra, onu geçersiz kıldıktan sonra, bir one_gadget'e işaret etmek için göreli bir geçersiz kılma kullanacağız.

Bunun için bir chunk alarak unsorted bin'e koymaya başlıyoruz:

c
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çayı kullanarak unsorted_bin_ptr->bk'yi __malloc_hook adresine işaret edecek şekilde bir UAF kullanın (bunu daha önce brute force ile bulmuştuk).

caution

Bu saldırının unsorted bin'i bozduğunu (bu nedenle küçük ve büyük de) unutmayın. Bu yüzden artık sadece hızlı bin'den 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.

Yani, __malloc_hook'de main_arena + 0x68 yazımını tetiklemek için __malloc_hookunsorted_bin_ptr->bk'de ayarladıktan sonra sadece şunu yapmamız gerekiyor: malloc(0x80)

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

Birinci adımda __malloc_hook'ü içeren bir parçayı kontrol etmeyi başardık (değişken malloc_hook_chunk içinde) ve ikinci adımda burada main_arena + 0x68 yazmayı başardık.

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

Burada 12 bit rastgeleliği brute force ile bulmak gerekiyor (daha fazla bilgi için how2heap örneği).

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

Referanslar

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