House of Orange
Last updated
Last updated
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)
Bir örneği https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_orange.c adresinde bulabilirsiniz.
Sömürü tekniği bu yamanın içinde düzeltildi, bu nedenle artık çalışmıyor (2.26'dan önce çalışıyordu).
Daha fazla yorumla aynı örnek https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html adresinde.
malloc_printerr
fonksiyonunu kötüye kullanmak.
Üst parça boyutunu geçersiz kılmak.
Libc ve heap leak'leri.
Bu örnekten** bazı gerekli arka plan:**
Esas mesele, eski libc sürümlerinde malloc_printerr
fonksiyonu çağrıldığında, _IO_list_all
içinde saklanan _IO_FILE
yapılarına ait bir liste üzerinden döngüye girmesi ve aslında o yapıda bir talimat işaretçisini çalıştırmasıdır.
Bu saldırı, _IO_list_all
'a yazacağımız sahte bir _IO_FILE
yapısı oluşturacaktır ve malloc_printerr
'in çalışmasına neden olacaktır.
Sonra, _IO_FILE
yapılarına kaydettiğimiz herhangi bir adresi çalıştıracaktır ve kod yürütmesi elde edeceğiz.
Saldırı, sıralanmamış kutu içindeki üst parçayı elde etmeyi başarmakla başlar. Bu, malloc
'ı mevcut üst parça boyutundan daha büyük ama mmp_.mmap_threshold
'dan (varsayılan 128K) daha küçük bir boyutla çağırarak elde edilir; aksi takdirde mmap
tahsisi tetiklenecektir. Üst parça boyutu değiştirildiğinde, üst parça + boyut'un sayfa hizalı olduğundan ve üst parçanın prev_inuse bitinin her zaman ayarlandığından emin olmak önemlidir.
Sıralanmamış kutu içindeki üst parçayı elde etmek için, üst parçayı oluşturmak için bir parça tahsis edin, üst parça boyutunu (tahsis edilen parçada bir taşma ile) değiştirin, böylece üst parça + boyut sayfa hizalı ve prev_inuse bit ayarlanmış olsun. Sonra, yeni üst parça boyutundan daha büyük bir parça tahsis edin. Üst parçayı sıralanmamış kutuya almak için free
'in asla çağrılmadığını unutmayın.
Eski üst parça artık sıralanmamış kutuda. İçinde veri okuyabiliyorsak (muhtemelen taşmaya neden olan bir zafiyet nedeniyle), libc adreslerini sızdırmak ve _IO_list_all adresini elde etmek mümkündür.
Sıralanmamış kutu saldırısı, taşmayı kötüye kullanarak topChunk->bk->fwd = _IO_list_all - 0x10
yazılarak gerçekleştirilir. Yeni bir parça tahsis edildiğinde, eski üst parça bölünecek ve sıralanmamış kutuya bir işaretçi yazılacaktır.
Sonraki adım, eski üst parçanın boyutunu küçük bir kutuya sığacak şekilde küçültmektir; özellikle boyutunu 0x61 olarak ayarlamaktır. Bu iki amaca hizmet eder:
Küçük Kutular 4'e Ekleme: malloc
sıralanmamış kutuyu taradığında ve bu parçayı gördüğünde, küçük boyutu nedeniyle onu küçük kutu 4'e eklemeye çalışacaktır. Bu, parçanın, _IO_list_all
parçasının FD işaretçisinin bulunduğu küçük kutu 4 listesinin başına yerleşmesine neden olur; çünkü sıralanmamış kutu saldırısı yoluyla _IO_list_all
'da yakın bir adres yazdık.
Malloc Kontrolünü Tetikleme: Bu parça boyutu manipülasyonu, malloc
'ın iç kontrolleri gerçekleştirmesine neden olacaktır. Yanlış ileri parça boyutunu kontrol ettiğinde, bu sıfır olacağından bir hata tetikler ve malloc_printerr
'i çağırır.
Küçük kutunun manipülasyonu, parçanın ileri işaretçisini kontrol etmenizi sağlar. _IO_list_all ile olan örtüşme, sahte bir _IO_FILE yapısını oluşturmak için kullanılır. Yapı, libc'deki iç kontrolleri geçecek şekilde _IO_write_base
ve _IO_write_ptr
gibi anahtar alanları içerecek şekilde dikkatlice hazırlanır. Ayrıca, sahte yapının içinde, keyfi kodun (örneğin, system
fonksiyonu) çalıştırılabileceği adrese ayarlanmış bir talimat işaretçisi bulunan bir atlama tablosu oluşturulur.
Tekniğin kalan kısmını özetlemek gerekirse:
Eski Üst Parçayı Küçültün: Eski üst parçanın boyutunu 0x61 olarak ayarlayın, böylece küçük bir kutuya sığsın.
Sahte _IO_FILE
Yapısını Kurun: Eski üst parçayı sahte _IO_FILE yapısıyla örtüştürün ve alanları uygun şekilde ayarlayarak yürütme akışını ele geçirin.
Sonraki adım, sıralanmamış kutuda bulunan eski üst parça ile örtüşen sahte bir _IO_FILE yapısı oluşturmaktır. Bu yapının ilk baytları, çalıştırılacak bir komuta (örneğin, "/bin/sh") işaret eden bir işaretçi içerecek şekilde dikkatlice hazırlanır.
Sahte _IO_FILE yapısındaki anahtar alanlar, libc'deki iç kontrolleri geçecek şekilde ayarlanır. Ayrıca, sahte yapının içinde, keyfi kodun çalıştırılabileceği adrese ayarlanmış bir talimat işaretçisi bulunan bir atlama tablosu oluşturulur. Genellikle bu, system
fonksiyonunun adresi veya shell komutlarını çalıştırabilen başka bir fonksiyonun adresi olacaktır.
Saldırı, malloc
çağrısının manipüle edilmiş _IO_FILE yapısı aracılığıyla kodun çalıştırılmasını tetiklemesiyle sonuçlanır. Bu, genellikle bir shell'in başlatılması veya başka bir kötü niyetli yükün çalıştırılmasıyla sonuçlanan keyfi kod yürütmesine olanak tanır.
Saldırının Özeti:
Üst parçayı ayarlayın: Bir parça tahsis edin ve üst parça boyutunu değiştirin.
Üst parçayı sıralanmamış kutuya zorlayın: Daha büyük bir parça tahsis edin.
Libc adreslerini sızdırın: Zafiyeti kullanarak sıralanmamış kutudan okuyun.
Sıralanmamış kutu saldırısını gerçekleştirin: Taşma kullanarak _IO_list_all'a yazın.
Eski üst parçayı küçültün: Boyutunu küçük bir kutuya sığacak şekilde ayarlayın.
Sahte _IO_FILE yapısını kurun: Kontrol akışını ele geçirmek için sahte bir dosya yapısı oluşturun.
Kod yürütmesini tetikleyin: Saldırıyı gerçekleştirmek ve keyfi kodu çalıştırmak için bir parça tahsis edin.
Bu yaklaşım, heap yönetim mekanizmalarını, libc bilgi sızıntılarını ve heap taşmalarını kullanarak kod yürütmesini elde etmeyi amaçlar. Sahte _IO_FILE yapısını dikkatlice oluşturarak ve doğru konuma yerleştirerek, saldırı standart bellek tahsis işlemleri sırasında kontrol akışını ele geçirebilir. Bu, keyfi kodun yürütülmesini sağlar ve potansiyel olarak bir shell veya diğer kötü niyetli faaliyetlerle sonuçlanabilir.
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)