hacktricks/binary-exploitation/libc-heap/house-of-orange.md

9.6 KiB
Raw Blame History

House of Orange

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

Kod

Amaç

  • malloc_printerr fonksiyonunu kötüye kullanmak

Gereksinimler

  • Üst parça boyutunu üzerine yaz
  • Libc ve heap sızıntıları

Arka Plan

Gerekli arka plan bilgileri bu örneğin yorumlarından** alınmıştır:**

Önceki libc sürümlerinde, malloc_printerr fonksiyonu çağrıldığında, _IO_list_all içinde depolanan _IO_FILE yapılarının listesini dolaşır ve aslında bu yapıdaki bir komut işaretçisini çalıştırırdı.
Bu saldırı, sahte bir _IO_FILE yapısı oluşturacak ve bu yapının _IO_list_all'a yazılmasına neden olacak. Sonra malloc_printerr'ın çalışmasına neden olacak olan _IO_FILE yapılarının atlamalı tablosunda sakladığımız herhangi bir adresi çalıştıracak.

Saldırı

Saldırı, sıralanmamış parçada üst parçayı elde etmekle başlar. Bu, malloc'u mevcut üst parça boyutundan daha büyük ancak mmp_.mmap_threshold'den (varsayılan olarak 128K) daha küçük bir boyutta çağırarak başarılır, aksi takdirde mmap tahsili tetiklenir. Üst parça boyutu değiştirildiğinde, üst parça + boyutunun sayfa hizalanmış olması ve üst parça prev_inuse bitinin her zaman ayarlı olması önemlidir.

Üst parçayı sıralanmamış parçaya almak için, üst parçayı oluşturmak için bir parça tahsis edin, üst parça boyutunu (tahsis edilen parçada taşma ile) değiştirin, böylece üst parça + boyutunun sayfa hizalanmış ve prev_inuse biti ayarlı olacak şekilde yapın. Daha sonra, yeni üst parça boyutundan daha büyük bir parça tahsis edin. Üst parçayı sıralanmamış parçaya almak için asla free çağrılmaz.

Eski üst parça şimdi sıralanmamış parçada. İçindeki verileri okuyabiliyorsak (muhtemelen taşmaya neden olan bir zayıflıktan dolayı), libc adreslerini sızdırmak ve _IO_list_all adresini almak mümkündür.

Sıralanmamış parça saldırısı, taşmayı kötüye kullanarak topChunk->bk->fwd = _IO_list_all - 0x10 yazarak gerçekleştirilir. Yeni bir parça tahsis edildiğinde, eski üst parça bölünecek ve sıralanmamış parçaya bir işaretçi yazılacaktır. _IO_list_all'a.

Bir sonraki adım, eski üst parça boyutunu küçültmek ve küçük bir parça içine sığacak şekilde ayarlamaktır, özellikle boyutunu 0x61 olarak ayarlamaktır. Bu iki amaçla hizmet eder:

  1. Küçük Parça 4'e Ekleme: malloc, sıralanmamış parçayı taradığında ve bu parçayı görürse, boyutu küçük olduğundan onu küçük parça 4'e eklemeye çalışacaktır. Bu, parçanın, _IO_list_all'ın FD işaretçisinin konumu olan küçük parça 4 listesinin başına gelmesine neden olur, çünkü sıralanmamış parça saldırısıyla **_IO_list_all`**'a yakın bir adres yazdık.
  2. Malloc Kontrolünü Tetikleme: Bu parça boyutu manipülasyonu, malloc'un iç kontrolleri yapmasına neden olacaktır. Sahte ileri parça boyutunu kontrol ettiğinde, bu boyut sıfır olacağından bir hata tetikler ve malloc_printerr'ı çağırır.

Küçük parça manipülasyonu, parçanın ileri işaretçisini kontrol etmenizi sağlar. _IO_list_all ile çakışma, sahte _IO_FILE yapısını oluşturmak için kullanılır. Yapı, libc'de iç kontrolleri geçen _IO_write_base ve _IO_write_ptr gibi önemli alanları içerecek şekilde dikkatlice oluşturulur. Ayrıca, sahte yapı içinde bir atlamalı tablo oluşturulur, burada bir komut işaretçisi, keyfi kodun (örneğin, system fonksiyonu) çalıştırılabileceği adres olarak ayarlanır.

Tekniğin geri kalanını özetlemek gerekirse:

  • Eski Üst Parçayı Küçült: Eski üst parçanın boyutunu 0x61 olarak ayarlayın ve küçük bir parçaya sığacak şekilde ayarlayın.
  • Sahte _IO_FILE Yapısını Kur: Eski üst parçayla çakışan sahte _IO_FILE yapısını oluşturun ve akış kontrolünü ele geçirin.

Bir sonraki adım, şu anda sıralanmamış parçada bulunan eski üst parçayla çakışan sahte _IO_FILE yapısını oluşturmaktır. Bu yapının ilk baytları dikkatlice oluşturulur ve yürütülecek bir komuta (örneğin, "/bin/sh") bir işaretçi içerir.

Sahte _IO_FILE yapısındaki ana alanlar, _IO_write_base ve _IO_write_ptr gibi, libc'de iç kontrolleri geçen değerlere ayarlanır. Ayrıca, sahte yapı içinde bir atlamalı tablo oluşturulur, burada bir komut işaretçisi, keyfi kodun çalıştırılabileceği adres olarak ayarlanır. Genellikle, bu, system fonksiyonunun adresi veya kabuk komutlarının çalıştırılabileceği başka bir fonksiyonun adresi olacaktır.

Saldırı, malloc'a yapılan bir çağrı, manipüle edilmiş _IO_FILE yapısı üzerinden kodun yürütülmesini tetiklediğinde doruğa ulaşır. Bu, genellikle bir kabukun başlatılmasına veya başka kötü amaçlı bir yükün yürütülmesine neden olacak olan keyfi kod yürütülmesine izin verir.

Saldırının Özeti:

  1. Üst parçayı ayarlayın: Bir parça tahsis edin ve üst parça boyutunu değiştirin.
  2. Üst parçayı sıralanmamış parçaya zorla: Daha büyük bir parça tahsis edin.
  3. Libc adreslerini sızdırın: Zayıflıktan yararlanarak sıralanmamış parçadan okuyun.
  4. Sıralanmamış parça saldırısını gerçekleştirin: Taşma kullanarak _IO_list_all'a yazın.
  5. Eski üst parçayı küçült: Küçük bir parçaya sığacak şekilde boyutunu ayarlayın.
  6. Sahte _IO_FILE yapısını kurun: Akış kontrolünü ele geçirmek için sahte bir dosya yapısı oluşturun.
  7. Kod yürütme tetikleyin: Saldırıyı yürütmek ve keyfi kod çalıştırmak için bir parça tahsis edin.

Bu yaklaşım, free doğrudan çağrılmadan kod yürütme sağlamak için heap yönetimi mekanizmalarını, libc bilgi sızıntılarını ve heap taşmalarını kötüye kullanır. Sahte _IO_FILE yapısını dikkatlice oluşturarak ve doğru konuma yerleştirerek, saldırı standart bellek tahsisi işlemleri sırasında kontrol akışını ele geçirebilir. Bu, keyfi kodun yürütülmesine olanak tanır ve genellikle bir kabuk veya diğer kötü amaçlı faaliyetlerin yürütülmesine neden olabilir.

Referanslar

AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Red Team Expert) ile!

HackTricks'ı desteklemenin diğer yolları: