iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 13
1
Security

CTF 的三十道陰影系列 第 13

Day13: [Misc] DEF CON CTF

DEF CON CTF

昨天先介紹了 HITCON CTF,台灣第一個世界級的 CTF 賽事,今天就來介紹一下 DEF CON CTF,DEFCON CTF 可以說是 CTF 的奧運 (都一樣沒獎金拿),每個 CTF 隊伍都以拿 DEF CON CTF 的冠軍為目標,但從 2013 年 LegitBS 接手舉辦 DEF CON CTF 以來 ,至今只有美國、韓國兩個隊伍拿到過冠軍

DEF CON

DEF CON 是一個資安研討會,在 1993 年由 Jeff Moss 發起,名稱由來是來自電影的情節,因為電影劇情中將 Les Vegas 設定成核武器攻擊的地點,因此 DEF CON 選在 Les Vegas 舉辦,一直到今年是第 27 屆都保持這個慣例

  • 原來 DEF CON 的 CON 不是指 conference ... 而且正式名稱中間要有空格,之前一直都不知道 XD
  • DEF CON 除了議程以外,會場還有非常多的活動和攤位,像是開鎖村、wifi 之類的,雖然去了很多年但一直沒機會好好參觀過 QQ
  • DEF CON 現場除了會舉辦 DEF CON CTF Final 以外,還有很多賽事進行,不過 DEF CON CTF 是歷史悠久,最受矚目的賽事
  • 參考資料:https://en.wikipedia.org/wiki/DEF_CON

Organizers

舉辦 DEF CON CTF 是一件非常辛苦的工作,因此每隔幾年就會換人舉辦,目前的主辦方是 Order of the Overflow,台灣第一次參加是在 2014 年,當時的主辦方是 LegitBS,LegitBS 在 2013 ~ 2017 這五年之間,為 DEF CON CTF 設計了許多不同但有趣的賽制,尤其是 Attack & Defense 的賽制,到現在依然被大部分的 A&D 比賽給沿用

2013~2015

這三年的 final 賽制都是 Attack & Defense,但有應對參賽隊伍想的各種奇技淫巧而對規則做調整,基本規則如下:

  1. 每個參賽隊伍有一台或多台 server,上面會跑很多個 service,要同時攻擊其他人的 service,並對自己的 service 進行防禦
    • 防禦只能針對 service 本身,最一開始是希望大家只能用 binary patch,但後來大家發明各種通用防禦技巧,LD_PRELOAD、IO wrapper、sandbox,最後甚至連 qemu 都搬出來.....
    • 也因為這樣後來 A&D 的規則需要對防禦做出大量限制,避免造成易守難攻的情況
  2. 每回合主辦方會用 root 身分更換 server 上的 service flag,service flag 每回合都會變動,一回合是 5 min,在結束前一小時會變成 2.5 min,拿到每回合的 flag 送到 scoreboard 就可以獲得 (回合分數/攻擊成功隊伍數),被拿走 flag 的隊伍扣除回合分數
  3. 主辦方會針對 service 的狀態進行 service check,確認題目正常運作,如果無法通過 service check 需要扣除回合分數
    • 如果被攻擊又無法通過 service check,會扣除雙倍的分數...XD

2013 和 2014 年都是由 PPP 奪冠,2015 韓國聯隊 DEFKOR 在天才駭客 lokihardt 的帶領之下,成功打倒 PPP 獲得冠軍,之後有空再來寫這件事 XD

2016

2016 年與 DARPA 舉辦的 Cyber Grand Challenge 一同進行,讓人類與電腦進行攻防對決,除了從種子賽和 Quals 入圍的隊伍以外,還多了一隊 CGC 冠軍的 AI 隊伍

2016 由 PPP 奪回冠軍,HITCON 獲得第四,我這年缺席沒參加 T___T

2017

在 2016 比完 LegitBS 就宣布要自己搞一個指令集作為明年的題目,但一直到比賽開始之前都沒有公布相關訊息,讓我們一度懷疑是不是做不出來要出包了...XD 結果在比賽前一天才公布 cLEMENCy 的 spec,讓三天的 CTF 比賽直接變四天.....QQ 逼前一天大家開始黑客松趕工處理 cLEMENCy 的工具

cLEMENCy 有一些很煩人的 feature ...

  • 重新定義 1 byte = 9 bit,但我們的電腦還是 8 bit ... XD 也就是說如果要用我們的電腦處理 cLEMENCy 的題目,要將所有 stream 從 8 bit 轉為 9 bit 才能夠操作 XD

  • 一個 register 操作的 data 為 27 bit,以 middle-endien 儲存,沒聽過 middle-endien ? 正常,因為是 cLEMENCy 自行定義...

    Each byte is 9 bits of data, bit 0 is the left most significant bit. Middle-Endian data stores bits 9 to 17, followed by bits 0 to 8, then bits 18 to 27 in memory when handling three bytes. Two bytes of data will have bits 9-17 then bits 0 to 8 written to memory.

  • 如果對 cLEMENCy 的指令集有興趣的可以參考這份 82 頁的 pdf:https://2017.notmalware.ru/89dc90a0ffc5dd90ea68a7aece686544/clemency-201707271159.pdf

2017 還是由 PPP 獲得冠軍.....QQ HITCON 亞軍,中國聯隊 A0E 獲得季軍,DEFKOR 失去 lokihardt 的帶領之後獲得第四

2018 ~ 2019

2018 年開始改由 OOO 主辦 DEF CON CTF,賽制改成 A&D 和 KoH 混合的賽制,但 A&D 變成只能透過主辦方的網頁進行防禦,而網路架構也徹底切開,讓以前 A&D 會偷塞 backdoor 之類的玩法沒辦法使用,雖然說讓大家更專注於題目本身的競賽上,但也少了很多樂趣 QQ

2018 年的比賽必須說是一場災難....XD 由於 OOO 初辦比賽缺乏經驗,許多 infrastructure 在比賽中都發生問題,像是:會場網路、score board、patch system 之類的....,當年將參賽隊伍數量提高到 25 隊也造成 loading 出乎主辦方的預期

但 2019 年就回歸正常,雖然在 A&D 的設計上還是有些小瑕疵,但題目難度和品質已經可以稱得上是 DEF CON CTF 的水準,讓我們一同期待明年的 DEF CON CTF (?)

0x0c: DEF CON 22 CTF Quals HJ 4 Sick

這題是 2014 年 DEF CON CTF Quals HITCON 戰隊能擠進 Final 的關鍵,當時離快結束時我們還在 20 名之外,一直到快結束之前這題被放出來,我們在倒數前一小時集結全隊之力解出了這題,最後以 28 分、第 12 名的成績進入決賽 (沒錯,標題的 4 指的是 4 分,這場比賽題目的分數只有 1~5 分)


題目一開始給了兩個檔案,一個是 public key pub.pem,另一個是 raw binary comeandgetme.enc,pub.pem 的內容如下:

-----BEGIN PUBLIC KEY-----
MEEwDQYJKoZIhvcNAQEBBQADMAAwLQImC1+CPNtJhcI2UiY7iabqbVRDkz0le0uq
dgc87QWlj7qE+QS9LTcCAwEAAQ==
-----END PUBLIC KEY-----

顯然是個很短的 key,用 openssl 觀察後可以得知是個只有 308 bit RSA public key,經過一陣努力之後,可以透過 yafu 爆出 p 和 q,再計算出 d 之後就可以解密 comeandgetme.enc,過濾掉一些不重要的訊息之後得到了短網址,網址提供了一個 mp3 給我們下載

聽了 15 分鐘的英文之後,發現 mp3 的最後一段有雜訊,經過一番猜測後,得到粗的是 0,細的是 1,把 bit 轉回 ascii binary 之後是一串的 printable 字串:

7rKM^ATVEq+D>k=E-"&n06:]FG%kGtF"T4%0f1M(BOP^nG@b0@<l9o@4lD.04o$/B4!SU@:j+-AM@XR2e"R&3A<-q2E#,&2)[EQAS,O_AnE/oDIal'FEDJC3\N.-ATDs.@qB^61,(F>/ot]7Ci"<,E,8s.@:s"$D.PA3D.R'01LsuL2E*EJ3&3KN0K1gK1b^jsA2lJ%3FOa!0On`

這一串看起來像亂碼的字串可以用 ascii85 decode,會得到兩個 url:

後面的 hash 看起來有少,我們假設他是 32 byte 嘗試進行 brute force,完整的 url 會是 http://services.2014.shallweplayaga.me/eme_23dc0673382940749407ad8619a410cc

下載檔案之後得到一個 elf,從檔案內的字串推測是拿來 encrypt flag 的工具,逆向完可以知道加密規則是以 4 byte 為單位的 block cipher,而且是 ECB 模式,前後 block 不會互相影響加密結果,也發現如果將 The flag is: 丟進 binary 加密後跟加密後的 flag 前 8 byte 相同,證實我們的想法正確

在評估加密的執行速度之後,我們認為可以用 brute force 來得到原本的 flag,將所有 4 byte 的字元組合都丟進 binary 進行加密,再比對哪些出現在加密後的 flag 裡面,這樣就知道原本加密前的 flag 是什麼,得到了類似以下內容:

['fa\xb2\xc0'] The
['K\x16\xf4\x11'] flag
['\n-2F'] is:
['\xd9\xcb\x8d\x9d'] I h
['k\x88rP'] ope
['\xe4\x83w\r'] that
['\xe5\xb1\xd8\x14'] did
['\xc22H\x02'] n't
['T\xa1\xa4\x92'] suck
['abW\x95'] too
['5\x94\x13\x92'] muc
['[\x0f\x84\xaa']

由於產生字典檔時把忽略了 null byte 導致最後一個 block 沒成功找到配對的明文,但可以腦補一下直接猜 flag 是 I hope that didn't suck too much.,最後成功得到 4 分擠進 DEF CON 22 final,並於第一次參賽就獲得第二名的佳績......一直也是到現在最佳名次 T___T


上一篇
Day12: [Pwn] HITCON CTF
下一篇
Day14: [Reverse] PPP & Plaid CTF
系列文
CTF 的三十道陰影31

尚未有邦友留言

立即登入留言