HackTheBox-Machines Hunting Writeup
Background Knowledge
這題要考的技巧叫做 “Egg Hunting”,使一種在記憶體中搜尋並找到特定資料的技術,主要是應用於漏洞利用場景,尤其是在無法確定目標(“egg”)具體位置的情況下。
- Egg 通常是一段特定的 shellcode 或是資料,是攻擊者希望執行或是利用的目標,可能放在 Heap、Data Section 或其他地方。
- Egg Hunter 是一段很輕量的程式碼,會遍歷記憶體區域找尋特定標記,標記通常是一段字串,找到標記後就會跳轉到該位置執行。
Enumeration
file
可以看到檔案是 32-bit x86 ELF,然後沒有 Canary 跟 PIE。
程式主邏輯如下:
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
以及 getRandomAddr()
:
1 | int getRandomAddr() |
可以看到程式先拿一個隨機地址,然後會把拿到的隨機地址當成其中一個參數做 mmap,我們可以對應一下各個參數的意義:
1 | void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset); |
- RandomAddr: 映射的起始地址
- 0x1000: 映射區域大小,約 4KB
- 3 (PROT_READ | PROT_WRITE): PROT_READ (1): 可讀 + PROT_WRITE (2): 可寫。
- 49 (MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS): MAP_PRIVATE (0x02): 私有映射,對映射區域的更改不會反映到檔案中 + MAP_FIXED (0x10): 強制映射到 RandomAddr。如果該地址無法使用,會導致映射失敗 + MAP_ANONYMOUS (0x20): 匿名映射,無需關聯檔案
- -1: 表示匿名映射,因為不需要關聯任何檔案。
- 0: 偏移量為 0,對於匿名映射無意義。
然後如果映射成功就把 flag 複製過去,並且把原本的 flag 清空,接著他限制程式可以執行的系統呼叫來建置沙盒,然後 mmap 一段記憶體讓我們可以執行 shellcode。
Exploitation
首先是我們的 egg hunter:
1 | setup: |
因為隨機地址的範圍是 [0, 0x5FFFFFFF],所以一開始 setup 的時候我們先將 edx 設為 0x5fffffff,然後我們將地址對齊到頁邊界,這樣才可以確保進到 test_next 之後我們可以在加一後進到下一頁的開頭,然後 pusha
保存所有暫存器的狀態,接著設定好暫存器呼叫 syscall_access
來確定該段記憶體是否可以訪問,檢查返回值是否表示記憶體無效,無效就看下一頁,如果有效就比對字串,不匹配就 test_next 檢查下一地址,找到的話就用 sys_write
輸出後續字串。
Exploit
1 | import sys |
References
Pwned
- Title: HackTheBox-Machines Hunting Writeup
- Author: kazma
- Created at : 2024-11-17 17:54:48
- Updated at : 2024-11-17 19:44:48
- Link: https://kazma.tw/2024/11/17/HackTheBox-Machines-Hunting-Writeup/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments