CTF,全名為 Capture the flag,直翻的話就是「奪旗」,是一種考驗資安技術的比賽。雖然說是比賽,但我更喜歡當作是一款線上遊戲在玩就是了(因為許多元素真的滿類似的)。

這個名為 CTF 的比賽誰都可以舉辦,你可以,我可以,獨眼龍也可以。基本上也是任何人都可以參加,沒有三百萬美金也可以。

那這個比賽比的是什麼?畢竟名字叫做奪旗嘛,就是要想辦法拿到這個「旗子」,那要怎麼拿到呢?這就有不同的方式了,先講最簡單的一種。例如說題目會給你一個網站的連結,跟你說旗子藏在網站主機的根目錄,你只要找到漏洞並且駭入這個網站,就可以拿到旗子了。

而這個「旗子」通常是一串文字,例如說 CTF{I_am_Flag} 之類的東西,把這串文字輸入到比賽網站後就可以拿到相對應的分數,這就是奪旗。

決定勝負的方式很簡單,跟籃球一樣,分數多的贏。如果一樣多,沒有延長賽可以打,而是看誰先到達那個分數。

可以注意到上面的記分板中有五個分類,代表的是不同種類的題目,每個分類的意義如下:

  1. misc:不能分在其他幾類的都分在這,有可能把 flag 藏在音檔或圖片裡面要你找出來,也有可能要你還原一個壞掉的 QRcode 等等,題目五花八門千奇百怪
  2. web:就是剛剛的舉例,給你一個網站要你找到漏洞
  3. pwn:給你一個 binary 的檔案要找到漏洞
  4. reverse:逆向工程,只給你執行檔,你要試著逆向以後還原邏輯
  5. crypto:密碼學相關題目,例如說給你加密過的檔案跟一些線索,你要還原出明文等等

(這個分類並不是固定的,有些比賽會分出其他類別,例如說數位鑑識 forensic 或是區塊鏈 blockchain 等等)

有沒有覺得滿像線上遊戲的,還有分不同的職業可以選擇。

大多數玩家都是偏向某一個類別很強,但也有玩家是每個類別都強的。而且類別裡面的題目其實也超級廣,以 Web 來說光是不同程式語言就有不同的點可以考,JavaScript 跟 PHP 需要注意的點就滿不一樣,題目類別有些是考 server side 的漏洞,有些是考 client side 的,簡單來說就是廣到爆炸。

玩家有了,職業也有了,再來還缺什麼?沒錯,就是公會。

大多數 CTF 都是組隊參加的,以線上遊戲來比喻的話就是公會了。前面有提過 CTF 比賽任何人都可以舉辦,而這些比賽通常會註冊在一個叫做 CTF Time 的非官方網站(畢竟這不是一個真正的線上遊戲,沒有所謂的「官方」,等等,那乾脆叫它「去中心化線上遊戲」好了,潮度++)。

每一場比賽都會有權重,透過一個統一的計算公式,可以算出每一支參賽隊伍在該比賽的得分,而這些得分就會顯示在這個網站上。每支隊伍取成績最好的前十場比賽加總,就會得到一個照總分來排名的排行榜。

可以把上圖理解為「全伺服器前十大公會」這種感覺,是不是越來越像線上遊戲了?

CTF 的主力玩家應該是學生,因為學生時間比較多而且剛接觸比較有熱情(?)。所以這個圈子裡很多人都超級年輕,甚至不少人在 20 歲以下,可能有點像電競圈的那種感覺?像我這種 29.5 歲的年紀算是滿老的了。

一場 CTF 比賽大多會進行 24~48 個小時,而且都在假日。有些重度玩家會打到天昏地暗,直接熬夜解題,但我年紀到了不太行,都是打到晚上十點十一點就去乖乖睡覺,隔天醒來看隊友花式 carry。

而很多公會也是以學校為單位的,例如說上圖中第十名的 Plaid Parliament of Pwning 就是 CMU 的隊伍。不過有些公會的分界也沒這麼明確啦,不一定真的都要是那個學校的人才可以加入。

除了這些學校戰隊以外,其實更多的是「以興趣為導向的公會」,也就是跟一般線上遊戲一樣,由志同道合的人所組成的。而且 CTF 這個遊戲預設就是沒有分伺服器的,全世界的人都在同一個伺服器遊玩,因此公會的成員通常也是來自世界各地(當然,你也可以因為溝通方便或是各種因素組一個地緣的公會)。

有些厲害的公會要加入還需要投履歷甚至是面試等等,而有些較為稀缺的職業則是熱門的招募對象,以線上遊戲來說就是「缺補缺範圍缺坦」之類的,像是密碼學就是一個相對稀缺的職業。

而且許多公會都會弄一個自己的形象網站,裡面放著公會以前的戰績或是成員名單等等,藉此試著招募到更多志同道合的人。

當然,你也可以跟桐人一樣當個 solo player,不進任何的公會。現實生活中也有一個像桐人般開掛的人物存在,叫做 geohot,曾經破解過 iOS 跟 PS3,單槍匹馬參加 CTF 還打贏一堆戰隊,更多事蹟可以參考:CTF 的三十道陰影 — Day11: [Pwn] Tom Cruise of CTF

我一開始就是個 solo player,後來才被找進公會裡面。自己一個人打跟一群人一起打的感覺差很多,有人可以討論除了能夠互相切磋進步以外,也可以一起卡關一起崩潰,感覺真好。

CTF 對於公會的唯一限制就是一場比賽你只能選擇一支隊伍,不能同時橫跨兩個隊伍不然就算是作弊了。而我自己目前在兩個國際公會裡面,可以邊玩 CTF 邊練英文,聽起來很不錯對吧?雖然文法沒什麼進步,英文簡寫倒是學了不少。

如果你是 solo 玩家想進入公會的話,通常每個比賽都會用 Discord 頻道進行交流,有些會特別開一個招攬人才的 channel,可以在那邊逛逛,看一下有沒有自己喜歡的公會。

若是你想要讓公會自己來找你,還有一個方法就是想辦法增加能見度跟知名度,讓公會看到你。

在這個圈子裡面,所謂的辦法指的就是:

  1. 解開別人解不開的題目(難題)
  2. 寫 writeup

許多人去餐廳吃完飯不一定會寫 Google 評論,買完東西除非有優惠不然不會給評價,去旅遊也不會寫遊記,平時也不會寫技術文章;但是身為一個 CTF 玩家,大多數的人都會寫解題的心得筆記,稱之為 writeup(或是 write-up 或是乾脆簡寫成 wu 或 wp)

這是我自己滿喜歡 CTF 的一點,因為可以從其他玩家的 writeup 裡面學到一大堆新的技巧跟想法。像我自己的話因為本來就很愛寫東西,所以也是有空的話就會寫寫解題心得,最近一兩年部落格一大堆文章:

以前剛開始的時候其實都寫英文的,畢竟這個圈子是國際性的,英文還是能見度最高的語言:

除了為了自我的成長跟學習寫心得以外,許多比賽會要求前幾名的戰隊提交解題心得,以此證明真的有把題目解開。而有些比賽甚至會舉辦心得會外賽,只要心得寫得好,一樣能拿獎金。

我去年有為了 Google CTF 認真寫了一篇心得去投稿:Insecure Deserialization in JavaScript: GoogleCTF 2022 Web/HORKOS Writeup,最後拿到了 200 美金的獎金以及很有質感的紀念品:

講到錢錢,CTF 的比賽是有獎金跟獎品的,越大的公司辦的比賽獎品越好。以 Google CTF 2022 來說,第一名有大約台幣 40 萬,第二名 20 萬,第三名 10 萬。

LINE CTF 2023 前三名也依序有台幣 15 萬、10 萬跟 6 萬。

不過這些錢雖然看起來很多,但戰隊人數也不少(少則 10 人起跳,多可以多到 30 人甚至是 50 人或更多),分下來也沒有多少錢。而且比起分下來,更多的做法是作為戰隊基金,贊助之後出國比賽的費用。

有些 CTF 比賽都是跟隨著資安研討會一起舉辦的,而這些比賽通常都會有預賽,取前幾名進入決賽,才是正式拿到了 on-site 參加比賽的門票。

講到出國比賽,就不得不提 CTF 圈中的重頭戲:DEF CON CTF。

DEF CON 是一個每年都會在美國舉辦的資安研討會,許多最新的攻擊手法都會在那邊發表,而 DEF CON CTF 是其中的一個活動,也可以視為是 CTF 比賽中的最高殿堂。

有聽過資訊奧林匹亞競賽或是數學奧林匹亞競賽嗎?把 DEF CON CTF 想成是每年一度的 CTF 奧林匹亞競賽就對了,差不多是那種感覺。

不過雖然聽起來很盛大,但主辦單位還是民間團體,所以只會贊助基本的住宿(而且有限人數,我記得是 8 個),機票要自己負責。

因此有些戰隊就會把打比賽拿來的獎金存著當作公積金,贊助戰隊成員出國比賽,或有些戰隊會找贊助商來贊助,例如說台灣每年都會有至少一隊出去比賽,由政府單位以及其他公司贊助(延伸閱讀:DEF CON CTF資格賽,臺灣聯隊攜手獲得第二名,八月進軍賭城實體較勁

DEF CON CTF 的比賽方式也不是我開頭講的那種,而是另一種叫做 Attack & Defense 的玩法,除了攻擊別人以外,你也要修復自己的服務,把漏洞修掉。這個模式更有競賽的感覺而且戰況瞬息萬變,除了考驗找出漏洞的能力以外,也更考驗選手們自行準備的 infrastructure。

我去年有幸參加了 DEF CON CTF,有寫了幾篇心得,結論是我好像想的太盛大了,實際參與就覺得有點失望,更詳細的心得可以參考這篇:DEF CON 30 CTF final 遊記(中)

比起 CTF Time 的排行榜,各個戰隊最想拿到的應該還是 DEF CON CTF 的冠軍。

喔對了,因為 DEF CON CTF 決賽只取預賽的前十六名參加,機會很少,再加上每個隊伍都想要盡可能增加競爭力,所以最近一兩年 CTF 圈開始吹起了抱團的風氣。

下圖是 2022 年參賽隊伍的組成,紅色是最後的隊伍名稱,藍色跟綠色是隊伍的組成:

像左下角的 Balsn.217@TSJ.tw,就是由 217 + Balsn + HITCON + TSJ 這四個隊伍組成,而 TSJ 又是由另外五支隊伍組成,可以說是全部台灣的隊伍都組成一隊來打 DEF CON CTF 了。而其他隊伍也不遑多讓,基本上都是由好幾個戰隊組成。

今年的話也有聽到各種風聲,許多小隊伍合併成一個大團,試圖增加自己的競爭力,才有能力與那些傳統老牌戰隊一決高下。預賽即將在五月底開打,到時候就可以知道有多少戰隊併在一塊了。

每個人看待 CTF 的方式都不同,有些人很認真當作一個比賽在對待,就算是熬夜通宵也要解出題目;有些人把 CTF 當成是一種學習資安技術的方式;也有些人覺得 CTF 中的題目與現實脫節,還是去找真的漏洞比較實在,不想花時間在 CTF 上面。

而我的話是把 CTF 當成是一款遊戲在玩,別人玩薩爾達王國之淚,我玩 CTF,為什麼呢?因為我還在國外旅遊所以沒時間玩王國之淚,等我回台灣就會立刻買來玩了。

我自己是把 CTF 當成遊戲,抱持著一種比較輕鬆的方式去看待勝負,壓力會小很多,碰到不喜歡或是胃口不對的題目就先跳關,先選自己喜歡的來解。而有時候雖然也會玩到深夜,但並不是因為想要拿冠軍,而是因為想把題目解出來,覺得自己真的很接近了,殊不知這也是人生四大錯覺之一,這個接近就跟「再五分鐘就到了」一樣,有好多個五分鐘。

而且這樣的態度或許也能讓自己的電競生涯持續更久一點,畢竟有很多人都是工作或家庭忙了,就開始慢慢淡出這個圈子,或更多的其實是畢業以後就慢慢不玩了。當作遊戲在玩代表玩了是會開心的,是會感到放鬆的,應該就能細水長流。

話說比起 CTF 競賽本身,我更喜歡的是這整個生態系,可以透過 CTF 找到許多志同道合的朋友。例如說前端安全,這個偏冷門的領域就可以在 CTF 圈中找到幾個同好,都研究著類似的議題。

我也喜歡這整個文化,大多數人都會分享自己的解題心得,大家可以一起討論有沒有更好的解法,教學相長。同時也能讓自己的眼界更為開闊,許多攻擊手法都令人歎為觀止,從沒想過還可以這樣用。

而有時候也會有額外的好處,例如說當你進了知名的戰隊以後,許多隊友其實都已經在資安公司工作,有機會獲得相關的工作機會以及推薦,就算最後沒有合作機會,至少也多出了許多人脈。

以上就是我接觸 CTF 這兩年以來的心得。

如果你有資安基礎又對 CTF 有興趣,可以先問問看自己學校有沒有相關的資源。若是沒有或者你根本不是學生的話,可以考慮先自己打個一陣子,同時在 Discord 群組裡面找找看有沒有相關的戰隊可以加入。

如果你不是技術背景,但看了文章以後對 CTF 很感興趣,可以參考這一系列的文章,作者的經驗比我豐富,文章也寫得比我精彩,寫了很多有趣的 CTF 故事:CTF 的三十道陰影

也可以留言在文章底下,告訴我你對哪些細節有興趣想知道更多,或是有哪些想問的問題。