House of Roman
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Bu, sahte fastbinler, sıralanmamış_bin saldırısı ve göreli yazmalar aracılığıyla sızma olmadan RCE'ye izin veren çok ilginç bir teknikti. Ancak bu yamanmıştır.
Bir örneği https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c adresinde bulabilirsiniz.
Göreli işaretçileri kötüye kullanarak RCE
Fastbin ve sıralanmamış bin işaretçilerini düzenleyin
12 bit rastgelelik zorla kırılmalıdır (çalışma olasılığı %0.02)
Birçok chunk oluşturun:
fastbin_victim
(0x60, offset 0): Yığın işaretçisini daha sonra 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öreli offset
Sonra free(main_arena_use)
yapın, bu chunk'ı sıralanmamış listeye 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çereceği için yeni bir chunk fake_libc_chunk(0x60)
tahsis edilmiştir.
Sonra relative_offset_heap
ve fastbin_victim
serbest bırakılır.
fastbin_victim
bir fd
'ye sahip ve bu relative_offset_heap
'e işaret ediyor
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 mümkündür
Önceki eylemler için, saldırganın fastbin_victim
'in fd işaretçisini değiştirebilme yeteneğine sahip olması gerekir.
Sonra, main_arena + 0x68
o kadar ilginç değil, 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 vardır, bu nedenle bunu 0x70
hızlı bin içinde bir değer olarak sahteleyebiliriz. 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 sona erer: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)
.
(Diğer baytlar hakkında daha fazla bilgi için how2heap örneğindeki açıklamayı kontrol edin). BF çalışmazsa program sadece çökebilir (bu yüzden çalışana kadar tekrar deneyin).
Sonra, 2 malloc işlemi gerçekleştirilir, böylece 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 tane tahsis edilir.
Daha fazla bilgi için kontrol edebilirsiniz:
Unsorted Bin AttackAma temelde, chunk->bk
içinde belirtilen herhangi bir konuma main_arena + 0x68
yazmayı sağlar. 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:
Bir UAF kullanarak bu parçayı unsorted_bin_ptr->bk
'yi __malloc_hook
adresine işaret edecek şekilde ayarlayın (bunu daha önce brute force ile bulmuştuk).
Bu saldırının unsorted bin'i bozduğunu (dolayısıyla küçük ve büyük olanları da) unutmayın. Bu nedenle, şimdi yalnızca 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 çökebilir.
Dolayısıyla, __malloc_hook
'ta main_arena + 0x68
yazımını tetiklemek için __malloc_hook
'u unsorted_bin_ptr->bk
'de ayarladıktan sonra sadece şunu yapmamız gerekiyor: malloc(0x80)
Birinci adımda __malloc_hook
'u 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
'ta kısmi bir yazma işlemi suistimal ederek 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.
AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)