資安 pwn 技術研究所:Heap pwn 篇 (4) – 技術方法

談到方法,例如傳統 stack pwn 會有 buffer overflow、format string、ROP 之類的方法和技術。而 heap pwn 則和 stack pwn 有著一系列很不同的方法。這篇做個列表,方便檢索。各方法的詳細,在此不贅。可查找 reference 中的連結參考。

~ 基本功 ~

名稱概念目的參考
Double Free1. Free 了兩次同一個 pointer
2. 然後 alloc 時,這個 pointer 就會被 alloc 兩次。
3. free 其中一個,剩下的便可以有個 editable freed chunk。
Editable Freed Chunk
Heap Consolidation1. 修改 chunk metadata,使它以為是一個 freed chunk。
2. 調用 free(..),使 consolidation 發生
3. 再 alloc,便會多一個 pointer 指向同一個 chunk。
4. 同 double free:都是有個 editable freed chunk。
Editable Freed Chunk
Use After Free純粹將一個 free(..) 的 pointer 寫入資料Editable Freed Chunk
Unlink將兩個 freed chunk 的 FD BK 改寫,達到 arbitrary write 的效果Arbitrary Alloc
Arbitrary Write
Off By One字串寫入時溢出 1 byte。導致在 heap 上可以偽造下一節的 prev_inuse,使到偽造出 freed 效果。然後導致prev_size 可用;但也可以偽造 prev_size。prev_inuse overwrite (faked free)
prev_size overwrite
https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/off-by-one/
Heap Grooming /
also aka “Heap Feng Shui"
原意是指出 alloc / free 都是可預測的有效控制 alloc / free 來自 BlackHat 2007 發佈
https://www.blackhat.com/presentations/bh-europe-07/Sotirov/Presentation/bh-eu-07-sotirov-apr19.pdf
Fake Chunk
偽造節
在 stack 或用其他變數偽造成 chunk 格式。Arbitrary Alloc
Arbitrary Write
Editable Freed Chunk

~ 元素技 ~

名稱概念目的
Fast bin Attack利用 fastbin 的 single linked-list 原理。改寫 FD 指向目的地址。然後 fastbin alloc 就會派出了目的地址。Arbitrary Alloc
Unsorted bin Attack利用 unsortedbin 的 doubly linked-list 原理。改寫 FD BK。然後 unsorted bin alloc 就會派出目的地址。Arbitrary Alloc
Large bin Attack類似 fastbin 和 unsortedbin attacks。有不同的是,largebin 會按大小排列擺放。所以當有個新的 freed chunk 排入時,就會有個 arbitrary write 動作。Arbitrary Alloc
Arbitrary Write
Tcache Attack和 fastbin attack 類似。Arbitrary Alloc

~ 組合技 ~

名稱概念目的參考
House of Spirit用 Fake Chunk 偽造節,再調用 free(..)。再 alloc 就會派出這個偽造節。Arbitrary Alloc
House of Lore類似 House of Spirit。不過是連結到 small bin / large bin 的 FD BK pointer 上。同樣 alloc 就會派出去。Arbitrary Alloc
House of Force改寫 heap wilderness value;再 alloc 一個很大的 block 作對位作用。然後下一個 alloc 就會派出 arbitrary alloc,例如 Stack Alloc 或 BSS Alloc。Arbitrary Alloc
House of Einherjar類似 House of Spirit 和 House of Lore。不同的是利用向後合併。用一個 controlled chunk 控制節地址上接駁了目的地址。然後改寫了 metadata,致使 free(..) 的時候觸發向後合併 consolidation。然後 alloc.就會派出目的地址。Arbitrary Alloc
House of Rabbit和 House of Lore 很像,不過是用 fastbin FD pointer。fastbin 是 single linked-list。
改寫 FD 為目的地址後,alloc 一個大於 0x10000 (64K) 的節,觸發 fastbin consolidation;fastbin 就會進入 unsorted bin。然後是 unsorted bin attack。
Arbitrary Allochttps://www.kn0sky.com/?p=d22edd6b-7d44-4bd9-baea-bdecc73a8da2
House of Orange主要原理是在沒有 free(..) 的情況下,用 top chunk release 來模擬 free(..)。方法是當 top chunk 不足以 alloc,就會調用 brk,舊的 trunk 就會被 free 到 unsorted bin。然後是 unsorted bin attack。Arbitrary Allochttps://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/house-of-orange/
House of Roman是個很複雜的組合技。
用 Fake Chunk 偽造節 free 了進入 unsorted bin。然後修改 FD 和 malloc,使 malloc_hook 寫為 main_arena+88.
再將 malloc_hook 最低三字節改寫 one_gadget。調用 free(..) 或 malloc(..) 兩次,就會依次取得 malloc_printerr 和 get_shell。
Shellhttps://www.kn0sky.com/?p=761e0f77-6a76-44a9-a0d6-52d647d9e249

https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/house-of-roman/
House of Pig是個很複雜的組合技。用 largebin attack, tcache stashing unlink attack,可以得到 getshell。有不少限制,而且不易用;通常可以用較簡單的方式取代。Shellhttps://www.anquanke.com/post/id/242640#h2-3
House of Storm是很複雜的組合技。用 unsortedbin attack,將 BK 指向目的地址 addr。然後 largebin attack 將 BK 指向 addr+0x10;BK_nextsize 指向 addr-0x20+3.
然後 alloc 0x50 就會取得目的地址。
Arbitrary Allochttps://www.kn0sky.com/?p=195d505e-1310-4e6d-b9cd-20eadd7200b9
其實還有
House of Kiwi
House of Emma
House of Apple
House of Banana
House of Water
House of Tangerine
House of Botcake
House of Mind
House of gods
House of Prime
House of Chaos
普遍技術研究較少提及。未能盡錄。
這 House of xx 傳統,改名最初來自這個帖

https://github.com/Malformation/Notes/blob/master/MallocMaleficarum.txt

概念啟發來自這本書

https://en.wikipedia.org/wiki/Malleus_Maleficarum

~ Reference ~

https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_rabbit/
https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/house-of-rabbit/
https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html

《資安 pwn 不正常技術研究所》系列: