hacktricks/binary-exploitation/heap/large-bin-attack.md

5.3 KiB
Raw Permalink Blame History

Büyük Kova Saldırısı

Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'i desteklemenin diğer yolları:

Temel Bilgiler

Büyük kova nedir hakkında daha fazla bilgi için bu sayfaya bakın:

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

Büyük kova saldırısına dair harika bir örnek how2heap - büyük kova saldırısı içinde bulunabilir.

Temelde burada, en son "güncel" glibc sürümünde (2.35), P->bk_nextsize kontrol edilmediği için belirli koşullar sağlandığında büyük bir kova parçasının değeri ile bir adresin değiştirilebileceğini görebilirsiniz.

Bu örnekte aşağıdaki koşulları bulabilirsiniz:

  • Bir büyük parça ayrıldı
  • İlk parçadan daha küçük ancak aynı dizindeki bir büyük parça ayrıldı
  • Binde ilk sıraya gitmesi gerektiği için daha küçük olmalıdır
  • (Üst parçayla birleşmeyi önlemek için bir parça oluşturulur)
  • Ardından, ilk büyük parça serbest bırakılır ve ondan daha büyük yeni bir parça ayrılır -> Parça1 büyük kovaya gider
  • Ardından, ikinci büyük parça serbest bırakılır
  • Şimdi, zafiyet: Saldırgan chunk1->bk_nextsize'ı [hedef-0x20] olarak değiştirebilir
  • Ardından, 2. parçadan daha büyük bir parça ayrılır, bu nedenle parça2, adresi chunk1->bk_nextsize->fd_nextsize'ı parça2'nin adresi ile üzerine yazarak büyük kovaya eklenir

{% hint style="success" %} Diğer potansiyel senaryolar bulunmaktadır, önemli olan, büyük kovaya, bir mevcut X parçadan daha küçük bir parça eklemektir, bu nedenle binde X'ten hemen önce eklenmesi gerekmekte ve X'in bk_nextsize'ını değiştirebilmemiz gerekmektedir çünkü daha küçük parçanın adresinin yazılacağı yer burasıdır. {% endhint %}

Bu, malloc'tan ilgili kod parçalarıdır. Adresin nasıl üzerine yazıldığını daha iyi anlamak için yorumlar eklenmiştir:

{% code overflow="wrap" %}

/* if smaller than smallest, bypass loop below */
assert (chunk_main_arena (bck->bk));
if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk))
{
fwd = bck; // fwd = p1
bck = bck->bk; // bck = p1->bk

victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk)
victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}

{% endcode %}

Bu, daha sonra daha büyük parçalarla hızlı bir kutu saldırısını sömürmek için libc'in global_max_fast global değişkenini üzerine yazmak için kullanılabilir.

Bu saldırının başka harika bir açıklamasını guyinatuxedo adresinde bulabilirsiniz.

Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları: