8.3 KiB
House of Roman
{% hint style="success" %}
AWS Hacking'ı öğrenin ve uygulayın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking'ini öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- 💬 Discord grubuna katılın veya telegram grubuna katılın veya bizi Twitter 🐦 @hacktricks_live** takip edin.**
- Hacking püf noktalarını paylaşarak PR'ler göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.
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
- Örneği https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c adresinde bulabilirsiniz.
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çinmain_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ı birfd
,relative_offset_heap
'e işaret ediyorrelative_offset_heap
,fake_libc_chunk
'tan uzaklık olarak bir ofsete sahiptir ve bu damain_arena + 0x68
'i işaret eden bir işaretçi içerirfastbin_victim.fd
'nin son baytını değiştirerekfastbin_victim
'ımain_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:
{% content-ref url="unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}
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ı).
{% hint style="danger" %} 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. {% endhint %}
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
- 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/
{% hint style="success" %}
AWS Hacking'i öğrenin ve uygulayın:HackTricks Eğitimi AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve uygulayın: HackTricks Eğitimi GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @hacktricks_live** takip edin.**
- Hacking püf noktalarını paylaşarak HackTricks ve HackTricks Cloud github depolarına PR gönderin.