iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 25
0
Security

CTF 的三十道陰影系列 第 25

Day25: [Misc] 我從來沒想過我會害怕寫 code

前言

前兩天獲得廣大迴響,實在讓我嚇了一跳 = = 還被比喻為駭客列傳.....實在有點誇大了 (汗) ,台灣低調的強者有太多了,我只會介紹 HITCON CTF team 的成員而已 XD 今天要介紹的人物相對低調,但可說是目前 HITCON CTF team 的主要戰力
BTW,標題是台灣記者下標法 (逃),詳細由來請參考內文 XD

HITCON CTF team 的擴張

HITCON CTF team 跟忍者之里一樣,大致可以分為幾個時期,因為我們是個鬆散的組織 (?),不需要交什麼入會書或入黨宣誓,就以每年打 DEF CON CTF 為分界點來做分期

  • 開花的第一期 (2014)
    • 第一次挑戰 DEF CON CTF 的 10 名成員
    • Orange 領軍成立 HITCON CTF team
  • 勢頭的第二期 (2015)
    • 一期成員比完 DEF CON 歸國後,發掘更多對 CTF 有興趣的人才
    • angelboy 於此期加入隊伍 XD
  • 特選的第三期 (2016)
    • 一期和二期成員在台大與交大授課後,成功招募到的新血
    • 今天要介紹的 david942j 於此期加入隊伍,是這期 pwn 的最強戰力之一
      • 因為 meh 也是這期的成員 ... XDD
  • 安定的第四期 (2017)
  • 終結的第五期 (2018)
    • 這期之後就沒有新人加入了..... T___T

pusheen 的 david942j

  • 簡單介紹一下背景,id 讀音是 大衛 942 街,聽起來很像 貝克街 221 號 B 之類,不明覺厲 XDD
  • 特色是會在大頭貼上放 pusheen,家裡有一隻超大隻的 pusheen 玩偶,應該是某種放閃的象徵 (?)
  • 跟大部分的 217 成員一樣是打 ACM-ICPC 出身,但是念電機系 XD

一發入魂 One Gadget RCE

這是 david942j 在 HITCON CMT 2017 投的 talk,算是第一次出現在眾人面前上,號稱該年度最中二的標題 XDD

  • one gadget 最早是由 CTF 團隊 Dragon Sector 提出的攻擊手法,原理是在 glibc 裡面有很多會透過 execve 執行 /bin/sh、再調用外部系統指令的 assembly,當 explolit 已經得知 libc 的位之後而且可以控制 RIP 之後,就可以直接跳該位置達成 shell out,不需要再辛苦堆 stack 上的參數
    • 此技巧不只在 CTF,也很常在 real world 的 exploit 上使用
  • libc 裡面有很多個不同的 one gadget,之所以說不同,是因為 one gadget 有一些利用前提,如果 register 上或 stack 不是 NULL 時,就會被視為調用額外參數而沒辦法純粹執行 execve("/bin/sh", NULL, NULL)
  • 以前大家都是土法煉鋼,透過 objdump 列出 one gadget 之後,再逐一檢查哪個符合條件,聽起來是完全可以自動化的事情,但實際上會遭遇到一些困難 XD 詳細原理可以參考這篇 技術分析
    • 當年我也收集了一些 libc 的 one gadgets,但隨著系統環境的變化常常會不適用,就又要重新找一遍 gadget ... Orz
  • 有了 one_gadget 之後,pwn 題可以說控完 RIP 就結束啦,要剛好沒辦法滿足所有 one gadget 的條件實在太低了 XD
    • 所以現在 pwn 題開始之前先用 seccomp 之類的工具限制 execve 的調用已經是標配了......,逼大家只能做 ROP chain 或跑 shellcode T___T
  • 近兩年來搜尋 one gadget 相關的 CTF 題目,基本上全部都跟 david942j 寫的 tool 有關 XD google 搜尋也會排在第一個結果

The elf in ELF - how we use 0-day to cheat all disassemblers

此議題在 HITCON CMT 2018 初登場,講述的是在 HITCON CTF 2017 出的一道題目 天衣無縫~Fantastic Seamless Textile~ 背後使用的技術,在 2019 的台灣資安大會中也有再講過一次

  • 在 2017 做逆向分析,大部分人用的除了被 leak 出來的 IDA Pro,另外就是付費版的 IDA Pro了
    • 現在多了 ghidra 可以選擇,可喜可賀 (?)
  • 如果能騙過 IDA Pro,豈不是就無法透過人工逆向看出 binary 隱藏的 malware ?
  • talk 講述了三種技巧:
    1. 瞞天過海:disassembler 的 bug,包含 IDA Proobjdump 都會被欺騙

      • IDA Pro 7.0 已修復 QQ
    2. 天衣無縫:Linux kernel 0-daybug

      • 原理是利用 Linux kernel 計算 AT_PHDR 的 bug,造成傳遞給 user space 從 ld.so 讀取 binary 時的結果與真實的情況不一致

    3. 偷天換日:Cheating ELF interpreter (ld.so)

      • 構造包含複數 PT_PHDR 的 elf,導致 ld.so 在讀取 elf 時執行到隱藏的區段

DEFCON CTF 的辛酸血淚

  • 這是今年和 turkey, lyc 在 HITCON 合講的一場 talk,內容可以參考這份 投影片
  • HITCON CTF team 缺新血阿 QQ 不要讓第五期真的變成終結的第五期.....T___T
  • 有興趣的可以報名參加兩天後的 HITCON CTF 2019 Quals,結束後跟我們分享你的解題經過 XD

其他工具

除了上述兩個以外 talk 以外,david942j 也寫了不少 CTFer 常用的工具:

1. seccomp-tools

  • 前面提到因為 one gadget 太好用了,現在 pwn 的題目都會透過 seccomp 限制 syscall
  • 但 seccomp 的調用在逆向時很不直觀也不好理解,搞得大家解 pwn 題都要先煩燥一陣子......
  • https://github.com/david942j/seccomp-tools
    • seccomp 變成直觀的 if-else pseudo code 了,再看不懂也沒辦法了 = =
    • 結果如下:
    #  line  CODE  JT   JF      K
    # =================================
    #  0000: 0x20 0x00 0x00 0x00000000  A = sys_number
    #  0001: 0x15 0x00 0x01 0x00000002  if (A != open) goto 0003
    #  0002: 0x06 0x00 0x00 0x00000000  return KILL
    #  0003: 0x15 0x00 0x01 0x00000101  if (A != openat) goto 0005
    #  0004: 0x06 0x00 0x00 0x00000000  return KILL
    #  0005: 0x15 0x00 0x01 0x0000003b  if (A != execve) goto 0007
    #  0006: 0x06 0x00 0x00 0x00000000  return KILL
    #  0007: 0x15 0x00 0x01 0x00000038  if (A != clone) goto 0009
    #  0008: 0x06 0x00 0x00 0x00000000  return KILL
    #  0009: 0x15 0x00 0x01 0x00000039  if (A != fork) goto 0011
    #  0010: 0x06 0x00 0x00 0x00000000  return KILL
    #  0011: 0x15 0x00 0x01 0x0000003a  if (A != vfork) goto 0013
    #  0012: 0x06 0x00 0x00 0x00000000  return KILL
    #  0013: 0x15 0x00 0x01 0x00000055  if (A != creat) goto 0015
    #  0014: 0x06 0x00 0x00 0x00000000  return KILL
    #  0015: 0x15 0x00 0x01 0x00000142  if (A != execveat) goto 0017
    #  0016: 0x06 0x00 0x00 0x00000000  return KILL
    #  0017: 0x06 0x00 0x00 0x7fff0000  return ALLOW

2. pwntools-ruby

  • 現在做 pwn 題的 10 個裡面有 9 個用 pwntools,剩下一個應該就是 david942j ... XD
    • 是 HITCON CTF team 中唯一專職 pwner,但用 ruby 寫 exploit
    • 導致某種程度上的分工困難 QQ 還好通常也不需要分工 david942j 會獨自把題目秒殺 (逃
  • 嚴格來說不是 david942j 的 project,最早發起的是 peter50216,但 david942j 應該是使用頻率最多的 (?)
    • peter50216 is our god. <(_ _)>
  • https://github.com/peter50216/pwntools-ruby

小結

最後解釋一下,今天的標題是來自於在 david942j 當年發過的一篇 FB .... XD

事件的後續變成:

「david942j 只能對付二次元的bug,好可悲」
「可是我有三次元的女朋友」

╰(〒皿〒)╯

0x18: HITCON CTF 2017 Misc 274 Two

今天這題是 david942j 在寫 one_gadget tool 的時候順便出的題目,藉此來推銷自己的 one_gadget XDD


題目故意設計成 one gadget 無法使用的環境,但又沒辦法有夠長的 stack overflow 做 ROP,只能剛好蓋到 ret 和 ret + 8,只能控制兩次 RIP

這題的環境能用的 one gadget 有:

0x4557a execve("/bin/sh", rsp+0x30, environ)
constraints:
  [rsp+0x30] == NULL

0xcde41 execve("/bin/sh", r15, r13)
constraints:
  [r15] == NULL || r15 == NULL
  [r13] == NULL || r13 == NULL

0xce0e1 execve("/bin/sh", [rbp-0x78], [rbp-0x50])
constraints:
  [[rbp-0x78]] == NULL || [rbp-0x78] == NULL
  [[rbp-0x50]] == NULL || [rbp-0x50] == NULL

0xf1651 execve("/bin/sh", rsp+0x40, environ)
constraints:
  [rsp+0x40] == NULL

0xf24cb execve("/bin/sh", rsp+0x60, environ)
constraints:
  [rsp+0x60] == NULL

上述條件一個都不能用,不是 stack 上剛好有渣渣,就是 register 故意被設值導致無法使用

直觀的想法是:

  1. 先想辦法跳一個可以控 register 的 gadget
  2. 再跳上述的 one gadget
  3. shell out

沒錯這題就是這麼樸實無華且枯燥 ... XD 要在茫茫的 libc 的大海中符合兩者的 gadget,如果不用 david942j 的 one_gadget,在檢查每個可用的 one gadget 條件時就會花去很多時間.....

  • 但有了 one gadget 之後可以說一目了然 XD

最後解法其實滿多種的,可以參考當時 yuawn (現在是 balsn 的成員) 的解法

  1. 先找到某個 one_gadget +8 的位置,只需要控制 r9rdx 就可以成功執行 execve("/bin/sh", NULL, NULL);
  2. 發現 malloc 完會將 r9 和 rdx 設成 0
  3. shell out

上一篇
Day24: [Web] 橘之呼吸
下一篇
Day26: [Reverse] 能坐著,就不要站著,能躺著,就不要坐著
系列文
CTF 的三十道陰影31

1 則留言

0
mlck970677
iT邦新手 5 級 ‧ 2019-10-18 14:30:53

pusheen 的 david942j
簡單介紹一下背景,id 讀音是 大衛 924 街,聽起來很像 貝克街 221 號 B 之類,不明覺厲 XDD
大衛942街吧!XD

0xddaa iT邦新手 5 級‧ 2019-10-18 21:25:34 檢舉

fixed. QQ

我要留言

立即登入留言