iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 12
0
Security

CTF 的三十道陰影系列 第 12

Day12: [Pwn] HITCON CTF

HITCON CTF

HITCON CTF 是台灣第一個舉辦的 CTF 國際賽事,由 CTF 隊伍 HITCON 於 2014 年第一次主辦,前身是 HITCON Wargame,但因為考慮到每年玩 Wargame 就沒辦法好好聽議程,而且配合 conference 舉辦比賽也會影響 CTF 的題目品質,因此在 2014 年開始變成獨立事件,並更名為 HITCON CTF,開放給全世界所有的 CTF 隊伍參賽,而不只有參加 conference 的會眾

What is HITCON ?

參加 CTF 的 HITCON 隊伍並不是 HITCON,外界經常會有混淆的情況,因為提到 HITCON 可能會有三種不同的解釋,比斯斯還多一種:

  • Hackers In Taiwan Conference
    • Category: 事件
    • https://hitcon.org/
    • 在台灣舉辦的資安研討會,也是 HITCON 這個名詞最早的由來,至今已經舉辦了第十五年,也是台灣資安圈內的年度盛會
  • 台灣駭客協會 (Hackers In Taiwan)
    • Category: 組織
    • https://hacker.org.tw
    • HITCON 早期由台灣資安圈的各界的前輩輪流當總召主辦,但隨著大家事業有成以及 HITCON 規模的成長,所以專門成立一個組織來籌畫 HITCON 相關的事務
      • 但主要由來自各方的志工負責 HITCON 各種繁雜的工作 (respect)
    • 除了 HITCON 以外也舉辦各種資安項目,是推動台灣資安領域的重要推手
  • HITCON CTF Team
    • Category: 組織
    • https://ctftime.org/team/8299
    • HITCON CTF Team 註冊 CTF 隊伍名稱太冗了,所以都用 HITCON 註冊隊伍
    • 最早成立主要由台大 217、交大 CRAX 兩隻 CTF 隊伍合併組成,在 Orange 的帶領之下成軍挑戰 DEFCON CTF 的隊伍
    • HITCON CTF Team 向 HIT 申請經費,HIT 贊助 HITCON CTF Team 參加 CTF 比賽

解決完 「一個 HITCON,各自表述」 的問題之後,再回頭看一下 HITCON CTF 的定位,可以大致明白:HITCON CTF 是由 HITCON CTF Team 籌辦、HIT 出資,在 HITCON 大義之下舉辦的一場 CTF 競賽......,我快要不知道自己在寫什麼了,這個問題就先打住好了 XDD

HITCON CTF 編年史

  • HITCON 2014,台灣第一次舉辦國際級的 CTF 賽事
  • HITCON 2015 Final,台灣第一次舉辦國際級的 Attack & Defense 賽事
  • HITCON 2015,成為 LegitBS 舉辦的 DEFCON CTF 種子賽事
  • HITCON 2016 Final,Orange 出的 webrop 引發大家的鬥志,各隊伍陸續挖到 SugarCRM 的 0day
  • HITCON CTF 2017 Quals 在 ctftime.org 評價達到 98.32,是當年最高分數
  • HITCON CTF 2017 Final,以 Capture The Food 為主題,結合台灣美食和 CTF 題目,獲得參賽隊伍的一致好評
  • HITCON CTF 2018 沒有舉辦 Final,獲得國際隊伍的各種怨嘆 (?)

最後宣傳一下,今年的 HITCON CTF 2019 會在 Oct 12 10:00 AM ~ Oct 14 10:00 AM (台灣時間) 舉行,並且今年恢復舉辦 final,請各位敬請期待 (?)

0x0b: HITCON CTF 2016 pwn 300 babyheap

HITCON CTF 經典的題目有很多,但最經典的莫過於在 HITCON CTF 2016 由 angelboy 設計的 babyheap,之所以經典的地方在於:

  • 預估分數為 100 分,預期有 100 隊會解出這題
  • 一直到放 hint 的情況下才陸續有隊伍解出,並且將題目調到 300 分,最後比賽結束只有三隊解出......XD
  • 讓 HITCON CTF 從此決定改用動態分數的主因
  • 顛覆國際上所有 CTF 隊伍對 baby 系列題目的認知

就來看一下這題是如何設計的,導致在高手雲集的情況下,還可以坑到這麼多人 (?)


題目是個 heap 基本的選單題,運行起來有四個功能:

1 . New

新增 Note,Note 的結構如下:

struct Note {
    __int64 len;
    char name[8];
    char *content;
};

malloc Note,之後輸入 len 再 malloc content 並取得內容,最後才輸入 name

  • 輸入 name 時存在 off-by-one 的漏洞會 overflow 一個 null byte
  • 已經 malloc 過還沒 Delete 之前,再次使用此功能會直接 exit 結束程式

2 . Delete

刪除 Note,照順序把 content 和 note free 掉,使用過後會在 bss 設定 flag,再次使用此功能就會直接 exit 結束程式

3 . Edit

編輯 content 的內容,使用過後會在 bss 設定 flag,再次使用此功能就會直接 exit 結束程式

4 . Exit

結束程式前會用 scanf("%2s", buf) 接收 y/n 進行確認,不等於 n 都會 exit 結束程式

這題的坑點在於,題目故意設計成一次只能操作一個 Note,即使找到 off-by-one 也無法構造 heap chunk 進行利用,由於當時的時空背景在 Ubuntu 14.04 當道、16.04 剛 release 的階段,在還沒放提示之前完全沒有人知道 16.04 glibc 實作 scanf 時,使用的 buffer 改成在 heap chunk 上操作......XD,也就是說,如果一開始先透過 4. Exit 的 scanf 得到足夠長的 input 之後,heap 上就會多出一個大小為 0x410 的 chunk 可以使用,可以利用這邊來偽造 heap chunk,配合 off-by-one 的漏洞和 Delete 的功能,可以達成 fastbin attack

具體步驟如下:

  1. 輸入選單 4. Exit 進入 scanf,結尾構造 heap chunk 的 prev_size 和 size,大小控制在 fastbin chunk 供後面利用,開頭塞 n 避免結束程式
  2. 使用 1. New 得到 note,並且在輸入 name 時用 off-byte-one 將 content 的 ptr 結尾從 \x10 改成 \x00
  3. 使用 2. Delete 移除 note,在 free content 時因為 ptr 少了 0x10,會把 scanf 構造的 fake size 取出當成 fake chunk free 掉放進 fastbin
  4. 再次使用 1. New 得到 note,由於 fastbin attack 我們在 malloc content 時已經可以取到我們想改的 buf 位置

這題後續還要利用 pwn 題的一些小技巧,像是將 atoi 改成 printf 做 fmt string attack,才能 leak address 最後 shell out,但就不算是難倒大家的原因了,主因還是 scanf 操作 heap 的行為沒人想得到,這也是首次往 glibc 內部的行為做文章的 heap 題,讓 heap exploit 的難度又上升了一個台階,也讓 CTF 越來越沒有人性了 (X)


上一篇
Day11: [Pwn] Tom Cruise of CTF
下一篇
Day13: [Misc] DEF CON CTF
系列文
CTF 的三十道陰影31

尚未有邦友留言

立即登入留言