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
- 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
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
- Bir örneği https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c adresinde bulabilirsiniz.
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çinmain_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.
/*
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
birfd
'ye sahiptir ve burelative_offset_heap
'e işaret eder.relative_offset_heap
,main_arena + 0x68
'e işaret eden bir işaretçi içerenfake_libc_chunk
'ten uzaklık ofsetidir.fastbin_victim.fd
'nin son baytını değiştirmek,fastbin_victim
'inmain_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.
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:
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:
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_hook
'ü unsorted_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
- https://github.com/shellphish/how2heap
- https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/
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.